IMOOC MySQL开发技巧

主要涉及:JOIN 、JOIN 更新、GROUP BY HAVING 数据查重/去重。 INNER INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL JOIN(MySQL 不支持)、CROSS JOIN 这是在网上找到的非常好的一篇博文,图解 JOIN 语句: CODING HORROR-A Visual Explanation of SQL Joins 下图可以很清楚的明白,JOIN 的数据选取范围: 更新使用过滤条件中包括本身的表 更新 t1 t2 表中 col_a 重复的字段: UPDATE t1 SET col_a = 'hi' WHERE t1.col_a IN ( SELECT b.col_a FROM t1 a INNER JOIN t2 b on a.col_a = b.col_a ) ; ERROR:1093 可转换为: UPDATE t1 aa JOIN( SELECT b.col_a FROM t1 a INNER JOIN t2 b on a.col_a = b.col_a )bb on aa.col_a= bb.col_a SET col_a = 'hi' ; 查询重复数据、删除重复数据 利用 GROUP BY 和 HAVING 查询重复数据: ...

July 25, 2016 · 1 min · 142 words · Me

写一些人文的日志

还是越来越觉的思想重要。每周给自己博客的计划是写三篇,稍稍改动下:其中一篇要是关于思想上的。 周末的时候和北京的朋友们:龙、梦、思,小聚了下。问起毕业一个月感觉有啥变化,都说没啥。是,刚刚才一个月。可我心里却有些小慌张,总想搞个大新闻,让自己不那么平凡。是眼高手低吗? 现在每天都会跑跑步,已经坚持了 6 天了也习惯了,挺赞的。也总是去了解新鲜的东西技术,并且尝试运用它们,才有点原来学长们不喜欢用用过的东西做事情的劲。关于英语的学习,现在找到一个法:阅读英文的技术教程或者技术文档。这些东西肯定和计算机有关,也写的比较通俗,感觉挺有收获的。 最近状态还不错,就是晚上想看会书,可眼睛挺累的。职业生涯的第一个月,经济有些困难。想参与个开源项目。现在手头项目就自己一个人在编,有点孤独,也不知道自己设计的和写的哪里好哪里不好。还有就是在 GitHub 或者 StackOverflow 有人给自己点赞,感觉挺激动的。 因为公司都是 Google 的服务,出门很方便,GitHub 也用的越来越多。时不时总能搜到、看到很多工程师写的博客,有教程、有分享,还有我最喜欢看的:他们的思想。我觉的他们现在都是比我棒的,我想知道他们是怎么想的、怎么解决问题、怎么看待问题、看待工作生活。 最后毒奶一口自己: 与那些名校的同学的差距不是毕业后的薪水,也不是学业水平的差距,而是一种思维方式与做事标准。 对自己的标准会不由自主的降低以适应这个环境,减少自身与环境的冲突,在一个低标准下,自觉“满意”的度过每一天。 为什么名企喜欢要名校的学生?其实名企要的不是多么高的 GPA 成绩,而是一种内在的精神状态。他们的辛苦不叫辛苦,也不为百万年薪。辛苦是他们获得自我实现的途径,自我是实现使他无穷快乐。这世界就是一拨人在昼夜不停的高速运转,另一拨人起床发现世界变了。 我们大部分人的工作和生活状态是怎样的呢? 上班稍微努力点就开始讲究公平,自己不得志就开始抱怨公司和领导,下班后看几页书就觉得自己特别上进,辛苦上几天就觉得自己要赶紧去享受一下生活了,加几天班就担心自己会过劳死。 遇到些鸡毛蒜皮的小事儿就郁郁寡欢,仿佛遇到了天大的人生难题磨磨唧唧解决不清。看见牛逼的人也会心生羡慕,但总也突破不了努力却总不得要领魔咒。 越能干,越努力;越有钱,越上进 而造成这一切的差异,最主要的来自人的精神内核。 你要用牛人的标准要求自己,不断的走到牛人当中去,拉近和牛人之间的距离。当你觉得自己能够成为他们中的一员的时候,你才能成为了真正的牛人。 成功?我才刚上路呢。 – EOF –

July 11, 2016 · 1 min · 30 words · Me

Ubuntu JDK Nginx WildFly MySQL 环境配置

