[toc]
先使用能登录的方式登录上vps
切换到root
sudo -i
修改root密码(如果不用密码登录使用public_key方式登录,这一步可以跳过)
1 | sudo passwd root |
更改登录方式
1 | #开启PasswordAuthentication 和 PermitRootLogin |
重启ssh服务
service sshd restart
使用root账户登录
ssh root@ip -p port
注:如果使用public_key方式登录,就把客户端电脑的id_rsa.pub文件内容复制到服务器的.ssh目录下的authorized_keys文件中(如果没有这个文件和文件夹就创建一个)
附:生成public_key命令,windows可以安装一个git bash,mac直接终端执行
ssh-keygen -t rsa -C "email@example.com"
1 | echo root:要修改的密码 |sudo chpasswd root |
[toc]
今天来讲下小鸡(国外vps或者服务器)的线路问题
电信163骨干网或者163骨干网
电信骨干网络,通常就是我们说的163骨干网,也就是我们通常说的AS4134接入的带宽,是中国电信的骨干网络,也就是我们经常看到202.97开头的节点,此网络负责了90%的电信业务负载(163有电信整个海外出口的90%带宽容量),因为用的人多,线路没有优化,所以在晚高峰会出现线路卡顿,以及丢包率高的情况。
CN2
英文Chinatelecom Next Carrier Network,中文为中国电信下一代承载网,缩写为CNCN或者CN2。
CN2 GT
GT即Global Transit,省级出口为202.97节点,在跨境时才进入CN2骨干网,出国/国际跨境节点为59.43开头。线路总体情况良好,负载较中等,因此可以保证良好的速度和延迟。省级/出国节点为202.97开头,国际骨干节点有59.43开头的CN2节点。在CN2等级低,好于163骨干网。
CN2 GIA
GIA即Global Internet Access,等级最高,在速度和延迟上有极好的体验。属于CN2里面的明星产品,在CN2里面等级最高,去程和回程全部都走59.43高速节点。CN2 GIA线路一般比较稳定,丢包率低。
三网CN2 GIA
一般来说电信用户会走CN2 GIA线路,但是有些商家优化路由,让移动、联通用户也走CN2 GIA,速度比直连要理想。
我们可以用ipip.net提供的traceroute查看我们的去程就能看到服务器的线路了
163骨干网
可以看到整个路由节点信息中,全程没有59.43高速cn2节点,并且一些省级或者出口节点是以202.97开头的,所以我们就可以判断承载网络就是163骨干网(其实就是普通线路)
CN2 GT
在路由节点中,出现了59.43开头的节点,但是在一些出口节点,仍然是202.97开头的节点,这就是CN2 GT线路
CN2 GIA
从这个路由节点来看,就知道这肯定是明显线路了,也就是CN2 GIA,全程59.43节点,没有出现202.97节点,所以此承载网络就是CN2 GIA,延迟也能看出这个线路的优质,跳数也比较少
线路决定了你的服务器访问速度,以及你的扶墙速度,当你需要优化服务器访问速度的时候,就可以优化一下线路。
你可以用BestTrace查看你当前的网络到你服务器的去程和回程。也可以通过中间节点的延迟判断线路哪里出了问题,然后就可以找vps商家扯皮了。
[toc]
昨天我们大致看了下Docker的基础操作,今天就顺势用Docker安装一下mysql吧,还是相当简单的(当然是相对于不借助docker安装来说的,手动滑稽 - -)
首先在Docker里面搜索一下mysql
可以看到搜索出来了N多的mysql镜像,你可以选择你想要的镜像进行安装,不过我就给你用官方的最新版安装吧
下载mysql
1 | docker pull mysql |
查看我们下载的mysql镜像
1 | docker images | grep mysql |
创建目录mysql,用来存放mysql的相关东西
1 | mkdir -p ~/mysql |
然后进入mysql目录,创建Dockerfile文件
1 | cd ~/mysql |
Dockerfile的内容可以在https://github.com/docker-library/mysql找到
基于Dockerfile创建镜像
1 | docker build -t mysql . |
查看创建的镜像
1 | docker images | grep mysql |
1 | docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=test1234 -d image-name/image-id |
命令说明
–name mysql 设置容器别名
-p 3306:3306 将容器的3306端口映射到主机的3306端口,不然无法访问
-e MYSQL_ROOT_PASSWORD=test1234 初始化root用户的密码
-d 后台运行容器
image-name/image-id mysql镜像名称或者镜像id
1 | docker exec -it mysql bash |
1 | mysql -u root -p |
1 | CREATE USER 'test'@'%' IDENTIFIED WITH mysql_native_password BY 'test1234'; |
大概就是这么多啦,emmm.
]]>[toc]
Docker是一个轻量级容器技术,有点类似虚拟机技术(xen、kvm、vmware、virtual)。Docker直接运行在当前操作系统智商,不是运行在虚拟机中,但是实现了虚拟机技术的资源格力,性能远远高于虚拟机技术。
Docker支持将软件编译成一个镜像(image),然后在镜像中做好对软件的各种配置,然后发布镜像,使用者可以运行这个镜像,运行中的镜像称之为容器(container),容器的启动是非常快的,基本都是秒。感觉有点像我们平时安装ghost操作系统?系统安装好后软件都有了,虽然完全不是一种东西,但是思路是类似的。
CentOS6
1 | rpm -iUvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm |
CentOS 7、Debian、Ubuntu
1 | curl -sSL https://get.docker.com/ | sh |
Windows
1 | 祭出度娘 -> Boot2Docker然后傻瓜式安装 |
Docker镜像检索(可以到https://registry.hub.docker.com)上搜索
1 | docker search 镜像名 |
镜像下载
1 | docker pull 镜像名 |
查看本地镜像列表
1 | docker images |
镜像删除
1 | docker rmi image-id (注:image-id可以通过上面的查看本地镜像列表查看) |
运行容器
1 | docker run --name container-name -d image-name |
查看运行中的容器列表
1 | docker ps |
停止容器
1 | docker stop container-name/container-id |
启动容器
1 | docker start container-name/container-id |
端口映射
1 | 为啥要用到这个?因为docker运行中使用的端口在本机和本机局域网不通,需要把docker容器中的端口映射到当前主机的端口上,这样局域网就能访问了 |
删除容器
1 | docker rm container-id |
容器日志
1 | docker logs container-name/container-id |
登录容器(也就是进入相应的容器,然后进行一些shell操作)
1 | docker exec -it container-id/container-name bash |
列出所有的容器 ID
1 | docker ps -aq |
停止所有的容器
1 | docker stop $(docker ps -aq) |
删除所有的容器
1 | docker rm $(docker ps -aq) |
删除所有的镜像
1 | docker rmi $(docker images -q) |
复制文件
1 | docker cp mycontainer:/opt/file.txt /opt/local/ |
emmm,大致基本的操作就这些,后面我再看看还有些啥东西,我再补充,毕竟是遇到问题了,才好找对应方案。
]]>[toc]
安装宝塔免费版
1 | Centos安装命令: |
升级专业版
1 | wget -O update.sh http://download.bt.cn/install/update_pro.sh && bash update.sh pro |
到路径/www/server/panel/class
下找到common.py
文件,然后使用vi编辑器搜索data = panelAuth().get_order_status(None)
(后期可能修复,稍微看一下代码,找一下敌军位置就行),把这一段代码替换成(时间戳也可以自己设置一个,替换一下就行)
1 | data = {'status' : True,'msg' : {'endtime' : 32503651199 }} |
最后一步(最重要一步,不然你的插件能安装也无法使用):进入 /www/server/panel/data 新建一个文件,文件名为:userInfo.json,如果存在这个文件就删除重建,嫌麻烦就用下面的命令咯
1 | rm -rf /www/server/panel/data/userInfo.json;touch /www/server/panel/data/userInfo.json |
附一张安装成功图
完结撒花~~~
[toc]
1 | wget -qO- https://raw.githubusercontent.com/oooldking/script/master/superbench.sh | bash |
[toc]
详细的可以看这一篇文章: 《Do not always trust @JvmOverloads》
1 | /** |
也就是说,如果方法参数中有默认值的,那么这个注解可以帮我们生成多个重载方法,这样方便我们调用,可以省掉一些不关心的参数。
1 |
|
最终会帮我们重载三个方法出来
1 |
|
1 | class EmoticonView constructor( |
按照上面的介绍,会帮忙自动生成多个重载方法,那么坑来了的,注意这个 defStyleAttr = 0 。。。
我们先看看 EditText 的构造函数, 如果是XML来写的布局,那么会调用第二个构造函数,也就是 public EditText(Context context, AttributeSet attrs) , 那么默认传入的 样式 defStyleAttr 就是 com.android.internal.R.attr.editTextStyle
1 | public class EditText extends TextView { |
而我们如果使用 IDE 自动提示的 @JvmOverload
写出来的代码长这样:
1 | class InputVIew constructor( |
看到了么,你的代码 defStyleAttr 默认是 0 而不是 com.android.internal.R.attr.editTextStyle 。
那么说了这么多,这样会导致什么问题呢?
亲测,焦点没有了的,点击之后键盘也无法弹起。
修改默认值即可:
1 | class InputVIew constructor( |
像我在开头提到的文章 《Do not always trust @JvmOverloads》 ,在最后写到: Button, EditText, RadioButton, Switch 都会有类似的问题,请大家平时开发过程中要留意。
更多内容,请上车https://eicky.com
]]>[toc]
(eg:/usr/local/apache-tomcat-8.5.37/bin/)
修改catalina.sh
文件在cygwin=false之前添加
1 | JAVA_OPTS="-Xms512m -Xmx1024m -Xss1024K -XX:PermSize=128m -XX:MaxPermSize=256m" |
1 | Java HotSpot(TM) 64-Bit Server VM warning: ignoring option PermSize=128m; support was removed in 8.0 |
1 | JAVA_OPTS=”$JAVA_OPTS -server -Xms1024m -Xmx1024m” |
更多内容,请上车https://eicky.com
]]>[toc]
/proc/meminfo
查看RAM使用情况最简单的方法是通过/proc/meminfo。这个动态更新的虚拟文件实际上是许多其他内存相关工具(如:free / ps / top)等的组合显示。/proc/meminfo列出了所有你想了解的内存的使用情况。进程的内存使用信息也可以通过/proc/
1 | cat /proc/meminfo |
atop
atop命令是一个终端环境的监控命令。它显示的是各种系统资源(CPU, memory, network, I/O, kernel)的综合,并且在高负载的情况下进行了彩色标注。
1 | sudo atop |
free
free命令是一个快速查看内存使用情况的方法,它是对 /proc/meminfo 收集到的信息的一个概述。
1 | free -h |
GNOME System Monitor
GNOME System Monitor 是一个显示最近一段时间内的CPU、内存、交换区及网络的使用情况的视图工具。它还提供了一种查看CPU及内存使用情况的方法。
1 | gnome-system-monitor |
htop
htop命令显示了每个进程的内存实时使用率。它提供了所有进程的常驻内存大小、程序总内存大小、共享库大小等的报告。列表可以水平及垂直滚动。
1 | htop |
KDE System Monitor
功能同 4 中介绍的GENOME版本。
1 | ksysguard |
memstat
memstat是一个有效识别executable(s), process(es) and shared libraries使用虚拟内存情况的命令。给定一个进程ID,memstat可以列出这个进程相关的可执行文件、数据和共享库。
1 | memstat -p <PID> |
nmon
nmon是一个基于ncurses的系统基准测试工具,它可以监控CPU、内存、I/O、文件系统及网络资源等的互动模式。对于内存的使用,它可以实时的显示 总/剩余内存、交换空间等信息。
1 | nmon |
ps
ps命令可以实时的显示各个进程的内存使用情况。Reported memory usage information includes %MEM (percent of physical memory used), VSZ (total amount of virtual memory used), and RSS (total amount of physical memory used)。你可以使用 “–sort”选项对进程进行排序,例如按RSS进行排序:
1 | ps aux --sort -rss |
smem
smem命令允许你统计基于/proc信息的不同进程和用户的内存使用情况。内存使用情况的分析可以导出图表(如条形图和饼图)。
1 | sudo smem --pie name -c "pss" |
top
top命令提供了实时的运行中的程序的资源使用统计。你可以根据内存的使用和大小来进行排序。
1 | top |
vmstat
vmstat命令显示实时的和平均的统计,覆盖CPU、内存、I/O等内容。例如内存情况,不仅显示物理内存,也统计虚拟内存。
1 | vmstat -s |
转自原文链接
]]>[toc]
国内国外免费接收短信验证码:国外14个网站国内1个网站 分享一些国内国外的短信验证码接收网站,注册某些网站的时候可以临时用一下,重要网站不要用这个注册!
SMSReceiveFree:https://smsreceivefree.com/
Receive SMS Online for FREE:https://www.receive-sms-online.info/
Receive a SMS Online:https://receive-a-sms.com/
Free SMS Numbers Online:https://smsnumbersonline.com/
Receive SMS online for Free:https://sms-online.co/receive-free-sms
Receive-SMS:https://receive-sms.com/
Receive FREE SMS online:http://receivefreesms.com/
RECEIVE SMS ONLINE:https://www.receivesmsonline.net/
Free Online Phone:https://www.freeonlinephone.org/
Receive SMS Online:http://receive-sms-online.com/
TextNow:https://www.textnow.com/
Textfree:https://www.pinger.com/text-free/
SELLAITE:http://sms.sellaite.com/
Twilio:https://www.twilio.com/
国内接码:https://www.pdflibr.com/
经本人测试,最后一个比较靠谱,国内国外都能到达,速度也还可以
转自原文链接
]]>[toc]
Class JavaLaunchHelper is implemented in both /Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents/Home/bin/java (0x10d19c4c0) and /Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents/Home/jre/lib/libinstrument.dylib (0x10ea194e0). One of the two will be used. Which one is undefined.
昨晚在Mac上装了Intellij Idea,随手用IJ带的Java工程模板创建了一个测试工程,控制台报了这样一个Error。
意思是这个JavaLaunchHelper类被实现了两次。无奈之下搜索了万能的Stack Overflow,找到了解决方案。
http://stackoverflow.com/questions/43003012/objc3648-class-javalaunchhelper-is-implemented-in-both
引用高票回答如下
You can find all the details here:
IDEA-170117 “objc: Class JavaLaunchHelper is implemented in both …” warning in Run consoles
It’s the old bug in Java on Mac that got triggered by the Java Agent being used by the IDE when starting the app. This message is harmless and is safe to ignore. Oracle developer’s comment:
The message is benign, there is no negative impact from this problem since both copies of that class are identical (compiled from the exact same source). It is purely a cosmetic issue.
The problem is fixed in Java 9 and in Java 8 update 152.
If it annoys you or affects your apps in any way, the workaround for IntelliJ IDEA is to disable idea_rt launcher agent by adding idea.no.launcher=true into idea.properties (Help | Edit Custom Properties…).
这位外国码友清楚地解释了这个Error的原因,大概意思是说这是Mac上面Java的一个老Bug了,会在那些使用了Java Agent的IDE上运行应用时触发,但这个Error对程序是无影响的,可以无视。在Java 9和Java 1.8.152版本里已经修复了。
解决方案:
点击IJ最上面菜单的Help-Edit Custom Properties,没有这个properties文件的话,IJ会提示创建,然后在里面加上
idea.no.launcher=true
转自原文链接
]]>[toc]
命令 | 作用 |
---|---|
h | 游标左移 |
j | 游标下移 |
k | 游标上移 |
l | 游标右移 |
w | 向前移动一个单词 |
b | 向右移动一个单词 |
e | 向前移动一个单词,游标指向单词末尾 |
( | 移动到当前句子的首部 |
) | 移动到下一个句子的首部 |
{ | 移动到当前段的首部 |
} | 移动到当前段的尾部 |
0 | 移动到当前行的首部 |
$ | 移动到当前行的尾部 |
/text | 向下搜索text |
?text | 向上搜索text |
nG | 移动到n行 |
:n | 移动到n行 |
G | 移动到最后一行 |
dd | 删除光标所在的一整行 |
ndd | 删除光标所在的向下n行 |
yy | 复制光标所在的一整行 |
nyy | 复制光标所在的向下n行 |
u | 撤销上一个操作 |
gg | 跳转到文件首行 |
dG | 删除光标所在行以及其下所有行的内容 |
ggdG | 删除所有内容 |
命令 | 作用 |
---|---|
i | 从光标所在处插入 |
I | 从目前光标 |
a | 从当前光标所在的下一个字符处开始插入 |
A | 从光标所在行的最后一个字符处开始插入 |
o | 在目前光标所在行的下一行处插入新的一行并开始插入 |
O | 在目前光标所在行的上一行处插入新的一行并开始插入 |
ESC | 退出编辑模式 |
:w | 保存文件 |
:w! | 若文件为只读,强制保存文件 |
:q | 离开vi |
:q! | 不保存强制离开vi |
:wq | 保存后离开vi |
:wq! | 强制保存后离开vi |
[toc]
先看看之前的
再看看现在的
implementation
和api
是取代之前的compile的,其中api
和compile
是一样的效果,implementation
有所不同,通过implementation
依赖的库只能自己库本身访问,举个例子,A依赖B,B依赖C,如果B依赖C是使用的implementation
依赖,那么在A中是访问不到C中的方法的,如果需要访问,请使用api
依赖
compile only
和provided
效果是一样的,只在编译的时候有效, 不参与打包
runtimeOnly
和apk
效果一样,只在打包的时候有效,编译不参与
testImplementation
和testCompile
效果一样,在单元测试和打包测试apk的时候有效
debugImplementation
和debugCompile
效果相同, 在debug
模式下有效
releaseImplementation
和releaseCompile
效果相同,只在release
模式和打包release包情况下有效
大概就是这些了,需要更多请上车
]]>[toc]
最近在看后台相关的东西,发现了一个框架特别好使(骚气也是相当的足)—->Spring boot,只能用下面的图来形容了↓↓↓
配置超级简单,也特别容易上手,下面给大家讲一下云服务器上部署Spring boot的微服务
Spring boot不再像ssm那样,通过war包来部署服务,它自带tomcat,部署需要把项目生成jar包形式,然后通过java -jar demo.jar
来开启服务
但是….
你可能遇到了一个问题,当你运行了java -jar demo.jar
后,你关闭了shell,你就不能访问你的服务了,是不是很蛋疼,哈哈哈哈,我也是这样的
怎么解决这个问题呢?
答案非常简单
使用nohup java -jar demo.jar
来开启服务就OK了,nohup
是常驻命令,它的用途就是不挂断地运行命令,这样你即使关闭shell,你的服务依然挂着,于是乎,就这么愉快的玩耍起来了(注:这个命令会在当前目录下生成nohup.out文件,记录日志)
好奇的朋友就会问了,这个开启没问题了,怎么关闭呢?
答案依然简单,两边操作轻松搞定,又可以继续dota了。
ps aux | grep java
kill -9
命令关闭进程就可以了kill -9 pid号
注:使用ps aux
命令查询出来的第二列就是pid了
[toc]
喜欢写Blog的人,会经历三个阶段。
引自阮一峰
第一阶段我已经经历过了,目前在CSDN的文章仍然在更新。但是作为一个免费空间,一个技术博客的聚集地,其管理和运营虽说正在变得越来越好,但是恶心人的事件也时有发生,比如对新手不友好的审核机制、近期改版造成的各种不兼容问题。
于是,就想着挣脱枷锁,向第二第三阶段发展。
我这人吧凡事都考虑的比较详尽,,我感觉我如果再去经历第二阶段的话既浪费精力又消耗时间,而且自己也过了玩网站、玩博客的年纪,如果申请个域名再搞个网站,我不知道这股热度会持续多久。
所以,我就直接跳到了第三个阶段,开始在github上搭建自己的博客。由于自己对前端一无所知,即使使用现成的博客框架,刚开始玩的时候特别费劲。但是经过不断摸索,我的博客已经基本成型,传送门开启:wordzzzz的个人博客-托管于github wordzzzz的个人博客-托管于gitee。
本篇博文并不打算长篇大论的介绍基于GitHub Pages或者Gitee Pages搭建博客的步骤,因为这类的文章实在是太多了,青菜萝卜又各有所爱,不如给出资源,让大家自己折腾。所以我只是在此有序贴出我在搭建博客的过程中用到的各种有用资源,以及搭建博客的大致流程,也算是对我这段时间的一个告别仪式吧。
我想在GitHub Pages推出之前,由于技术门槛的存在,第三个阶段应该会很少有人涉足。所以在开始一切之前,我们先来看看什么是GitHub Pages。
Github Pages 是面向用户、组织和项目开放的公共静态页面搭建托管服 务,站点可以被免费托管在 Github 上,你可以选择使用 Github Pages 默 认提供的域名 github.io 或者自定义域名来发布站点。Github Pages 支持 自动利用 Jekyll 生成站点,也同样支持纯 HTML 文档,将你的 Jekyll 站 点托管在 Github Pages 上是一个不错的选择。
网站首页就是搭建GitHub Pages的过程其中第一步之后,选择不同的git客户端选项,会出现相应的初始化步骤,很人性化。
大家可以跟着上面的链接先在自己的github新建仓库,仓库名称为username.github.io,其中username要替换成你github的名称,比如我的github名称为wordzzzz,所以我新建的仓库就应该是wordzzzz.github.io。那么等我以后搭建好了我的博客,我就可以通过https://wordzzzz.github.io来访问我的主页了。
到现在为止,只是搭建博客的准备工作。搭建博客的下一步是选择合适的静态博客框架。
我一开始用的是jekyll,这是中文社区翻译出来的中文开发文档。我使用的主题是Minimal Mistakes,开发文档很详细。但是后来由于jekyll体验不是很好(中文资料少,我英语比较差我会说嘛),依赖环境总是出问题(需要安装ruby),markdown采用的是Kramdown(Kramdown对我之前的一些博客格式支持的不是很好,我自己写文档用的都是小书匠,然后发表到CSDN,所以并不想花时间在改格式上面),而且我使用的这个主题是个人维护的,种种原因导致最后做出来的博客很难符合我的胃口,最后被我扔进了停尸房jekyll_mysite。
就在我将要放弃之时,hexo拯救了我。对,没错,它有中文开发文档。而在hexo界,使用最多的主题就是next了。光是看到这两份资料,我就已经激动的不行了,这种扁平化设计的网站,不就正是我需要的么。加上详尽的开发文档和丰富的第三方接口,让我对它爱不释手。最终定稿了自己的个人博客,存储在githubwordzzzz的个人博客-托管于github和giteewordzzzz的个人博客-托管于gitee上。
next主题支持三种外观显示,支持多国语言,5套代码高亮主题,可以深度定制。在其Github上,更是有三个主题的代表作,其中我最喜欢的莫过于基于Muse scheme的wanghao的博客。于是,我就在wanghao的博客的基础上进行了相应的更改,形成了我现在的博客,主题文件全部在我的github上,欢迎大家fork、star、follow。
其实先按照hexo配置开发环境,再按照next文档配置站点文件,完全可以轻松搭建起自己的博客。但是还是藏不住内心那颗年轻的心啊,终究还是搜罗了一些好玩的东西放到了自己的博客上,比如音乐播放器。
下面我先简单介绍一下基于github平台、hexo框架的next主题博客开发步骤:
文档都非常详细,下面我主要就第三方服务做一些说明。我提到的大部分三方服务在next的官方文档都提及到了,所以具体配置大家跟着官方文档走就行,我只是为每一类服务选择哪个做一下建议。
我用的韩国的livere,从国内到国外,支持几乎全部社交账号登陆,具体步骤请按照next的官方文档操作。
百度统计和google分析我都加上了,具体步骤请按照next的官方文档操作。
我用的LeanCloud,具体操作步骤请直接跳转至 为NexT主题添加文章阅读量统计功能。
我采用的是need-more-share2,直接在主题配置文件里面打开就行。
我采用的是Swiftype,具体步骤请按照next的官方文档操作。
Google Webmaster tools收录特别快,具体步骤请按照next的官方文档操作。但是百度站长收录的就很慢了,我的到现在还没被收录。
NexT 借助于 MathJax 来显示数学公式,此选项默认关闭,如果博客中有公式,那么一定要打开这个选项。
最后想说一下其他一些配置,比如添加背景图片、侧边栏头像旋转、侧边栏鼠标滑入显示、背景音乐等等,此处大部分参考这个博客。
next人性化的为用户提供了custom接口,我们可以在不影响主题文件的基础上进行个性化定制。
在theme/next/source/css/_custom文件夹下打开custom.styl文件,往里面添加以下代码:
1 | body { |
其中的css样式属性都可以根据你的自定义图片来更改,以达到最佳的效果。
在theme/next/source/css/_custom文件夹下打开custom.styl文件,往里面添加以下代码:
1 | #sidebar { |
在theme/next/source/css/_custom文件夹下打开custom.styl文件,往里面添加以下代码:
1 | .content { |
其中border-radius是给文章背景设置圆角,margin-top是设置文章到顶部的距离,其中属性可根据自己的需要进行调整。
在theme/next/source/css/_custom文件夹下打开custom.styl文件,往里面添加以下代码:
1 | #lv-container { |
和上面一样,背景色和圆角可自己调整更改。
在网址输入如下
1 | http://7u2ss1.com1.z0.glb.clouddn.com/love.js |
然后将里面的代码copy一下,新建love.js文件并且将代码复制进去,然后保存。将love.js文件放到路径/themes/next/source/js/src里面,然后打开\themes\next\layout_layout.swig文件,在末尾(在前面引用会出现找不到的bug)添加以下代码:
1 | <!-- 页面点击小红心 --> |
打开\themes\next\source\css_common\components\sidebar\sidebar-author.styl,在里面添加如下代码:
1 | .site-author-image { |
在theme/next/layout/_macro文件夹下打开sidebar.swig文件,找到以下代码行的位置:
1 | <nav class="site-state motion-element"> |
在其上添加以下代码:
1 | <!--my custom code begin--> |
然后找到代码行:
1 | </section> |
在此的上方添加一个,如下所示:
1 | <!--my custom code begin--> |
在theme/next/source/css/_custom文件夹下打开custom.styl文件,向里面增添下列代码:
1 | #mydivshow{opacity: 0;} |
注:具体代码添加位置以及代码里的section.site-overview可以自己修改,
描述:本站所用的音乐播放器是由DIYgod所制作的APlayer,其详细资料可参见这里。
1 | $ npm install aplayer --save |
安装完后在node_modules目录下找到APlayer.min.js文件,将其复制到theme/next/source/js/src/目录下。
在你想要加入音乐播放器的地方插入以下代码,本站把他放在了侧边栏里,具体操作如下。
打开theme/next/layout/_custom/文件夹下的sidebar.swig文件,向其中添加以下代码:
1 | <div id="player1" class="aplayer"></div> |
这里的歌曲url必须是在线音乐,当时现在大部分播放器都不会曝露出真实的歌曲播放地址,找资源很是费劲。这里给大家推荐一个解析平台,大部分的qq音乐还是可以解析出来或者直接在该平台上找到播放链接的。大家可以写多个music结构,以此来添加多个音乐。
当然,我们还可以通过添加网易云音乐外链的方式在我们的博客中添加音乐。打开theme/next/layout/_custom/文件夹下的sidebar.swig文件,向其中添加以下代码:
1 | <div id="music163player"> |
替换上述代码中的iframe标签之间的内容,就可以替换不同的音乐进行播放了。网易云音乐的歌单也可以生成外链,前提是歌单里的歌曲都有版权哦~
包含颜色更改,列表歌曲信息的排版修改。
在theme/next/source/css/_custom文件夹下打开custom.styl文件,往里面添加以下代码:
1 | .aplayer-list ol li:hover { /*列表悬停颜色*/ |
这一步要在自定义音乐播放器的配置完成之后才能进行,因为aplayer-controler依赖于aplayer来实现播放功能。
1 | npm install aplayer-controler --save |
安装APlayer-Controler的js文件:APlayer-Controler.js
将其放入theme/next/source/js/src下。
在theme/next/layout/_custom/文件夹下新建一个myapcontroler.swig的文件。向其中添加以下代码:
1 | <script src="/js/src/Aplayer-Controler.js"></script> |
在theme/next/layout文件夹下打开_layout.swig文件,在前添加以下代码:
1 | {% include '_custom/myapcontroler.swig' %} |
到此,自定义音乐播放控制边栏就基本完成,完成整个配置需要根据自己的主题背景进一步修改完善。
本教程到此结束,欢迎订阅、关注、收藏、评论、点赞哦~~( ̄▽ ̄~)~
完的汪(∪。∪)。。。zzz
]]>
[toc]
剑指offer刷完了,是时候总结一波数据结构与算法了。本系列文章暂定包括数据结构中树和图的各种操作,以及查找、排序等基本算法和动态规划等高级算法。本系列文章只是作为总结性的文献,为自己日后的面试做准备。
直接引自维基百科:排序算法。总结性强。
在计算机科学与数学中,一个排序算法(英语:Sorting algorithm)是一种能将一串数据依照特定排序方式进行排列的一种算法。最常用到的排序方式是数值顺序以及字典顺序。有效的排序算法在一些算法(例如搜索算法与合并算法)中是重要的,如此这些算法才能得到正确解答。排序算法也用在处理文字数据以及产生人类可读的输出结果。基本上,排序算法的输出必须遵守下列两个原则:
虽然排序算法是一个简单的问题,但是从计算机科学发展以来,在此问题上已经有大量的研究。举例而言,冒泡排序在1956年就已经被研究。虽然大部分人认为这是一个已经被解决的问题,有用的新算法仍在不断的被发明。(例子:图书馆排序在2004年被发表)
在计算机科学所使用的排序算法通常被分类为:
当相等的元素是无法分辨的,比如像是整数,稳定性并不是一个问题。然而,假设以下的数对将要以他们的第一个数字来排序。
1 | (4, 1) (3, 1) (3, 7)(5, 6) |
在这个状况下,有可能产生两种不同的结果,一个是让相等键值的纪录维持相对的次序,而另外一个则没有:
1 | (3, 1) (3, 7) (4, 1) (5, 6) (维持次序) |
不稳定排序算法可能会在相等的键值中改变纪录的相对次序,但是稳定排序算法从来不会如此。不稳定排序算法可以被特别地实现为稳定。实现的一个方式是人工扩充键值的比较(比如上面的比较中加入第二个标准:第二个键值的大小),从而在键值相同的两个对象之间进行比较时,使用在原先数据次序中的条目。然而,要记录这种次序通常牵涉到额外的空间负担。
在这个表格中,n是要被排序的纪录数量以及k是不同键值的数量。
==概述到此结束,下面分八篇文章依次对典型的八种排序进行图文并茂的讲解和c++实现。==
先贴一下八大排序的性能概括图:
再贴出来以后要用到的main函数和头文件。
1 |
|
最后就要打开传送门了:
csdn告诉我今天上传博客的次数到达上限了,然而我还有两个没有上传,那我只好先引流到我的个人博客了。
参考链接:
维基百科
数据结构与算法可视化可视化
数据结构与算法
排序算法可视化
经典排序算法总结与实现
]]>
[toc]
建议先看排序综述,传送门:数据结构与算法系列之一:八大排序综述。
基数排序(英语:Radix sort)是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。由于整数也可以表达字符串(比如名字或日期)和特定格式的浮点数,所以基数排序也不是只能使用于整数。基数排序的发明可以追溯到1887年赫尔曼·何乐礼在打孔卡片制表机(Tabulation Machine)上的贡献。
基数排序法会使用到桶 (Bucket),顾名思义,通过将要比较的位(个位、十位、百位…),将要排序的元素分配至 0~9 个桶中,借以达到排序的作用,在某些时候,基数排序法的效率高于其它的比较性排序法。
它是这样实现的:
基数排序的方式可以采用LSD(Least significant digital)或MSD(Most significant digital),LSD的排序方式由键值的最右边开始,而MSD则相反,由键值的最左边开始。
wordzzzz的小数据规模演示:
1 | /* |
其中,d 为位数,r 为基数,n 为原数组个数。在基数排序中,因为没有比较操作,所以在复杂上,最好的情况与最坏的情况在时间上是一致的,均为 O(d*(n + r))。
如果捋不清上述代码中的数组对应关系,可以参考一下下面这两张图的讲解,来源:http://www.cnblogs.com/skywang12345/p/3603669.html。
基数排序不改变相同元素之间的相对顺序,因此它是稳定的排序算法。
基数排序 vs 计数排序 vs 桶排序
这三种排序算法都利用了桶的概念,但对桶的使用方法上有明显差异:
系列教程持续发布中,欢迎订阅、关注、收藏、评论、点赞哦~~( ̄▽ ̄~)~
完的汪(∪。∪)。。。zzz
]]>
[toc]
建议先看排序综述,传送门:数据结构与算法系列之一:八大排序综述。
归并排序(英语:Merge sort,或mergesort),是创建在归并操作上的一种有效的排序算法,效率为 ${\displaystyle O(n\log n)}$ 。1945年由约翰·冯·诺伊曼首次提出。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用,且各层分治递归可以同时进行。
归并操作(merge),也叫归并算法,指的是将两个已经排序的序列合并成一个序列的操作。归并排序算法依赖归并操作。
递归法(Bottom-up)
原理如下(假设序列共有 ${\displaystyle n}$ 个元素):
迭代法(Top-down)
wikipedia的大数据规模演示:
wordzzzz的小数据规模演示:
1 | /* |
1 | /* |
比较操作的次数介于 ${\displaystyle (n\log n)/2}$ 和 ${\displaystyle n\log n-n+1}$ 。 赋值操作的次数是 ${\displaystyle (2n\log n)}$ 。归并算法的空间复杂度为: ${\displaystyle \Theta (n)}$。
对于归并排序有几点说明:
归并排序有以下几点优化方法:
1 | /* |
1 | /* |
系列教程持续发布中,欢迎订阅、关注、收藏、评论、点赞哦~~( ̄▽ ̄~)~
完的汪(∪。∪)。。。zzz
]]>
[toc]
建议先看排序综述,传送门:数据结构与算法系列之一:八大排序综述。
快速排序(英语:Quicksort),又称划分交换排序(partition-exchange sort),一种排序算法,最早由东尼·霍尔提出。在平均状况下,排序 ${\displaystyle n}$ 个项目要 ${\displaystyle O(n\log n)}$ (大O符号)次比较。在最坏状况下则需要 ${\displaystyle O(n^{2})}$ 次比较,但这种状况并不常见。事实上,快速排序通常明显比其他 ${\displaystyle O(n\log n)}$ 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来。
快速排序使用分治法(Divide and conquer)策略来把一个序列(list)分为两个子序列(sub-lists)。
步骤为:
wikipedia的大数据规模演示:
wordzzzz的小数据规模演示:
先给出公用接口,之后的三个递归实现和一个迭代实现在代码中都有详细的说明,我就不再在此赘述。
1 | /* |
1 | /* |
1 | /* |
快速排序是二叉查找树(二叉查找树)的一个空间最优化版本。不是循序地把数据项插入到一个明确的树中,而是由快速排序组织这些数据项到一个由递归调用所隐含的树中。这两个算法完全地产生相同的比较次数,但是顺序不同。对于排序算法的稳定性指标,原地分区版本的快速排序算法是不稳定的。其他变种是可以通过牺牲性能和空间来维护稳定性的。
快速排序的最直接竞争者是堆排序(Heapsort)。堆排序通常比快速排序稍微慢,但是最坏情况的运行时间总是 ${\displaystyle O(n\log n)}$ 。快速排序是经常比较快,除了introsort变化版本外,仍然有最坏情况性能的机会。如果事先知道堆排序将会是需要使用的,那么直接地使用堆排序比等待introsort再切换到它还要快。堆排序也拥有重要的特点,仅使用固定额外的空间(堆排序是原地排序),而即使是最佳的快速排序变化版本也需要 ${\displaystyle O(\log n)}$ 的空间。然而,堆排序需要有效率的随机存取才能变成可行。
快速排序也与归并排序(Mergesort)竞争,这是另外一种递归排序算法,但有坏情况 ${\displaystyle O(n\log n)}$ 运行时间的优势。不像快速排序或堆排序,归并排序是一个稳定排序,且可以轻易地被采用在链表(linked list)和存储在慢速访问媒体上像是磁盘存储或网络连接存储的非常巨大数列。尽管快速排序可以被重新改写使用在链串列上,但是它通常会因为无法随机存取而导致差的基准选择。归并排序的主要缺点,是在最佳情况下需要 ${\displaystyle \Omega (n)}$ 额外的空间。
快排的优化、归并排序的优化一向是面试的考察重点,至于算法的优化,重点还是要知道现有算法的不足之处。
针对上面提出的快排的局限性,我们依次做出优化策略:
下面的代码是对上述改进算法的实现:
1 | /* |
系列教程持续发布中,欢迎订阅、关注、收藏、评论、点赞哦~~( ̄▽ ̄~)~
完的汪(∪。∪)。。。zzz
]]>
[toc]
建议先看排序综述,传送门:数据结构与算法系列之一:八大排序综述。
冒泡排序(英语:Bubble Sort,台湾另外一种译名为:泡沫排序)是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。
冒泡排序对 ${\displaystyle n}$ 个项目需要${\displaystyle O(n)}$ )的比较次数,且可以原地排序。尽管这个算法是最简单了解和实现的排序算法之一,但它对于包含大量的元素的数列排序是很没有效率的。
冒泡排序算法的运作如下:
由于它的简洁,冒泡排序通常被用来对于程序设计入门的学生介绍算法的概念。
wikipedia的大数据规模演示:
wordzzzz的小数据规模演示:
1 | /* |
冒泡排序是与插入排序拥有相等的运行时间,但是两种算法在需要的交换次数却很大地不同。在最坏的情况,冒泡排序需要 ${\displaystyle O(n^{2})}$次交换,而插入排序只要最多 ${\displaystyle O(n)}$ 交换。冒泡排序的实现(类似上面)通常会对已经排序好的数列拙劣地运行( ${\displaystyle O(n^{2})}$ ),而插入排序在这个例子只需要 ${\displaystyle O(n)}$ 个运算。因此很多现代的算法教科书避免使用冒泡排序,而用插入排序取代之。
在面试中,一般都会涉及到算法的优化,重点考察的其实还是你对现有算法的理解,分析现有算法的缺点,就能找到优化的思路。
优化1:冒泡排序如果能在内部循环第一次运行时,使用一个旗标来表示有无需要交换的可能,也可以把最优情况下的复杂度降低到 ${\displaystyle O(n)}$ 。在这个情况,已经排序好的数列就无交换的需要。
优化2:可以记录某次遍历时最后发生数据交换的位置,这个位置之后的数据显然已经有序,不用再排序了。因此通过记录最后发生数据交换的位置就可以确定下次循环的范围了。
优化3:若在每次走访数列时,把走访顺序反过来,也可以稍微地改进效率。有时候称为鸡尾酒排序,因为算法会从数列的一端到另一端之间穿梭往返。
优化代码如下:
优化1:
1 | /* |
优化2:
1 | /* |
优化3:
1 | /* |
系列教程持续发布中,欢迎订阅、关注、收藏、评论、点赞哦~~( ̄▽ ̄~)~
完的汪(∪。∪)。。。zzz
]]>