Hike News
Hike News

继承和组合、单例类及不可变类

继承和组合、单例类及不可变类继承 inheritance:继承是实现类复用的重要手段,所谓复用,就是可以多次使用,或者再次利用,不用继续重写成员变量和方法。但不代表没有缺点,最不好的地方:破坏封装。子类拓展父类时,若访问权限允许,则可直接访问父类的成员变量和方法,破坏了良好的封装性(Encapsulation) ,造成子类与父类的耦合。

阅读全文

String与BigDecimal基础类

String与BigDecimal

String, StringBuffer and StringBuilder

string有11种构造方法

1. 可变性

  • String不可变
  • StringBuffer 和 StringBuilder 可变

在 Java 9 之后,String 类的实现改用 byte 数组存储字符串,同时使用 coder 来标识使用了哪种编码。

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence &#123;
    /** The value is used for character storage. */
    private final byte[] value;

    /** The identifier of the encoding used to encode the bytes in &#123;@code value&#125;. */
    private final byte coder;
&#125;

value 数组被声明为 final,这意味着 value 数组初始化之后就不能再引用其它数组。并且 String 内部没有改变 value 数组的方法,因此可以保证 String 不可变。

2. 线程安全

  • String 不可变,因此是线程安全的
  • StringBuilder 不是线程安全的
  • StringBuffer 是线程安全的,内部使用 synchronized 进行同步

String Pool

字符串常量池(String Pool)保存着所有字符串字面量(literal strings),这些字面量在编译时期就确定。不仅如此,还可以使用 String 的 intern() 方法在运行过程将字符串添加到 String Pool 中。

当一个字符串调用 intern() 方法时,如果 String Pool 中已经存在一个字符串和该字符串值相等(使用 equals() 方法进行确定),那么就会返回 String Pool 中字符串的引用;否则,就会在 String Pool 中添加一个新的字符串,并返回这个新字符串的引用。

下面示例中,s1 和 s2 采用 new String() 的方式新建了两个不同字符串,而 s3 和 s4 是通过 s1.intern() 方法取得同一个字符串引用。intern() 首先把 s1 引用的字符串放到 String Pool 中,然后返回这个字符串引用。因此 s3 和 s4 引用的是同一个字符串。

String s1 = new String("aaa");
String s2 = new String("aaa");
System.out.println(s1 == s2);           // false
String s3 = s1.intern();
String s4 = s1.intern();
System.out.println(s3 == s4);           // true

如果是采用 “bbb” 这种字面量的形式创建字符串,会自动地将字符串放入 String Pool 中。

String s5 = "bbb";
String s6 = "bbb";
System.out.println(s5 == s6);  // true

在 Java 7 之前,String Pool 被放在运行时常量池中,它属于永久代。而在 Java 7,String Pool 被移到堆中。这是因为永久代的空间有限,在大量使用字符串的场景下会导致 OutOfMemoryError 错误。

new String(“abc”)

使用这种方式一共会创建两个字符串对象(前提是 String Pool 中还没有 “abc” 字符串对象)。

  • “abc” 属于字符串字面量,因此编译时期会在 String Pool 中创建一个字符串对象,指向这个 “abc” 字符串字面量;
  • 而使用 new 的方式会在堆中创建一个字符串对象。

创建一个测试类,其 main 方法中使用这种方式来创建字符串对象。

public class NewStringTest &#123;
    public static void main(String[] args) &#123;
        String s = new String("abc");
    &#125;
&#125;

使用 javap -verbose 进行反编译,得到以下内容:

// ...
Constant pool:
// ...
   #2 = Class              #18            // java/lang/String
   #3 = String             #19            // abc
// ...
  #18 = Utf8               java/lang/String
  #19 = Utf8               abc