新项目部署上线,主要参考 世雷博客 的内容,自己也总结了下。从 JDK 安装、Web 容器、数据库,都有涉及比较全面。 JDK8 安装 JDK8 1、添加软件源 sudo add-apt-repository ppa:webupd8team/java 2、更新软件源 sudo apt-get update 3、安装 jdk1.8 sudo apt-get install oracle-java8-installer 查看 Java 安装路径 sudo update-alternatives --config java sudo update-alternatives --config javac 查看 Java 安装后的版本 java -version (扩展)增加多版本 JDK 和切换方法 1、安装 JDK 6 和 JDK 7 sudo apt-get install oracle-java6-installer sudo apt-get install oracle-java7-installer 2、查看所有 JDK 安装版本 sudo update-java-alternatives -l java-6-oracle 3 /usr/lib/jvm/java-6-oracle java-7-oracle 4 /usr/lib/jvm/java-7-oracle java-8-oracle 2 /usr/lib/jvm/java-8-oracle 3、通过 -s 参数可以方便的切换到其它的 JDK 版本 ...

July 7, 2016 · 4 min · 768 words · Me

GitHub Webhook 自动部署 Hexo

在 GitHub Pages 不被百度收录解决方案 中,思路二是通过 Dnspod 的智能 DNS 服务。简而言之就是搭建一个 Server,做一个 Blog 的镜像站,专为百度收录使用。 但是每次将新建的博客文章 PUSH 到 GitHub 后,还要再登陆 Server PULL 一下,简直是太蠢了。那有什么解决办法吗?答:GitHub Webhook。 Webhook Webhook,也就是人们常说的钩子,是一个很有用的工具。你可以通过定制 Webhook 来监测你在 Github.com 上的各种事件,最常见的莫过于 push 事件。 如果你设置了一个监测 push 事件的 Webhook,那么每当你的这个项目有了任何提交,这个 Webhook 都会被触发,这时 Github 就会发送一个 HTTP POST 请求到你配置好的地址。 如此一来,你就可以通过这种方式去自动完成一些重复性工作;比如,你可以用 Webhook 来自动触发一些持续集成(CI)工具的运作,比如 Travis CI;又或者是通过 Webhook 去部署你的线上服务器。 Github 开发者平台的文档中对 Webhook 的所能做的事是这样描述的: You’re only limited by your imagination. 响应 Webhook 在参考文章里博主是使用 Node.js 编写的服务端响应代码,但考虑到自己对 Node.js 不熟悉,还要部署环境,所以改用 Python 语言编写响应代码。 自己在 GitHub 搜索下 github webhook,language 选择 Python 便找到了 Python 编写的:razius/github-webhook-handler ...

July 1, 2016 · 2 min · 320 words · Me

GitHub Pages 不被百度收录解决方案

2019-12-02 更新:现在我的 Blog 还是用的 GitHub Pages,反正没有备案的域名不会被百度收录。 2017-04-22 更新:现在我的 Blog 使用的是 UFOVPS 直接部署的。 在 使用 Hexo 和 Github 搭建个人独立博客 几天后,发现百度并不对博客进行收录。 在天朝使用百度搜索毕竟多数,使用百度站长工具-抓取诊断,在百度 Spider 抓取结果返回 HTTP 头:HTTP/1.1 403 Forbidden,原来是 GitHub 禁止了百度爬虫的爬去。 Google 后早已有许多热心网友给出了解决方案,自己在这里总结下。 思路一:利用 CDN 解决百度爬虫被 Github Pages 拒绝的问题 解决思路 既然 Github 彻底和百度决裂了,那我们也只能自己动手来解决了。Github 可能是封了百度的 IP,也有可能是封了百度爬虫的 User-Agent。 所以要解决这个问题,最好就不要让百度爬虫直接访问 Github 了,需要在中间套一层 反向代理。 那么问题又来了,既然我可以搭一个反向代理服务器了,那我为什么不直接把博客放在这台服务器上?放 Github Pages 上不就是为了少一台服务器,少一点费用吗? 那有没有免费的第三方反向代理服务呢?当然有,其实现在各种 CDN 服务 不就是吗?而且还额外提供了各种网络环境下的加速功能。 但是使用 CDN 也会有一个非常大的缺点:只能对 静态资源 做,因为 CDN 和反向代理有一个很大的不同就是:它会做缓存,并向各个节点分发。 所以 CDN 一般都是用来给静态资源做加速的。如果你对动态页面做加速,用户看到的页面在一段时间内就一直不会变了。但是我们不怕!因为 Github Pages 本来就是全静态的! 国内提供 CDN 服务的有:加速乐、七牛云存储、又拍云等。 ...

June 30, 2016 · 1 min · 145 words · Me

Eclipse Maven Spring SpringMVC Mybatis 整合

