最近在测试小程序支付相关的东西,但是小程序支付要求后端是https的,只好先把后端https化,好在没有遇到太多的坑,特此记录一下
正常来说,https证书是收费的,比如阿里云、腾讯云、百度云、七牛这些,而且收费都是一年好几千的,表示用不起,还是用免费的吧,但是嘞,免费的也得用好用的,受信任的免费证书,不然没啥用。于是我就找到了Let’s Encrypt。
废话不多说,下面开始讲我怎么配置Let’s Encrypt证书的。
安装必备依赖
1 | sudo apt-get update |
安装证书,我选择手动模式-自己修改Nginx配置文件
1 | sudo certbot --nginx certonly |
交互式输入各种信息,感觉也并不困难~
/etc/letsencrypt/live/your.domain/fullchain.pem
/etc/letsencrypt/live/your.domain/privkey.pem
接下来可以手动修改Nginx配置文件了,Nginx如何配置不在本文讨论范围之内,下面贴一个示例
1 | server { |
Nginx配置修改之后,可以试下nginx -t
,检查一下配置文件是否有错误,如果没有错误,那就愉快地重启Nginx吧sudo service nginx restart
,然后试着用https访问以下,应该可以啦~
感谢访问我的个人博客的朋友,如果您感觉本站对您搜索的问题有所帮助,并感觉对本站还满意的话,顶一下吧,希望您把本站分享给您的朋友!在此对您表示由衷的谢意! :-)
]]>毕设用Laravel5.4做了个简单的点餐系统,需要PHP版本大于5.6.3,而我的阿里云ECS上的还是用的5.5.9.索性把它升到PHP7算了,但是在升级的过程中遇到了一些问题,在此记录一下. 我使用的是Apache+Mysql+PHP
本文适用于LAMP环境已经搭建好,单纯想从PHP5升级到PHP7的同学. 如何搭建LAMP环境不再赘述
所使用的命令如下:1
sudo aptitude purge `dpkg -l | grep php| awk '{print $2}' |tr "\n" "`
请注意!上述命令会卸载系统所有已经安装的PHP版本,请结合自身需要食用
添加PPA(Personal Package Archives):
1 | sudo apt-get install python-software-properties software-properties-common |
安装PHP7以及一些必要的扩展:
1 | sudo apt-get install php7.0-fpm php7.0-cli php7.0-mcrypt php7.0-mysql php7.0-mbstring php7.0-xml |
1 | sudo a2dismod php5 # 禁用Apache的PHP5模块 |
至此,如果没有任何问题的话,应该是成功地升级到了PHP7了. 如果启动Apache失败,可以打开Apache的错误日志进行对症下药~
a2enmod xxx
, 例如a2enmod php7.0
a2dismod xxx
, 例如a2dismod php5
sudo phpenmod xxx
, 例如sudo phpenmod mcrypt
感谢访问我的个人博客的朋友,如果您感觉本站对您搜索的问题有所帮助,并感觉对本站还满意的话,顶一下吧,希望您把本站分享给您的朋友!在此对您表示由衷的谢意! :-)
]]>前几天VS2017正式发布,作为“宇宙第一IDE”,自然是一件盛事,我还特地把Launch Event从头到尾看了一遍,感觉挺好的。就目前来说,我用Visual Studio主要是用来进行UWP开发(没错,就是那个1%),在用了几天之后,我来谈谈我的感受。
使用在线安装的时候,先选择要安装的组件,像我的话,就是选了个通用UWP开发套件以及C++ for UWP支持。然后很重要的一点是,你可以在安装时选择安装的语言,我在第一次安装VS2017的时候忘了切换语言,结果安装成VS2017中文版,这不是我想要的啊啊啊啊啊,然后去搜索VS2017 Language Pack,结果没搜到。。。。最后,还是在Visual Studio Install Guide上发现原来可以直接用安装程序修改语言。爽!
之前使用的VS2015,每次启动IDE都需要3-4分钟,没办法,4年前的渣渣笔记本。。。现在VS2017的启动速度达到了1-2分钟,爽!
之前开发一个UWP应用,对于应用图标问题真的是老大难,这么多种规格的图标都得自己弄,哎呀,麻烦!在VS2017中,提供了一个内置的Asset generator,你只需要一张源图片,直接可以生成各种规格的图标,爽!
VS2017改进太多,上面只是我感受较深的(我还只是一只菜鸟。。。)
在最后,我还想说一句,要说我最喜欢那个IDE,还是Jetbrains家的IntelliJ平台,包括IDEA, Android Studio等,感觉Visual Studio和IntelliJ在易用性还是有点差距的。。。。纯属个人看法,不喜勿喷 ^_^
感谢访问我的个人博客的朋友,如果您感觉本站对您搜索的问题有所帮助,并感觉对本站还满意的话,顶一下吧,希望您把本站分享给您的朋友!在此对您表示由衷的谢意! :-)
]]>对于那些不那么高端,不那么吊炸天的电脑来说,有时候内存不足是一件很蛋疼的事情。虽然现在标配4G,但即便到了8G,还是会不够用,因为打开一个Chrome,打开一个Android Studio,再多开几个标签页,8G内存就没了。
说说我的几点看法,以供大家参考:
Shift+Esc
打开Chrome的任务管理器,选择按内存大小排序
,发现Adblock Plus这个插件占用了我1.5G的内存,Oh My God!吓得我肥皂都掉了。。。难怪我的Ubuntu卡卡的,还以为是因为一个月没重启导致的,我二话不说,直接暂时禁用了这个插件,果然,内存回到正常水平,Ubuntu不再卡了,干杯!感谢访问我的个人博客的朋友,如果您感觉本站对您搜索的问题有所帮助,并感觉对本站还满意的话,顶一下吧,希望您把本站分享给您的朋友!在此对您表示由衷的谢意! :-)
]]>最近在自学UWP开发,此为背景
在使用VS2015编译项目,想部署到手机上的时候,出了点问题,我安装的是VS2015的中文版,除了错误之后,错误信息也是中文的,没办法,去百度搜索吧,可惜,我翻了又翻,找了又找,就只在博客园找到一篇文章稍微和我的问题有点联系。唉,我想这除了UWP生态还不完善,玩的人不那么多的原因之外,也有错误信息是中文的原因吧。。。于是我又把这一坨错误信息丢到百度翻译,然后Google搜索,还真在StackOverflow找到了一些类似的问题和回答,解决了我的问题,所以,还是英文版吧。
VS2017将会在2017年3月7日上市,根据自己的尿性,肯定得装最新版,所以还是用VS2017英文原版吧。。。
感谢访问我的个人博客的朋友,如果您感觉本站对您搜索的问题有所帮助,并感觉对本站还满意的话,顶一下吧,希望您把本站分享给您的朋友!在此对您表示由衷的谢意! :-)
]]>作为一名移动开发者,平时如果要开发一些小应用,那么,应用图标必不可少,有了图标原图之后,制作各种不同比例的应用图标也得费事,更何况还有三大平台(滑稽脸→_→),如果这些东西能够自动生成就好了,对,有这样一个网站,专门帮你干各种脏活累活。
图标工厂
网站截图如下:
移动应用图标生成工具,一键生成所有尺寸的应用图标。同时生成iOS、Android、Windows Phone平台的图标,遵循Apple、Google、Microsoft
官方标准,你可以试试。
感谢访问我的个人博客的朋友,如果您感觉本站对您搜索的问题有所帮助,并感觉对本站还满意的话,顶一下吧,希望您把本站分享给您的朋友!在此对您表示由衷的谢意! :-)
]]>我爱UWP,正如我所爱的这片土地(滑稽→_→)。
系统:Windows10一周年版
软件:Visual Studio 2015
硬件:可选(Lumia650/Lumia640/Lumia640XL/Lumia950/Lumia950XL等能够运行新版Windows10 Mobile系统的Windows手机)
如果要在UWP上使用数据存储,可以使用SQLite,这东西挺好用,而且SQLite已经进入了UWP官方的SDK,得到了官方支持,可靠。
在UWP上使用SQLite可以有多种方式,可以自行diy,也可以使用UWP SDK中的SQLite,本文中,使用的是EntityFramework + UWP SDK’s SQLite的方式。
第一步是新建一个UWP的C#项目,使用Visual Studio 2015,具体过程不再赘述。
第二步是添加项目依赖:
工具->NuGet包管理器->管理解决方案的NuGet程序包
,如图:Microsoft.NETCore.UniversalWindowsPlatform
,注意!,更新到5.2.2即可,不要更新到5.3.0,Microsoft.EntityFrameworkCore.Sqlite
, Microsoft.EntityFrameworkCore.Tools –Pre
依赖,(选中包括预发行版)使用EntityFramework进行编码,可以参考官方文档
编译运行,在本机上跑是没有任何问题的,如果你只是要在本机上运行,那么本文到此结束。
不过,如果你需要在移动设备上进行运行,那么仅仅参考上述官方文档还不够,因为你直接跑会报错,还是因为缺少某些依赖。
你需要安装VS2015扩展–SQLite for UniversalWindowsPlatform。安装完毕之后,重启VS2015,然后在项目下添加引用,如图:
至此,一个完整的UWP应用OK了,既能在PC上,也能在移动设备上运行。
感谢访问我的个人博客的朋友,如果您感觉本站对您搜索的问题有所帮助,并感觉对本站还满意的话,顶一下吧,希望您把本站分享给您的朋友!在此对您表示由衷的谢意! :-)
]]>我爱UWP,正如我所爱的这片土地(滑稽→_→)。
系统:Windows10一周年版
软件:Visual Studio 2015
硬件:Lumia650/Lumia640/Lumia640XL/Lumia950/Lumia950XL等能够运行新版Windows10 Mobile系统的Windows手机
在VS2015中开发好一个Demo之后,想在自己的Lumia650上安装试试,折腾了一会之后,终于弄好了,步骤如下:
如果是使用Windows平板等设备进行UWP开发调试,可以进行远程调试
,可以参考这篇博客
感谢访问我的个人博客的朋友,如果您感觉本站对您搜索的问题有所帮助,并感觉对本站还满意的话,顶一下吧,希望您把本站分享给您的朋友!在此对您表示由衷的谢意! :-)
]]>Jetbrains大法好,的确,他家多有良心,出品的开发工具不仅好使,而且人家还支持三大平台,真是没谁了。今天,我们来聊聊Ubuntu下无法输入中文的问题。
系统:Ubuntu16.04
软件:IDEA/Clion/Pycharm/PHPStorm/Rider
问题:Fcitx,搜狗输入法,不能输入中文
解决:去安装目录bin文件夹下找到idea.sh,用编辑器打开,添加:
1 | XMODIFIERS="@im=fcitx" |
感谢访问我的个人博客的朋友,如果您感觉本站对您搜索的问题有所帮助,并感觉对本站还满意的话,顶一下吧,希望您把本站分享给您的朋友!在此对您表示由衷的谢意! :-)
]]>也许你已经看过好几篇类似的文章了,但是还没搞定Return-Finally问题?那不妨给我一次机会,看看我的这篇文章,也许有收获呢(⊙o⊙)
先来看看下面这段代码:
1 | public static int testReturnFinally() { |
你能马上回答出上述函数的返回值么?如果是,并且知其所以然,那么你就可以直接跳转到本文的后面部分了;如果不是,且听我娓娓道来。
我们都知道,所谓finally,就是无论出现什么情况,在try
结束或catch
块结束之后执行的都是finally
代码块。那么这是如何实现的呢?对!我们可以
在try
和catch
代码块之后插入finally
代码块,这样,无论是执行哪一个分支,最后一定会执行finally
代码块!
那么,我们就来看看上述Java代码的字节码吧,如何查看?终端下使用指令javap -verbose TestReturnFinally.class
,其中,TestReturnFinally.class是要查看的字节码文件。
上述Java代码的字节码如下所示:
1 | 0: iconst_1 //将int型1推送至Java虚拟机栈顶 |
编译出来之后共14条字节码指令,指令的相关含义已经在后面注明了。看完上述字节码,我们可以知道:
还是上述那段代码,我们画个图来增强一下理解:
对上图的一些说明:
深入理解Java虚拟机-周志明
你真的了解try{ return }finally{}中的return?
感谢访问我的个人博客的朋友,如果您感觉本站对您搜索的问题有所帮助,并感觉对本站还满意的话,顶一下吧,希望您把本站分享给您的朋友!在此对您表示由衷的谢意! :-)
]]>请允许我做一次标题党(严肃脸),在这篇文章,咱不谈并发编程,也不论AtomicInteger,说点儿我初次使用AtomicInteger时的趣事儿。
话说当初在我看深入理解Java虚拟机一书的时候,看到了AtomicInteger这个类,它是并发条件下的原子自增运算,于是我就打开了IDEA,
输入这段示例代码,想看看运行结果:
1 | import java.util.concurrent.atomic.AtomicInteger; |
蛋是,奇迹发生了!运行结果是这样的:
race = 9994ai = 9999
我的天,MD制杖,什么鬼,你跟我说结果不是10000?我把头给看下来,再多运行几次?好勒,次次结果都不一样,我的天!这难道是JDK版本的
问题?不对啊,我的是Ubuntu 16.04的JDK8.0,怎么可能有问题!难道是BUG了?我的天,我竟然发现了JDK的BUG,怎么办,好紧张。。。。。。
最后,我才知道,原来是我太猴急了,在开启完全部线程之后,直接读取race和ai的值,这要能对就怪了,结果要是10000才是BUG呢。于是,
在输出结果直接加入Thread.sleep(500);
,让线程先睡会儿,然后再读取结果,对了!
这件事情告诉我们,细节决定成败。开个玩笑,我们下回再见!
感谢访问我的个人博客的朋友,如果您感觉本站对您搜索的问题有所帮助,并感觉对本站还满意的话,顶一下吧,希望您把本站分享给您的朋友!在此对您表示由衷的谢意! :-)
]]>客官,你要一份云音乐吗?下面是我的几张歌单,每首歌都是亲自挑选,也许也有你的菜哦。我的云音乐用户名是ScottWang1024。
乐报,不定期更新,歌慌了?来乐报 :-)
已经好久没有写博客了,我上一篇博客大概是在5月16号,今天7月14号,大概两个月.这段时间一直在弄一些其他事情,比如课程设计,再比如
期末考试
,不敢怠慢.
最近在学习Linux平台的Qt程序设计,但是有个很蛋疼的问题,Qt Creator不支持中文输入!!!我的个乖乖,为了弄好这个,百度了好多教程,走了很多弯路,同时也认识到网上存在一些错误的观点,特地记录一下,希望能有所帮助.
操作系统: Ubuntu 14.04 64bit
Qt版本: Qt5.6
如果你是使用ibus输入系统,看到这里就可以结束了,这里针对的是fcitx框架的输入法(比如说良心搜狗输入法).
以搜狗输入法为例(fctix),要使其支持中文输入,关键是要编译出共享库libfcitxplatforminputcontextplugin.so
, 这个东西好像是动态库,所以是因人而异的,所以即使你是和我一个版本的操作系统,我也不能将我的库共享给你,你得自己编译!!!!
必须指出,网上好多教程在文章中共享的libfcitxplatforminputcontextplugin.so
库是不可用的,因为这家伙是动态库啊啊啊啊啊!!!!!! 所以啊,不要用别人编译好的,十有八九不管用,自己老老实实编译!
下面是具体的编译步骤以及可能出现的问题及其解决方法.
在这一点上,我不想再重复造轮子了,我在开源中国找到了一篇相当完整的博客,你可以按照他的编译步骤慢慢来,出错了也没关系,人家文章中都有解决方案(在此感谢 =_=).
参考链接: http://my.oschina.net/lieefu/blog/505363
很重要的一点,编译出错不要紧,要有耐心,我也是编译了两次才编译成功的(主要是要处理各种依赖问题)
如果编译失败,最好删除整个fcitx-qt5文件夹重新弄.
放张图吧,作为这顿折腾的最终战果:
最后,感谢开源!
感谢访问我的个人博客的朋友,如果您感觉本站对您搜索的问题有所帮助,并感觉对本站还满意的话,顶一下吧,希望您把本站分享给您的朋友!在此对您表示由衷的谢意! :-)
]]>
本文讲述的是Java中参数传递相关的一些知识点.
先来看一段代码:
1 | /** |
你能立刻写出这段代码的输出结果么?如果可以,那么后面就不用看了;如果不能,那就继续.
这段代码的运行结果如下:
1 | [修改前]: Student{name='张三', id='001'} |
其实是Java中很基础的知识点,所以说,基础很重要.
方法传递参数时,对于基本类型的变量,传递的是变量的值的副本;对于引用类型的变量,传递的是地址的值的副本(所以说Java中都是
值传递
啊).
对于上述例子,modifyInfo方法内部,只是将student地址的副本指向了新的地址,真正的student(即方法外部的)的地址并未发生改变,从而原地址指向的内容也不会改变.所以,输出的结果都不会变啊啊啊啊啊啊啊啊啊啊…
感谢访问我的个人博客的朋友,如果您感觉本站对您搜索的问题有所帮助,并感觉对本站还满意的话,顶一下吧,希望您把本站分享给您的朋友!在此对您表示由衷的谢意! :-)
]]>最近开始学习NodeJS + MongoDB, 不过WebStorm默认只对NodeJS有较好的代码提示功能,至于MongoDB的驱动… 于是问题就来了,代码写得好累,不过,今天终于找到了较好的解决方案.
File –> Setting –> Languages & Frameworks –> JavaScript –> Libraries. 请看下图:
不用解释了吧.多说两句:
感谢访问我的个人博客的朋友,如果您感觉本站对您搜索的问题有所帮助,并感觉对本站还满意的话,顶一下吧,希望您把本站分享给您的朋友!在此对您表示由衷的谢意! :-)
]]>
好久没写文章了,想我否?开个玩笑,说正经的,最近学业甚忙,时间好紧…
今天我们来谈谈ViewPager,关于ViewPager的基础知识就不说了,相信大家都知道,主要谈谈ViewPager的View切换的动画效果,打造不一样的ViewPager.如果你使用小米手机,也许你就知道小米手机长按菜单键就会出现屏幕切换
的选项,里面有多达8种桌面切换的特效.没错,今天就是要实现这种效果.
我们都知道,大部分ViewPager都是普通的左右切换,这是默认的效果.但是如何加入不一样的动效呢?如果你去查看ViewPager的API,你会发现setPageTransformer
这个方法,这个方法是干嘛的呢?看命名就知道了,大概就是设置页面的切换效果.其实,官方早就给出了关于ViewPagerTransformer的两个样例,可以使ViewPager的切换更炫酷,分别是DepthPageTransformer
和ZoomOutPageTransformer
.
代码如下:
显示效果如下:
代码如下:
显示效果如下:
感谢访问我的个人博客的朋友,如果您感觉本站对您搜索的问题有所帮助,并感觉对本站还满意的话,顶一下吧,希望您把本站分享给您的朋友!在此对您表示由衷的谢意! :-)
]]>
乐报,不定期更新,歌慌了?来乐报 :-)
在Android开发中,有各种各样的坑,本文为一些问题提供一些解决思路.
在Android高版本中,移除了对HttpClient的支持,如果项目中使用之,会报错,解决方法有二:
添加legacy支持,在build.gradle中添加,
1 | android { |
将项目的SDK降到API21或者以下.
相信很多童鞋和我一样,都曾经被这个问题搞得焦头烂额,不懂啊,也一定看过很多的文章,但是越看越糊涂,因为信息太爆炸,互联网的信息真真假假,对对错错,有很多错误的观点一直在误导我们,所以尽量看一些大V写的文章比较好.扯远了,快回来.
关于滑屏问题,我觉得比较好的是:
下面说一下我的一些见解,如有问题,请留言:
1 | 说明:在当前视图内容偏移至(x , y)坐标处,即显示(可视)区域位于(x , y)坐标处。 |
在理解的时候,可以以视图原点(不是屏幕的左上角!)为参考点.以scrollTo(0, 100)为例,调用这个方法之后,View是不动的,动的是View原点处显示的内容,也就是移动画布,这里应该是显示画布(0, 100)处的内容,需要注意的是,画布的原点和View的原点是一样的,不过画布的原点在变化(因为画布在移动),可以参考下图,scrollTo(0, 100)的实际效果就是将画布上移,相当于隐藏了一部分内容
6.关于scrollBy1
说明:在当前视图内容继续偏移(x , y)个单位,显示(可视)区域也跟着偏移(x,y)个单位。
只要理解了scrollTo,这个应当也不难理解,这是相对移动,而不是scrollTo的绝对移动,一点差别而已.
getReadableDatabase()和 getWriteableDatabase()都可以得到一个可既可以读又可以写的数据库对象,不同的是,当磁盘空间满了之后, getReadableDatabase()得到的是一个只读的对象,而 getWriteableDatabase()则会抛出异常。
感谢访问我的个人博客的朋友,如果您感觉本站对您搜索的问题有所帮助,并感觉对本站还满意的话,顶一下吧,希望您把本站分享给您的朋友!在此对您表示由衷的谢意! :-)
]]>
众所周知,HashSet中不含有重复的元素.本文用几个例子来加深对不重复的理解.
先来看一段代码,代码如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56package com.yongf.algorithm;
import java.util.HashSet;
/**
* Created by yongf on 16-4-28.
*/
public class UnderstandingHashSet {
public static void main(String[] args) {
HashSet<Person> hs = new HashSet<>();
Person person = new Person("Scott Wang", 20);
hs.add(person);
person.setName("王用");
person.setAge(20);
hs.add(person);
System.out.println("hs = " + hs);
}
}
class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
运行结果为:1
hs = [Person{name='王用', age=21}]
看到这里,你可能就疑问了,唉,怎么只有一个元素,不是add了两个元素么?一个是(“Scott Wang”, 20),一个是(“王用”, 20),这输出不对吧.
其实你这么分析,好像挺对,不过你忽视了一个东西,判断是否重复基于hashCode(),而在上述代码中,Person类根本就没有重写hashCode()方法,所以,HashSet
好吧,那我们重写hashCode()方法,代码如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61package com.yongf.algorithm;
import java.util.HashSet;
/**
* Created by yongf on 16-4-28.
*/
public class UnderstandingHashSet {
public static void main(String[] args) {
HashSet<Person> hs = new HashSet<>();
Person person = new Person("Scott Wang", 20);
hs.add(person);
person.setName("王用");
person.setAge(20);
hs.add(person);
System.out.println("hs = " + hs);
}
}
class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
public int hashCode() {
return name.hashCode() + age * 100;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
现在hashCode()方法与name,age属性挂钩上了,在此运行,结果如下:1
hs = [Person{name='王用', age=20}, Person{name='王用', age=20}]
不过,这里的结果还是两个一样的,我的想法如下图所示:
不过,如果创建一个新的person1 = new Person(“Scott Wang”, 20),然后hs.add(person1),结果如下:1
hs = [Person{name='Scott Wang', age=20}, Person{name='Scott Wang', age=20}]
这显然也是不符合我们预期的,如果name和age都一样,我们预期两者是不同的,为此,我们需要重写equals方法,因为HashSet的判重涉及到了hashCode(), equals()方法, 于是,经过我们的两次修正,最后的代码如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73package com.yongf.algorithm;
import java.util.HashSet;
/**
* Created by yongf on 16-4-28.
*/
public class UnderstandingHashSet {
public static void main(String[] args) {
HashSet<Person> hs = new HashSet<>();
Person person = new Person("Scott Wang", 20);
hs.add(person);
Person person1 = new Person("Scott Wang", 20);
hs.add(person1);
hs.add(new Person("老码", 20));
hs.add(new Person("王用", 20));
System.out.println("hs = " + hs);
}
}
class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
public int hashCode() {
return name.hashCode() + age * 100;
}
public boolean equals(Object obj) {
if (obj instanceof Person) {
Person person = (Person) obj;
return person.name.equals(name) && (person.age == age);
} else {
return false;
}
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
最后的运行结果为:1
hs = [Person{name='王用', age=20}, Person{name='Scott Wang', age=20}, Person{name='老码', age=20}]
OK,这个结果在预料之中.那么,我们下次再见 =_=
感谢访问我的个人博客的朋友,如果您感觉本站对您搜索的问题有所帮助,并感觉对本站还满意的话,顶一下吧,希望您把本站分享给您的朋友!在此对您表示由衷的谢意! :-)
]]>
看到这个标题,你可能会想,估计又是个标题党,好吧,我承认,又装了.但是我保证,绝对不坑,挺好用的.我使用的是Ubuntu Kylin 14.04 LTS
但是,可能需要翻墙(我不确定,因为使用Ubuntu的时候我一直在墙外 :-)
需要使用的软件:
先说说Kazam,这是一个屏幕录制软件+截图软件,特性如下:
用浏览器打开这个网址: http://videotogif.thetimetube.com/ , 之前已经说过,可能需要翻墙,所以,你懂得…
这是一个网页, 特性如下:
嗯,差不多就这样.你可以亲自试试.
由于是在网页端进行操作,所以需要联网,对网速有一定要求,可能需要翻墙.还有一点,视频不要太大了,否则可能得不到想要的效果(这种需求应该不会有吧 -_- | )….
感谢访问我的个人博客的朋友,如果您感觉本站对您搜索的问题有所帮助,并感觉对本站还满意的话,顶一下吧,希望您把本站分享给您的朋友!在此对您表示由衷的谢意! :)
]]>