// ...

  public static void main(java.lang.String[]);
    descriptor: ([Ljava/lang/String;)V
    flags: ACC_PUBLIC, ACC_STATIC
    Code:
      stack=3, locals=2, args_size=1
         0: new           #2                  // class java/lang/String
         3: dup
         4: ldc           #3                  // String abc
         6: invokespecial #4                  // Method java/lang/String."<init>":(Ljava/lang/String;)V
         9: astore_1
// ...

在 Constant Pool 中,#19 存储这字符串字面量 “abc”,#3 是 String Pool 的字符串对象,它指向 #19 这个字符串字面量。在 main 方法中,0: 行使用 new #2 在堆中创建一个字符串对象,并且使用 ldc #3 将 String Pool 中的字符串对象作为 String 构造函数的参数。

以下是 String 构造函数的源码,可以看到,在将一个字符串对象作为另一个字符串对象的构造函数参数时,并不会完全复制 value 数组内容,而是都会指向同一个 value 数组。

public String(String original) &#123;
    this.value = original.value;
    this.hash = original.hash;
&#125;

BigDecimal

Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数。在实际应用中,需要对更大或者更小的数进行运算和处理。float和double只能用来做科学计算或者是工程计算,在商业计算中要用java.math.BigDecimal。BigDecimal所创建的是对象,我们不能使用传统的+、-、*、/等算术运算符直接对其对象进行数学运算,而必须调用其相对应的方法。方法中的参数也必须是BigDecimal的对象。构造器是类的特殊方法,专门用来创建对象,特别是带有参数的对象。

BigDecimal一共有4个构造方法:

BigDecimal(int) 创建一个具有参数所指定整数值的对象。

BigDecimal(double) 创建一个具有参数所指定双精度值的对象。(不建议采用)

BigDecimal(long) 创建一个具有参数所指定长整数值的对象。

BigDecimal(String) 创建一个具有参数所指定以字符串表示的数值的对象

这里不建议采用第二种,原因:

1、参数类型为double的构造方法的结果有一定的不可预知性。有人可能认为在Java中写入 newBigDecimal(0.1)所创建的BigDecimal正好等于 0.1,但是它实际上等于0.1000000000000000055511151。这是因为0.1无法准确地表示为 double(或者说对于该情况,不能表示为任何有限长度的二进制小数)。这样,传入到构造方法的值不会正好等于 0.1(虽然表面上等于该值)。

2、另一方面,String 构造方法是完全可预知的:写入 newBigDecimal(“0.1”) 将创建一个 BigDecimal,它正好等于预期的 0.1。因此,比较而言,通常建议优先使用String构造方法 。

BigDecimal a = new BigDecimal("2.3");

当double必须用作BigDecimal的源时,请使用Double.toString(double)转成String,然后使用String构造方法,或使用BigDecimal的静态方法valueOf,如下:

BigDecimal a = new BigDecimal.valueOf(Double.toString(2.3));

对于常用的加,减,乘,除,BigDecimal类提供了相应的成员方法

public BigDecimal add(BigDecimal value); //加法
public BigDecimal subtract(BigDecimal value); //减法 
public BigDecimal multiply(BigDecimal value); //乘法
public BigDecimal divide(BigDecimal value); //除法

总结:

  1. 在需要精确的小数计算时再使用BigDecimal,BigDecimal的性能比double和float差,在处理庞大,复杂的运算时尤为明显。故一般精度的计算没必要使用BigDecimal。
  2. 尽量使用参数类型为String的构造函数。
  3. BigDecimal都是不可变的(immutable)的, 在进行每一次四则运算时,都会产生一个新的对象 ,所以在做加减乘除运算时要记得要保存操作后的值。

Java的异常、多态要点及抽象类和接口

一、java异常如下图,异常分为两类,错误和异常;异常分为运行异常和可查异常。这里主要掌握异常,因为平时会见的比较多。Exception类在java.lang包下,它是Throwable的子类,同样的Error类也是其子类。Error 用来指示运行时环境发生的错误,例如:JVM 内存溢出。一般地,程序不会从错误中恢复。异常类有两个主要的子类:IOException 类和 RuntimeException 类。

阅读全文

Hexo-matery主题代码高亮和部署问题

本篇的内容很简单,就是说说这个主题的两个问题。一个是代码高亮失效的问题,另一个是hexo deploy部署问题。

代码高亮失效

如果大家用的是hexo-prism-plugin代码高亮插件,那就可能遇到这样的问题。该插件的作者在github issue上讨论过,几年前的事。

github issue
解决的办法是安装hexo-inject,进入到博客项目目录,命令行输入:

npm i hexo-inject -s

同样在matery.css文件下查找body样式,如下:

body &#123;
    cursor: url(./cursor.ico),auto;
    background: linear-gradient(60deg, rgba(255, 165, 150, 0.5) 5%, rgba(0, 228, 255, 0.35) );
    margin: 0;
    color: #7F95D1;
&#125;

如果不想要图片去掉即可

hexo博客部署问题

其实它是个github上传错误,上传项目到github报错:Permission to xxx/xxx.git denied to xxxxxxx.。出现这个问题是因为git权限问题,有两个或多个git账户,git退出后保留上次git 账户信息。

解决一:重新设置博客仓库账户为全局
git config --global user.name 博客本地用户名
解决二:输入github账户密码获取权限去提交
git push -u xxx master

公众号:菜鸡干Java

hexo-matery主题美化(四)

hexo-matery主题美化(四)

目录:

前言

去掉banner的颜色动画

添加背景壁纸

修改滑动条

修改导航栏、页脚及文章卡片标签的颜色

修改目录样式

前言:

这是最后一篇关于hexo-matery博客美化的文章了,大部分都是前端的东西,所以没啥好讲的,对我来说后端更侧重一点,这些天都没怎么写Java代码了。离前一篇博客美化文章已过去一个星期了,因为我回了趟老家,住了一个星期,心里感觉很复杂。我本身技术并不是很强,每天都要实实在在的学习知识,家里条件不好,以后的路真的难走!加油吧!

一、去掉banner的颜色动画

有的同学可能不喜欢banner的颜色遮罩,特别是在banner图片的颜色和动画颜色一样时,表现不出图片的美观。去掉后放一张高清小姐姐大图,博客访问量一下迅速爆炸!听我的准没错,那如何去掉这个烦人的彩色动画呢?跟着我:在theme主题目录下,找到matery.css文件,ctrl+F快捷键查找.bg-cover:after,注释掉即可。

/* .bg-cover:after &#123;
    -webkit-animation: rainbow 60s infinite;
    animation: rainbow 60s infinite;
&#125; */
二、添加背景壁纸

同样在matery.css文件下查找body样式,修改如下:

body &#123;
    /* background-color: #eaeaea; */
    background: linear-gradient(60deg, rgba(255, 165, 150, 0.5) 5%, rgba(0, 228, 255, 0.35) ) 0% 0% /     cover, url("https://x.png"), url("https://x.jpg") 0px 0px;
    background-attachment: fixed;
    margin: 0;
    color: #7F95D1;
&#125;

如果不想要图片,去掉即可,比如:

body &#123;
    cursor:url(/cursor.svg),auto;
    background: linear-gradient(60deg, rgba(255, 165, 150, 0.5) 5%, rgba(0, 228, 255, 0.35) );
    margin: 0;
    color: #34495e;
&#125;
三、修改滑动条(没试过,好像没用)

说是说修改滑动条,但是不需要太麻烦,在matery.css中添加样式即可:

/* 滚动条 */
::-webkit-scrollbar-thumb &#123;
    background-color: #FF2A68;
    background-image: -webkit-linear-gradient(45deg,rgba(255,255,255,.4) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.4) 50%,rgba(255,255,255,.4) 75%,transparent 75%,transparent);
    border-radius: 3em;
&#125;
::-webkit-scrollbar-track &#123;
    background-color: #ffcacaff;
    border-radius: 3em;
&#125;
::-webkit-scrollbar &#123;
    width: 8px;
    height: 15px;
&#125;
四、修改导航栏、页脚及文章卡片标签的颜色

同样的操作,在matery.css中找到.bg-color,修改即可:

.bg-color &#123;
    background-image: 
    linear-gradient(to right, #3f1b07 0%, #3f1b07 100%);/*咖啡色*/
&#125;
五、修改目录样式(没试过)

themes\Matery\layout\_partial\post-detail-toc.ejs,在这里修改:

.toc-widget &#123;
    width: 345px;
    padding-left: 20px;
    background-color: rgb(255, 255, 255,0.7);
    border-radius: 10px;
    box-shadow: 0 10px 35px 2px rgba(0, 0, 0, .15), 0 5px 15px rgba(0, 0, 0, .07), 0 2px 5px -5px rgba(0, 0, 0, .1) !important;
    &#125;

新sakura博客园皮肤配置,NewSakura

CNblogs-Theme-NewSakura

  • 基于Sakura美化方案改造的博客园样式:NewSakura
  • 如使用了本样式,请给个Star。

项目结构

CNblogs-Theme-NewSakura
|
├─ CNblogs-Theme-NewSakura
│    ├─ foot.html 页脚代码
│    ├─ main.css 自定义css代码
│    ├─ main.js  引用js
│    └─ sidebar.html 侧边栏代码
├─ README.md
└─ img
       ├─ 效果1.JPG
       └─ 效果2.JPG

有js权限,期间将侧边栏、页脚和css代码粘贴进博客园设置内即可!代码文件内有相应注释,根据它修改即可。

功能简介

依次分重点:

  • 新增暗黑白昼模式,白天暗黑刺激
  • 首页及随笔页头图随机切换
  • 音乐播放器,使用Aplayer插件
  • 看板娘,原先的主题已失效,现已修改
  • 自动生成文章目录,基本功能
  • 导航菜单子目录,照葫芦画瓢添加
  • 图片灯箱、滚动进度条
  • 文章打赏
  • 鼠标点击粒子效果
  • 其他网站链接,非必需
  • 将首页底部不必要的滚动条去掉
  • 修改了文章评论区的框框大小,原先的过大变形
  • 暗黑白昼切换不影响评论区,暗黑字白,白昼字黑
  • 修改了分类页面样式,为了在暗黑后看的清楚美观

注意:目前Sakura还不支持响应式,所以还需大家帮忙喽!

主题预览

效果1
效果2

主题部署

快速搭建出与本博客一样的样式, 请看下面这句说明,当然前提是得有js权限

部署和本博客一样的主题,请直接下载整个主题,对应的改下文件链接地址 ,把css侧边栏页脚代码粘贴的你的博客后台就行。为了个性化定制,如果你想个性化定制博客,请往下看基本部署。

基本部署

  • 前提:已经开通js权限

  • 设置皮肤选择自定义custom

  • 引入样式
    main.css中的代码粘贴到自定义css中,无需个性化操作

  • 引入文件
    放在侧边栏html文件中,本人已为你添加。建议下载该文件并上传博客园,之后只需修改样式引入即可!

    <script src="https://blog-static.cnblogs.com/files/coderma/main.js"></script>
  • 顶部菜单设置

    将以下链接替换成自己随笔地址,以下代码在main.js中,建议打开该文件查看并修改

    $("#navList").append('<li><a id="blog_nav_myyoulian" class="menu"href="https://www.cnblogs.com/coderma/p/1117239.html">友链</a><i></i></li><li><a id="blog_nav_myzanshang" class="menu" href="https://www.cnblogs.com/coderma/p/1133477.html">赞赏</a><i></i></li><li><a id="blog_nav_myguanyu" class="menu" href="">关于</a></li>');
  • 菜单icon设置
    就是菜单前的小图标,感兴趣的可以去了解一下Font awesome

              //博客title
              //去掉rss替换成分类
              $('#blog_nav_rss').replaceWith('<a id="blog_nav_fenlei" class="menu" href="https://www.cnblogs.com/coderma/p/13458241.html" target="_self">分类</a>');  //可替换以下链接
              $("#navList").append('<li><a id="blog_nav_myyoulian" class="menu" href="https://www.cnblogs.com/coderma/p/13413494.html" target="_self">友链</a><i></i></li><li><a id="blog_nav_myarchive" class="menu" href="https://www.cnblogs.com/coderma/p/13414527.html" target="_self">归档</a><i></i></li><li><a id="blog_nav_myguanyu" class="menu" >关于</a></li>');
              //添加标签图标
              $('#blog_nav_sitehome').prepend('<i class="fa fa-fort-awesome" aria-hidden="true"></i>');   //博客园
              $('#blog_nav_myhome').prepend('<i class="fa fa-home" aria-hidden="true"></i>');                //首页
              $('#blog_nav_newpost').prepend('<i class="fa fa-edit" aria-hidden="true"></i>');            //新随笔
              $('#blog_nav_contact').prepend('<i class="fa fa-address-book-o" aria-hidden="true"></i>');    //联系
              $('#blog_nav_fenlei').prepend('<i class="fa fa-filter" aria-hidden="true"></i>');            //分类
              $('#blog_nav_admin').prepend('<i class="fa fa-cog" aria-hidden="true"></i>');                //管理
              $('#blog_nav_myyoulian').prepend('<i class="fa fa-link" aria-hidden="true"></i>');            //友链
              $('#blog_nav_myarchive').prepend('<i class="fa fa-archive" aria-hidden="true"></i>');        //赞赏
              $('#blog_nav_myguanyu').prepend('<i class="fa fa-universal-access" aria-hidden="true"></i>');//关于
              //添加li内嵌ui
    
  • 菜单子目录设置

    菜单子目录,在关于菜单下添加了子目录,相应的样式可自行修改添加

      let guanyu = '<ul class="sub-menu">' +
          '<li><a href=" " target="_self"><i class="fa fa-user-o" aria-hidden="true"></i>博主</a></li>' +   //添加关于文章链接
          '<li><a id="blog_nav_theme" onclick="changeTheme();" ><i class="iconfont icon-taohua" aria-hidden="true"></i> 主题</a></li>' +  //主题/暗黑白昼模式
          '</ul>';
      $('#blog_nav_myguanyu').after(guanyu);
  • 脚本设置

    为了配置方便,我在侧边栏里设置了一些常用参数,可根据下表选择需要开启和配置

    <script type="text/javascript"> 
      $.silence({
          profile: {
              enable: true,
              avatar: 'https://images.cnblogs.com/cnblogs_com/coderma/1820127/o_200803093536logo.png', //头像,可修改
              favicon: '',
              notice: '个人博客地址:https://index.maliaoblog.cn/  欢迎大家来踩'   //通知,可修改
          },
          catalog: {
              enable: true,
              move: true,
              index: true,
              level1: 'h2',
              level2: 'h3',
              level3: 'h4',
          },
          signature: {
              enable: true,
              home: 'https://www.cnblogs.com/coderma/',  //主页链接,可修改
              license: 'CC BY 4.0',
              link: 'https://creativecommons.org/licenses/by/4.0'
          },
          sponsor: {
              enable: true,
              paypal: null,
              wechat: '',  //赞助,可修改图片链接
              alipay: ''
          },
          github: {
              enable: false,
              color: '#fff',
              fill: '#FF85B8',
              link: 'https://github.com/coderxm'  //可修改
          },
        topImg: {
          homeTopImg: [
        "https://img2020.cnblogs.com/blog/2027366/202008/2027366-20200807133710823-1221571975.jpg",   //主页顶部图片,可修改
                      ],
                notHomeTopImg: [
        "https://img2020.cnblogs.com/blog/2027366/202008/2027366-20200807132804040-1889645361.jpg",  //可修改
                      ]
          },
        topInfo: {
              title: 'Hi,流浪舟',  //首页标题(可替换)
              text: "No one choose this life for me But I don't mind it",  //首页横幅语句
              github: "https://github.com/coderxm/",      //github(替换成相应链接)
              weibo: "",
              telegram: "",
              music: "",
              twitter: "",
              zhihu: "",
              mail: "",
          }       
      });
    </script>

    参数说明表:

    模块 属性 说明 类型 默认值
    profile(基础信息) enable 是否启用 Boolean true
    avatar 作者头像 String
    favicon 网站标题图标 String
    notice 公告 String 感谢使用该主题
    authorName 作者姓名 String coderxm
    catalog(博文目录) enable 是否启用 Boolean false
    move 是否允许拖拽 Boolean true
    index 是否显示索引 Boolean true
    level1 一级标题 String h2
    level2 二级标题 String h3
    level3 三级标题 String h4
    signature(博文签名) enable 是否启用 Boolean true
    home 作者主页 String https://www.cnblogs.com
    license 许可证名称 String CC BY 4.0
    link 许可证链接 String https://creativecommons.org/licenses/by/4.0
    sponsor(博文赞赏) enable 是否启用 Boolean false
    paypal PayPal 收款地址 String null
    alipay 支付宝收款二维码 String null
    wechat 微信收款二维码 String null
    github(GitHub Corners) enable 是否启用 Boolean false
    fill 背景填充色 String [Silence Theme Color]
    color 章鱼猫颜色 String #fff
    link Github 链接 String null
    topImg(头图) homeTopImg 首页头图 Array
    notHomeTopImg 文章和随笔页头图 Array
    topInfo(首页头图信息) titile 头部标题 String Hi, 流浪舟!
    text 横幅标题 String No one choose this life for me But I don’t mind it

配置完成后,记得点击「保存」按钮。

个性化定制

新增暗黑白昼模式

开始的时候是暗黑的,在关于下的子菜单栏内,点击主题可切换成白昼模式。

菜单新增分类、友链、博主、归档栏

原理简单,只需先新建随笔即可,并替换链接,点击便可跳转到相应页面。关于分类,去掉了过去的RSS,换成博客园已有的分类,同样的方法,将所有分类链接收录到某一随笔中即可,随笔链接即是分类栏链接。博主一栏写你的信息,归档类似,我相信这样的问题难不倒有大智慧的你!

首页及文章大图

首页和随笔以及文章页的头图都是随机切换的,添加图片在侧边栏html配置中。这里类型为随笔的时候头部会显示标题头像作者发布时间阅读数,而类型为文章的时候只会显示标题,根据情况选择类型发布。
请尽量选择像素1920*1080px的高清大图,这样的话首页图片会更适合。

随笔预览图

预览

在写随笔或者文章的时候添加摘要图片和摘要文字,摘要文字一定要添加,如果不添加摘要图片会给一张默认图片。

回顶部钩子

//回到顶部特效
    $('body').prepend(`<a href="#" class="cd-top faa-float animated cd-fade-out" target="_self"></a>`);
        let $win = $(window);
        let oldScrollY = 0;
        $win.scroll(function () &#123;
            oldScrollY = this.scrollY;
                let height = window.innerHeight;
            let top = '-' + (900 - height + 80) + 'px';
            if (oldScrollY > 0) &#123;
                 $('.cd-top').css('top', top);
            &#125; else 
                    $('.cd-top').css('top', '-900px');
            &#125;
        &#125;);

公告

公告内容修改在侧边栏基础信息配置中,修改notice,代码中已有提示

看板娘

我个人博客的看板娘是引用别人的,同一个,失效了会及时修复的!将以下代码添加到页脚,当然本人又已经为你添加好了,所以过程非常轻松!

  <script src="https://eqcn.ajz.miesnfu.com/wp-content/plugins/wp-3d-pony/live2dw/lib/L2Dwidget.min.js"></script>
  <script src="https://common.cnblogs.com/scripts/jquery-2.2.0.min.js"></script>

音乐播放器

相信看过我以前文章的同学对这个一定不会陌生,怎么获取id我也不在这里罗嗦了,可以去找我的文章,获取到id之后把下面的id替换掉就可以了!

<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/aplayer@1.10.0/dist/APlayer.min.css">
<script src="https://blog-static.cnblogs.com/files/zouwangblog/APlayer.min.js"></script>
<script src="https://unpkg.com/meting@1.2/dist/Meting.min.js"></script>
<div id="player" class="aplayer aplayer-withlist aplayer-fixed" data-id="7660234225" data-server="tencent" data-type="playlist" data-order="random" data-fixed="true" data-listfolded="true" data-theme="orangered"></div>
<!-- end -->

左上角的logo,修改文字需要到main.js里找到以下代码,替换文字即可,如果不喜欢可以注掉,我也觉得没啥好看,main.js里我已经删了!

    var title = '<div class="site-branding">' +
                    '<span class="logolink moe-mashiro">' +
                    '<ruby><span class="sakuraso">漂泊</span><span class="no">的</span><span class="shironeko">流浪舟</span>' +
                    '<rt class="chinese-font">漂泊的流浪舟</rt></ruby></a></span>' +
                    '</div>'
            $('body').prepend(title);

页面滚动进度条

页面滚动的时候会在顶部出现一个橙色的进度条,修改颜色到页面css里,找到以下代码修改background

.scrollCls {
    position: fixed;
    top: 0;
    height: 3px;
    background: orange;
    transiton-property: width,background;
    transition-duration: 1s,1s;
    z-index: 99999;
}

首页个人信息

  • 名称
    在侧边栏配置中修改topInfo里的title

  • 座右铭(横幅标题)
    在侧边栏配置中修改topInfo里的text

  • 其他网站链接(已注释,大都是推特等国外app,影响美观)
    在侧边栏配置中修改topInfo里对应的链接地址

写在最后

最近在博客园和皮肤厮混,发现没几个满意的!这让我追求精致的心受到了打击,最开始用的是这个,后来换了,不过换之前改进了一些!最总发现移动端不行,所以干脆把项目弄到github上,让大家看看!我把这个美化分享了出去,以我目前的前端技术改造这么个样式也很费劲的,毕竟不是专业做前端的!这是我在博客园的一篇美化文章了,博客还是有很多改进的,希望采用这个样式的你能够多多支持,有什么问题都可以提交,我也会及时为大家解决!

项目地址

GitHub地址

Gitee地址

hexo-matery主题美化(三)-音乐播放器

hexo-matery主题美化(三)-音乐播放器

配置音乐播放器

要支持音乐播放,在主题的 _config.yml 配置文件中激活music配置即可:

# Whether to display the musics.
# 是否在首页显示音乐.
music:
  enable: true
  title: 非吸底模式有效
  show: 听听音乐
  autoHide: true    # hide automaticaly
  server: tencent   #require    music platform: netease, tencent, kugou, xiami, baidu
  type: playlist    #require song, playlist, album, search, artist
  id: 7660234225     #require    song id / playlist id / album id / search keyword
  fixed: true       # 开启吸底模式
  autoplay: false   # 是否自动播放
  theme: 'blue'     #歌词的颜色
  loop: 'all'       # 音频循环播放, 可选值: 'all', 'one', 'none'
  order: 'random'   # 音频循环顺序, 可选值: 'list', 'random'
  preload: 'auto'   # 预加载,可选值: 'none', 'metadata', 'auto'
  volume: 0.7       # 默认音量,请注意播放器会记忆用户设置,用户手动设置音量后默认音量即失效
  listFolded: true  # 列表默认折叠

server可选:netease(网易云音乐),tencent(QQ音乐),kugou(酷狗音乐),xiami(虾米音乐),

baidu(百度音乐)。

type可选:song(歌曲),playlist(歌单),album(专辑),search(搜索关键字),artist(歌手)

id获取示例: 打开网易云音乐,选择喜欢的歌单,然后点击分享,生成插件外链

这就是歌单的id,文件里默认设置的歌单其实也还不错。如果以后继续添加歌曲,更新了歌单,我亲自试过,Aplayer插件也会更新,之前的16首现在加了三首有19首。看了一些人的文章,有的人说不会更新,不知道他有没有试过。对了,如果打开博客播放器插件加载不出来,可能是网速的原因,刷新一下就好,也有可能是没配置好,多看看文章就行。

参考资料:
弗兰克的猫-hexo-matery主题配置

new落花-Aplayer插件

hexo-matery主题优化(二)

hexo-matery主题优化(二)

目录:

  • hexo搜索
  • hexo代码高亮
  • 消除文章toc目录的那一竖杠杠
  • 去掉友链下那不必要的一栏空白
  • 最后

前段时间,我好像写过一篇文章讲hexo-matery主题的配置优化,隔了很久,自己都忘了,应该是第一次安装主题的时候。那现在有些一篇关于这样的文章帮助大家继续增强美化自己的博客,因为本人最近也在做这件事,搭博客已经3个月了,选了喜欢的主题,却还是有一点点不满意,虽然创建主题的都是大佬,但是也有瑕疵的地方。更头疼的是,到最后也没人来告诉我们怎么把我们的博客做的漂亮一点,还是要自己来亲手改改,直接弄成博客是自己亲生的一样!到时候也能吹吹!这次不介绍太多,怕一下弄不过来,主要就讲最近接触过的。

hexo搜索

如果你已经做了这个搜索可以跳过,没有就一起干!过程非常可乐,呃,是非常简单!前提是使用的是hexo主题,配置了相应的环境。主题最开始弄下来是没有搜索插件的,需要下载,接下来你懂的,用npm包管理工具下载插件(如果不会用,可以搜索相应的文章看看,有需要会专门讲一下npm是何物,不会有同学还没安装好npm吧?不会吧!不会吧!)。进入到当前博客根目录下,在命令行里:

npm i hexo-generator-search -s

就这样下好了!同时需要再当前根目录配置文件中添加配置:

#search
search:
  path: search.xml
  field: post 

hexo代码高亮

还是不要用主题里的高亮了,enable就false掉,还是同样的“骚操作”,下一个代码高亮的插件,这里用hexo-prism-matery,相同的手法下载下来后,在根目录下的配置文件里添加:

prism_plugin:
  mode: 'preprocess'  # preprocess/realtime
  theme: 'tomorrow'
  line_number: true #default false
  custom_css: #

消除文章toc目录的那一竖杠杠

修改前是这样的:

toc那一杠
如果你发现文章的toc目录有一条竖杠,不好看,那么就去掉。之前toc目录一直是这样的,我也不想要了。做博客开始的时候发现了,没太在意,终究是影响了美观。现在就要把目录弄得正常点。来到主题目录下,找到source目录,找到lib目录,里面也是一些css和js文件。其中找到tocbot文件夹,打开它的css文件,找到toc-link::before

.toc-link::before&#123;
    background-color:#EEE;content:' ';
    display:inline-block;height:inherit;/*left:0;*/
    margin-top:-1px;
    position:absolute;
    width:0px;   /*之前是2px*/
&#125;

里面可能很乱,就一两行代码,找到后将width值改成0就行了。另外解析的文章目录不完整可能是标题有些不支持:

# 是否激活文章 TOC 功能,并配置TOC支持选中哪些标题类型,这是全局配置。
# 可以在某篇文章的 Front-matter 中再加上`toc: false`,使该篇文章关闭TOC目录功能
toc:
  enable: true
  heading: h2, h3, h4, h5, h6  #选中除h1以外的标题,之前没有h6
  collapseDepth: 0 # 目录默认展开层级
  showToggleBtn: true # 是否显示切换TOC目录展开收缩的按钮

去掉友链下那不必要的一栏空白

修改前:

空白栏
这个也简单,不必过于头疼!因为我已经改好了,直接卖就是了,白给不要钱!

<div class="card">
   <!--<div class="card-content">
        <%- page.content %>
       </div>-->
 </div>

友链下的那栏不必要的空白着实凸显了它的不必要性,所以我们要去掉它。直接把它的代码给注释掉,找到layout文件夹下的friends.ejs文件。hexo引擎渲染该文件生成html文件,变成了友链页面,其中友链的那一片作为一个模块卡片,valine留言板及空白一栏也是,空白的就是什么也没有,很容易发现,注释即可。

最后

以后还会继续更新站点,如果想看总体的效果就访问我的网站吧!最近的美化优化了很多,变化也很大!如果想深入了解就上公众号吧,小码之光,加群交流也行。后续会持续跟大家讲博客美化。

计算机网络-01网络模型

计算机网络——01网络模型

目录:
  1. 概念
  2. 分类
  3. 网络分层
  4. TCP确认机制
  5. 连接与关闭
  6. TCP/UDP
  7. TCP/ISO面向连接与无连接
  8. 总结

一、概念

计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统

二、分类

地理范围划分是一种大家都认可的通用网络划分标准。按这种标准可以把各种网络类型划分为局域网、城域网、广域网三种。最后讲一下互联网!

  • 局域网:(Local Area Network,LAN) 通常我们常见的“LAN”就是指局域网,这是我们最常见、应用最广的一种网络。所谓局域网,那就是在局部地区范围内的网络,它所覆盖的地区范围较小。局域网在计算机数量配置上没有太多的限制,少的可以只有两台,多的可达几百台。一般来说在企业局域网中,工作站的数量在几十到两百台次左右。在网络所涉及的地理距离上一般来说可以是几米至10公里以内。这种网络的特点就是:连接范围窄、用户数少、配置容易、连接速率高。目前局域网最快的速率要算现今的10G以太网了。IEEE的802标准委员会定义了多种主要的LAN网:以太网(Ethernet)、令牌环网(Token Ring)、光纤分布式接口网络(FDDI)、异步传输模式网(ATM)以及最新的无线局域网(WLAN)。

  • 城域网:(Metropolitan Area Network,MAN) 这种网络一般来说是在一个城市,但不在同一地理小区范围内的计算机互联。这种网络的连接距离可以在10-100公里,它采用的是IEEE802.6标准。MAN与LAN相比扩展的距离更长,连接的计算机数量更多,在地理范围上可以说是LAN网络的延伸。在一个大型城市或都市地区,一个MAN网络通常连接着多个LAN网。如连接政府机构的LAN、医院的LAN、电信的LAN、公司企业的LAN等等。

  • 广域网:(Wide Area Network,WAN) 这种网络也称为远程网,所覆盖的范围比城域网(MAN)更广,它一般是在不同城市之间的LAN或者MAN网络互联,地理范围可从几百公里到几千公里。因为距离较远,信息衰减比较严重,所以这种网络一般是要租用专线,通过IMP(接口信息处理)协议和线路连接起来,构成网状结构。这种城域网因为所连接的用户多,总出口带宽有限,所以用户的终端连接速率一般较低,通常为9.6Kbps-45Mbps 如:邮电部的CHINANET,CHINAPAC,和CHINADDN网。

  • 互联网:(internet)指的是网络之间所串连成的最大网络,这些网络以一组通用的协议相连,形成逻辑上的大型国际网络,始于1969年美国的阿帕网。通常internet泛指互联网,而Internet则特指因特网(国际互联网)。因特网于1969年诞生于美国,最初名为“阿帕网”(ARPAnet)是一个军用研究系统 ,采用TCP/IP协议,现在则已发展成为一个覆盖五大洲多个国家的开放型全球计算机网络系统。

三、网络分层

为什么要分层?在计算机之间通信,主要是为了发送一些数据信息,一台计算机把数据发送出去,首先要让网络识别目的主机,能够找到它;明确目的主机是否连接网络;机子上的应用是否打开准备接收数据以及相应的异常处理。让我们去处理的话,会怎么解决这些问题呢?这里建立了两种模型:

OSI七层模型:亦称OSI(Open System Interconnection)。参考模型是国际标准化组织(ISO)制定的一个用于计算机或通信系统间互联的标准体系,一般称为OSI参考模型或七层模型。

协议栈

应用层:

网络服务与最终用户的一个接口。

协议有:HTTP FTP SMTP SNMP DNS TELNET HTTPS POP3 DHCP

表示层:

数据的表示、安全、压缩。

格式有,JPEG、ASCll,加密格式等

会话层:

建立、管理、终止会话,对应主机进程,指本地主机与远程主机正在进行的会话

传输层:

定义传输数据的协议端口号,以及流控和差错校验。

协议有:TCP UDP,数据包一旦离开网卡即进入网络传输层

网络层:

网络层的主要工作是定义网络地址、区分网段、子网内MAC寻址、对于不同子网的数据包进行路由

协议有:ICMP(因特网控制报文协议) IP(IPV4 IPV6) ARP地址解析 Routing路由协议

数据链路层:

建立逻辑连接、进行硬件地址寻址、差错校验等功能,将比特组合成字节进而组合成帧,用MAC地址访问介质,错误发现但不能纠正。

协议有:Ethernet PPP

物理层:

建立、维护、断开物理连接,比特传输。

TCP/IP模型:(Transmission Control Protocol / Internet Protocol,传输控制协议/网络互联协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF国际互联网工程任务组的RFC 793 定义。
基本五层模型
TCP/IP模型合并了前三层为应用层,应用层定义了各种各样的协议来规范数据格式,常见的在HTTP的Header请求头中,分别定义了请求数据格式Accept和响应数据格式Content-Type,有了这个规范以后,当对方接收到请求以后就知道该用什么格式来解析,然后对请求进行处理。而链路层定义了主机的身份,即MAC地址,而网络层定义了IP地址,明确了主机所在的网段,有了这两个地址,数据包就从可以从一个主机发送到另一台主机。但实际上数据包是从一个主机的某个应用程序发出,然后由对方主机的应用程序接收。

因为数据链路层和物理层的内容相差不多,所以在TCP/IP协议中它们被归并在网络接口层次里。只有四层体系结TCP/IP协议,与有七层体系结构的OSI相比要简单了不少,也正是这样,TCP/IP协议在实际的应用中效率更高,成本更低 。

ARP协议(网络层):

即地址解析协议,是根据IP地址获取MAC地址的一个网络层协议。其工作原理如下:ARP首先会发起一个请求数据包,数据包的首部包含了目标主机的IP地址,然后这个数据包会在链路层进行再次包装,生成以太网数据包,最终由以太网广播给子网内的所有主机,每一台主机都会接收到这个数据包,并取出标头里的IP地址,然后和自己的IP地址进行比较,如果相同就返回自己的MAC地址,如果不同就丢弃该数据包。ARP接收返回消息,以此确定目标机的MAC地址;与此同时,ARP还会将返回的MAC地址与对应的IP地址存入本机ARP缓存中并保留一定时间,下次请求时直接查询ARP缓存以节约资源。

路由协议

首先通过IP协议来判断两台主机是否在同一个子网中,如果在同一个子网,就通过ARP协议查询对应的MAC地址,然后以广播的形式向该子网内的主机发送数据包;如果不在同一个子网,以太网会将该数据包转发给本子网的网关进行路由。网关是互联网上子网与子网之间的桥梁,所以网关会进行多次转发,最终将该数据包转发到目标IP所在的子网中,然后再通过ARP获取目标机MAC,最终也是通过广播形式将数据包发送给接收方。而完成这个路由协议的物理设备就是路由器,它会根据信道情况,选择并设定路由,以最佳路径来转发数据包。

四、TCP确认机制

应用层向TCP层发送用于网间传输的、用8位字节表示的数据流,然后TCP把数据流分区成适当长度的报文段(通常受该计算机连接的网络的数据链路层的最大传输单元(MTU)的限制)。之后TCP把结果包传给IP层,由它来通过网络将包传送给接收端实体的TCP层。TCP为了保证不发生丢包,就给每个包一个序号,同时序号也保证了传送到接收端实体的包的按序接收。然后接收端实体对已成功收到的包发回一个相应的确认(ACK);如果发送端实体在合理的往返时延(RTT)内未收到确认,那么对应的数据包就被假设为已丢失将会被进行重传。TCP用一个校验和函数来检验数据是否有错误;在发送和接收时都要计算校验和。

  • 在数据正确性与合法性上,TCP用一个校验和函数来检验数据是否有错误,在发送和接收时都要计算校验和;同时可以使用MD5认证对数据进行加密。
  • 在保证可靠性上,采用超时重传和捎带确认机制。
  • 在流量控制上,采用滑动窗口协议,协议中规定,对于窗口内未经确认的分组需要重传。

在拥塞控制上,采用TCP拥塞控制算法(也称AIMD算法)。该算法主要包括四个主要部分:

(1)慢启动

每当建立一个TCP连接时或一个TCP连接发生超时重传后,该连接便进入慢启动阶段。进入慢启动后,TCP实体将拥塞窗口的大小初始化为一个报文段,此后,每收到一个报文段的确认(ACK),拥塞窗口cwnd(congestion window)按指数增加。当cwnd值超过慢启动阐值或发生报文段丢失重传时,慢启动阶段结束。前者进入拥塞避免阶段,后者重新进入慢启动阶段。

(2)拥塞避免

在慢启阶段,当cwnd值超过慢启动阐值后,慢启动过程结束,TCP连接进入拥塞避免阶段。在拥塞避免阶段,每一次发送的cwnd个报文段被完全确认后,才将cwnd值加1。在此阶段,cwnd值线性增加。

(3)快速重传

快速重传是对超时重传的改进。当源端收到对同一个报文的三个重复确认时,就确定一个报文段已经丢失,因此立刻重传丢失的报文段,而不必等到重传定时器(RTO)超时。以此减少不必要的等待时间。

(4)快速恢复

快速恢复是对丢失恢复机制的改进。在快速重传之后,不经过慢启动过程而直接进入拥塞避免阶段。每当快速重传后,置sshtesrh=cwnd/2、ewnd=ssthresh+3。此后,每收到一个重复确认,将cwnd值加1,直至收到对丢失报文段和其后若干报文段的累积确认后,置cwnd=ssthesrh,进入拥塞避免阶段。

五、连接与关闭

建立连接:

TCP是因特网中的传输层协议,使用三次握手协议建立连接。当主动方发出SYN同步序列编号数据包连接请求后,等待对方回答

图2 TCP的三次握手
SYN+ACK,并最终对对方的 SYN 执行 ACK 确认。这种建立连接的方法可以防止产生错误的连接,TCP使用的流量控制协议是可变大小的滑动窗口协议。

TCP三次握手的过程如下:

  1. 客户端发送SYN(SEQ=x序列号)报文给服务器端,进入SYN_SEND状态。
  2. 服务器端收到SYN报文,回应一个SYN (SEQ=y)+ ACK(ACK=x+1)报文,进入SYN_RECV状态。
  3. 客户端收到服务器端的SYN报文,回应一个ACK(ACK=y+1)报文,进入已连接状态。

三次握手完成,TCP客户端和服务器端成功地建立连接,可以开始传输数据了。

连接终止:

建立一个连接需要三次握手,而终止一个连接要经过四次挥手,这是由TCP的半关闭(half-close)造成的。如下图所示。

图3 TCP连接的终止
(1) 某个应用进程首先调用close,称该端执行“主动关闭”。该端的TCP于是发送一个FIN结束标志数据包,表示数据发送完毕。

(2) 接收到这个FIN的对端执行 “被动关闭”(passive close),这个FIN由TCP确认,发送ACK数据包。

注意:FIN的接收也作为一个文件结束符(end-of-file)传递给接收端应用进程,放在已排队等候该应用进程接收的任何其他数据之后,因此,FIN的接收意味着接收端应用进程在相应连接上再无额外数据可接收。

(3) 此时两者之间能够继续互相发送数据包,然而一段时间后,接收到这个文件结束符的应用进程将调用close关闭它的套接字,这导致它的TCP也发送一个FIN。

(4) 接收这个最终FIN的原发送端TCP(即执行主动关闭的那一端)ACK确认这个FIN。既然每个方向都需要一个FIN和一个ACK,因此通常需要4个分节。

注意
当一个进程无论自愿地(调用exit或从main函数返回)还是非自愿地(收到一个终止本进程的信号)终止时,所有打开的描述符都被关闭,这也导致仍然打开的任何TCP连接上也发出一个FIN。无论是客户还是服务器,任何一端都可以执行主动关闭。通常情况是,客户执行主动关闭,但是某些协议,例如,HTTP/1.0却由服务器执行主动关闭。

六、TCP和UDP

  • TCP 是面向连接的传输控制协议,而UDP 提供了无连接的数据报服务;

  • TCP 具有确认机制,确保传输数据的正确性,很少出现丢失或乱序;

  • UDP 在传输数据前不建立连接,不对数据报进行查改,无须等待对方的应答,会出现分组丢失、重复、乱序;

  • UDP 具有较好的实时性,工作效率较 TCP 协议高;

  • UDP 段结构比 TCP 的段结构简单,因此网络开销也小。

TCP 协议可以保证接收端毫无差错地接收到发送端发出的字节流,为应用程序提供可靠的通信服务。对可靠性要求高的通信系统往往使用 TCP 传输数据,比如 HTTP 运用 TCP 进行数据的传输。

七、TCP、ISO模型

面向连接与无连接,面向连接可以分为三个阶段:

  1. 发出链接,建立连接
  2. 连接成功才开始传输
  3. 数据传输完毕,必须释放连接

无连接直接进行数据传输。
模型对比
TCP/IP模型减少了会话层,表示层,可以变成经典5层网络模型,TCP/IP协议能够迅速发展起来并成为事实上的标准,是它恰好适应了世界范围内数据通信的需要。它有以下
特点:

(1)协议标准是完全开放的,可以供用户免费使用不收费。
(2)独立于网络硬件系统,可以运行在广域网,更适合于互联网。
(3)网络地址IP统一分配,网络中每一设备和终端都具有一个唯一MAC物理地址。

对比:OSI层次间存在严格的调用关系,两个层通信必须通过下一层,不能越级,而TCP/IP可以越过下一层,直接使用更低层次所提供的服务,因而减少了一些不必要的开销,提高了效率;TCP/IP协议先出现,之后建立模型,而ISO/OSI先建立模型,后有协议。

总结:

讲了这么多,那么重点在哪呢?在目录三开始的网络分层到最后的TCP/OSI模型对比,分层就记住TCP/IP经典五层模型和各层的协议就行了,其实四层的更好记住,四层无非是应用的服务层、传输层(弄端口号的)、网络层(弄网络IP地址,获取MAC地址及路由寻找的),接口层(偏向物理的,定义MAC地址,将比特组装成帧进行发送)。有个概念就行,另外TCP确认机制(拥塞控制机制)需要掌握,以及TCP连接和断开的握手机制,还有TCP\UDP和TCP\ISO模型对比都是重点,需要掌握。

模型对比,分层就记住TCP/IP经典五层模型和各层的协议就行了,其实四层的更好记住,四层无非是应用的服务层、传输层(弄端口号的)、网络层(弄网络IP地址,获取MAC地址及路由寻找的),接口层(偏向物理的,定义MAC地址,将比特组装成帧进行发送)。有个概念就行,另外TCP确认机制(拥塞控制机制)需要掌握,以及TCP连接和断开的握手机制,还有TCP\UDP和TCP\ISO模型对比都是重点,需要掌握。

基本数据结构介绍了解

数据结构:反应数据之间的关系,物理或逻辑上的关系。 有两个角度看数据结构:逻辑结构和存储结构。逻辑结构是指数据之间的逻辑关系,有没有联系。而存储结构才是重点,数据怎么存?存成什么样?有顺序、链式、散列存储等,不过主要研究顺序和链式存储等方式,并对他们的运算进行了解。什么是顺序和链式?其实不难理解,就是容易忘(滑稽)!两者都要从逻辑和存储上看。

阅读全文

opera、google、firefox浏览器的选择

首先介绍:先介绍本人用的最多的浏览器:火狐 Mozilla Firefox,中文俗称“火狐”,是一个自由及开放源代码的浏览器,使用Gecko排版引擎,支持多种操作系统,如Windows、Mac OS及GNU/Linux等。该浏览器提供了两种版本,普通版和ESR延长支持版,ESR版本是 Mozilla 专门为那些无法或不愿每隔几周就升级一次的企业打造。Firefox ESR 版的升级周期为 12 个月,而普通 Firefox 的升级周期为 4 周。由于该浏览器开放了源代码,因此还有一些第三方编译版供使用,如pcxFirefox、苍月浏览器、tete009等。

阅读全文