新项目自己撘框架,想着用点新的。看慕课网 Java 高并发秒杀 API 的系列课程时很受益。所以想着仿着来使用:Mavan-Spring-SpringMVC-Mybatis 的架构。框架整合的代码我已上传到我的 Github:maven-mybatis-spring-springmvc。 本示例是在:Ubuntu15 上实现的;Windows 上安装 Maven 将不太相同。 Maven Install 2016-09-10 更新:较新版 Eclipse 都有集成 Maven,所以并不需要安装 Run command sudo apt-get install maven, to install the latest Apache Maven. Run command mvn -version to verify your installation. Where is Maven installed? The command apt-get install the Maven in /usr/share/maven The Maven configuration files are stored in /etc/maven Eclipse Maven Plugin - m2e 2016-09-10 更新:较新版 Eclipse 都有集成 Maven,所以并不需要安装 open Eclipse -> Help -> click “Install New Software” -> click “add” Name:m2e Location:http://download.eclipse.org/technology/m2e/releases click “ok” -> click “Maven Integration for Eclipse” -> click “Next” restrat Eclipse config m2e -> Window -> Preferences -> Maven -> Installations -> click “Add…” -> select Maven Create a Maven Project File -> New -> New Maven project select “Use default Workspace location” select “maven-archetype-j2ee-simple” input info -> Finish 选中项目右键菜单中选择 Properties -> Project Facets -> select “Dynamic Web Module” Version “3.1” Tips: ...

June 27, 2016 · 4 min · 687 words · Me

使用 GitHub 和 Hexo 搭建个人独立博客

Wordpress 这类博客系统功能强大,可对与我只想划拉的写点东西的人,感觉大材小用了。而且 Wordpress 需要部署,网站的服务器也会带来问题,国内的服务器首先需要备案,费用不低,国外服务器访问速度受影响。 近来接触到一种新的博客系统 Hexo,它的不同地方就是将:在上线编写博客和页面渲染的过程在线下完成。 在本地编写博文的 Markdown 文件,使用 Hexo 将博客网站的所有前台 HTML 等全部生成,让后将生成的文件上传的服务器就行了。 那么原来 wp 中的评论等动态功能怎么办呢?放心第三方服务商早已为我们考虑了。例如:disqus就是一家第三方社会化评论系统,主要为网站主提供评论托管服务。 本文的操作的系统环境是 Ubuntu 15,Windows 下的搭建可触类旁通。 了解 Hexo A fast, simple & powerful blog framework Hexo 是一个快速、简洁且高效的博客框架。Hexo 使用 Markdown(或其他渲染引擎)解析文章,在几秒内,即可利用靓丽的主题生成静态网页,Hexo setup 官方文档。 ...

June 24, 2016 · 1 min · 196 words · Me

Ubuntu 下连接蓝牙键盘

新买了 Filco Majestouch Convertible 2 键盘。在自己的笔记本上连接没什么问题,搬到公司 Ubuntu 的 IBM 笔记本这么都连接不上,查找解决。 安装蓝牙的 hcidump: sudo apt-get install bluez-hcidump 然后,监测蓝牙事件 sudo hcidump -at 再次连接蓝牙键盘,可以看到输出事件中有一条 Pin ... 键盘输入对应的 Pin,Enter,连接成功。 – EOF –

June 14, 2016 · 1 min · 28 words · Me

Java final 修饰符

final 修饰符 final 修饰符表示不可变。类似 C 中的 constant。用于修饰变量表示不可变的变量。用于修饰方法表示不可被重写。用于修饰类表示不可被继承。 final 的成员变量 成员变量随着类或者实例的初始化而初始化。在类初始化时,静态变量就会被分配内存并初始化。对于实例变量,系统会在实例初始化的时候初始化这些变量。 由于成员变量会被系统隐式的初始化。如果程序员不显式的初始化它们,那他们会变成 0,false,null 这样的值。失去了意义。 所以 final 修饰的成员变量必须显式的初始化。 类变量:必须在静态初始化块,或者在声明的时候初始化 实例变量:必须在非静态初始化块,声明时,或者构造函数中初始化。 final 的局部变量 对于形参:在方法内部无法对其进行赋值。 方法体内的 final 局部变量:只能赋值一次。 final 的基本类型变量和引用类型变量 基本类型变量:值不可变。 引用类型变量:指针不可变,但是指向的内存区域可变。 public class FinalVariableTest { public static void main(String[] agrs){ final int[] arr = {1,23,4,5}; System.out.println(Arrays.toString(arr)); arr[2] = 20; System.out.print(Arrays.toString(arr)); } } //Console //[1, 23, 4, 5] //[1, 23, 20, 5] final 的宏替换 对于 final 的变量来说,不管是类变量,实例变量还是局部变量。只要在编译的时候可以确定,那么编译器就会把它看成一个直接量而不是变量。 比如: ...

June 13, 2016 · 2 min · 367 words · Me

【Core Java】读书笔记

自己是第一次把一本厚厚的的技术类书读一遍。不过 7、8、9、10 章讲的是关于图形的就是翻了翻,没怎么看。第 4 章 对象与类,里面有很多非常基础,可以补充一些知识细节。第 14 章 多线程,是自己最陌生的,慕课网上有节课 深入浅出 Java 多线程 讲到的例子就是书上例子的变形,可以对照理解。第二遍阅读做做笔记。 本文总结的是书中的:第 3 章 Java 的基本程序设计结构、第 4 章 对象与类。 3 Java 的基础程序设计结构 3.3 数据类型 Java 是一种强类型语音。在 Java 中,一共有 8 中基本类型(primitive type),其中有 4 种整型、2 种浮点类型、1 种用于表示 Unicode 编码的字符单元的字符类型 char 和 1 种用于表示真值的 boolean 类型。 Java7 开始,还可以为数字字面量加下划线,如用 1_000_000 表示一百万。这些下划线只是为了让人更易读。Java 编译器会去除这些下划线。 浮点数值不适用于出现舍入误差的金融计算中。其主要原因时浮点数值采用二进制系统表示,而在二进制系统中无法精确的表示分数 1/10。这就好像十进制无法精确地表示 1/3 一样。如果需要在数值计算中不含有任何舍入误差,就应该使用 BigDecimal 类。 3.4 变量 尽管$是一个合法的 Java 字符,但不要在自己的代码中使用这个字符。它只用在 Java 编译器或其他工具生成的名字中。 3.6 字符串 由于不能修改 Java 字符串中的字符,所以在 Java 文档中将 String 类对象称为不可变字符串。 如果虚拟机始终将相同的字符串共享,就可以使用 == 运算符检测是否相等。但实际上只有字符串常量是共享的,而 + 或者 substring 等操作产生的结果并不是共享的。因此,千万不要使用 == 运算符测试字符串的相等性,以免在程序中出现糟糕的 bug。从表面上看,这种 bug 很像随机产生的间歇性错误。 3.10 数组 在 Java 中,允许将一个数组变量拷贝给另一个数组变量。这时,两个变量将引用同一个数组: int[] luckyNumbers = smallPrimes; luckNumbers[5] = 12; // now smallPrimes[5] is also 12 如果希望将一个数组的所用值拷贝到一个新的数组中去,就要使用 Arrays 类的 copyOf 方法: int[] copiedLuckyNumbers = Arrays.copyOf(luckyNumbers, luckyNumbers.length); 4 对象与类 4.1 面向对象程序设计概述 类之间的关系 依赖(uses-a) 聚合(has-a) 继承(is-a) 依赖(dependence),即 uses-a 关系。例如,Order 类使用 Account 类是因为 Order 对象需要访问 Account 对象查看信用状态。因此,如果一个类的方法操纵另一个类的对象,我们就说一个类依赖于另一个类。 应该尽可能的将相互依赖的类减至最少。我们如果 A 不知道 B 的存在,他就不会关心 B 的任何改变(这意味着 B 的改变不会导致 A 产生任何 bug)。用软件工程的术语来说,就是让类之间的耦合度最小。 聚合(aggressive),即 has-a 关系。例如,一个 Order 对象包含一些 Item 对象。聚合关系意味着类 A 的对象包含类 B 的对象。 继承(inheritance),即 is-a 关系。例如,RushOrder 类由 Order 类继承而来。在具有特殊性的 RushOrder 类中包含了一些用于优先处理的特殊方法,以及一个计算运费的不同方法;而其他的方法从 Order 类继承了来的。一般而言,如果类 A 扩展类 B,类 A 不但包含从类 B 继承的方法,还会拥有一些额外的功能。 4.2 使用预定义类 在对象与对象变量之间存在着一个重要的区别。例如: Date deadline; // deadline doesn't refer to any object 定义了一个对象变量 deadline,它可以引用 Date 类型的对象。但是,一定要认识到:变量 deading 不是一个对象,实际上也没有引用对象。此时,不能将任何 Date 方法应用与这个变量上。 s = deadline.toString(); // not yet 必须首先初始化变量 deadline,可以用新构造的对象初始化这个变量,也可以让这个变量引用一个已存在的对象。 一定要认识到:一个对象变量并没有实际包含一个对象,而仅仅引用一个对象。 在 Java 中,任何对象变量的值都时对存储在另一个地方的一个对象的引用。new 操作符的返回值也是一个引用。 可显示地将对象变量设置为 null,表明这个对象变量目前没有引用任何对象。 4.3 用户自定义类 类文件必须与 public 类的名字相匹配。在一个原文件中,只能有一个共有类,但可以有任意数目的非共有类。 可以用 public 标记实例域,但这是一种极为不提倡的做法。public 数据域允许程序中的任何方法对其进行读取和修改。这就完全破坏了封装。这里强烈建议将实例域标记为 private。 构造器: 构造器与类同名 每个类可以有一个以上的构造器 构造器可以有 0 个、1 个或多个参数 构造器没有返回值 构造器总是伴随着 new 操作一起调用 类: 私有的数据域 公有的域服务器方法 公有的域改变方法 不要编写返回引用可变对象的访问器方法。 class Employee { ... private Date hireDay; public Date getHireDay() { return Date hireDay; } } 这样会破坏封装性!代码: Employee harry = ...; Date d = harry.getHireDay(); doule tenYearsInMilliSeconds = 10 * 365.25 * 24 * 60 * 60 * 1000; d.setTime(d.getTime() - (long)tenYearsInMilliSeconds); // let's give Harry ten years of added seniority 出错的原因很微妙。d 和 harry.hireDay 引用同一个对象。对 d 调用更改器方法就可以自动地改变这个雇员的私有状态! 如果需要返回一个可变对象的引用,应该首先对它进行克隆(clone)。对象 clone 是指存放在另一个位置上的对象副本。 public Date getHireDay() { return Date hireDay.clone(); } Employee 类的方法可以访问 Emloyee 类的任何一个对象的私有域 。 class Employee { public boolen equals(Employee other) { return name.equals(other.name); } } final 修饰符大都应用于基本(primitive)类型域,或不可变(immutable)类的域(如果类中的每个方法都是不会改变其对象,这中类就是不可变的类。例如,String 类就是一个不可变的类)。对于可变的类,使用 final 修饰符可能会对读者造成混乱。代码 private final Date hiredate; 仅仅意味着存储子 hiredate 变量中的对象引用在对象构造之后不能被改变,而并不意味着 hiredate 对象是一个常量。任何方法都可以对 hiredate 引用的对象调用 setTime 更改器。 4.4 静态域与静态方法 每一个雇员对象都有一个自己的 id 域,但这个类的所有实例将共享一个 nextId 域。 class Employee { private static int nextId = 1; private int id; } 换句话说,如果有 1000 个 Employee 类的对象,则有 1000 个实例域 id。但是,这有一个静态域 nextId。即使没有一个雇员对象,静态域 nextId 也是存在。它属于类,而不属于任何独立的对象。 可以使用对象调用静态方法。例如,如果 harry 是一个 Employee 对象,可以用 harry.getNextId() 代替 Employee.getNextId()。不过这中方式很容易造成混淆,其原因是 getNextId 方法计算的结果与 harry 毫无关系。我们建议使用类名来调用静态方法。 每一个类可以有一个 main 方法。这是一个常用于对类进行单元测试的技巧。 4.5 参数方法 Java 程序设计语言总是采用按值调用。也就是说,方法得到的是所有参数值的一个拷贝。 Java 程序设计语言中方法参数的使用情况: 一个方法不能修改一个基本数据类型的参数。 一个方法可以改变一个对象参数的状态。 一个方法不能让对象参数引用一个新的状态。 4.6 对象构造 要完整的描述一个方法需要指出方法以及参数类型,这叫做方法的签名(signature)。 返回类型不是方法签名的一部分。也就是说,不能有两个名字相同、参数类型也相同却返回不同类型值的方法。 如果在编写一个类时没有编写构造器,那么系统就会提供一个无参数构造器。这个构造器将所有的实例域设置为默认值。实例域中的数值类型数据设置为 0、布尔型数值设置为 false、所有对象变量将设置为 null。 如果类中提供了至少一个构造器,但是没有提供无参数的构造器,则在构造对象时如果没有提供参数就会被视为不合法。 对每一个实例域都可以被设置为一个有意义的初值,这是一种很好的设计习惯。 class Employee { private String name = ""; ... } 4.10 类设计技巧 一定要保证数据私有。绝对不要破坏封装性。 一定要对数据初始化。 不要在类中使用过多的基本类型。就是说,用其他的类代替多个相关的基本类型的使用。 不是所有的域都需要独立的域访问器和域更改器。 将职责过多的类进行分解。 类名和方法名要能够体现它们的职责。

May 6, 2016 · 2 min · 417 words · Me