文章目录

潘少的 BLOG

诗酒趁年华

周杰伦的《烟花易冷》和《洛阳伽蓝记》的前世今生

《烟花易冷》的前世今生

《烟花易冷》这首歌发行之时我便已听过了,按照周董『一张专辑一首中国风』的传统,《烟花易冷》便作为专辑《跨时代》的中国风歌曲面世,一曲终了,并没有初听《东风破》、《青花瓷》和《菊花台》这些前作般的惊艳之感,不仅如此,因为周杰伦在演绎这首歌时的不同于以往的唱腔 — 低沉阴冷,可能许多不常听周杰伦的人都会问:这是周杰伦唱的吗?甚至我这个老歌迷也觉得这的确是他刻意做的改变,所以当时并没有对这首歌有太多的青睐,就觉着是周杰伦的一首风格『奇怪』的中国风,也便止于此了。

前阵子,网易云『每日推荐』里给我推了这一首《烟花易冷》,重听之后,与几年前的感受很不一样,似乎听出了《东风破》的哀愁、《发如雪》的凄美、《青花瓷》的婉转,歌词也写出了一种败落、苍凉的感觉,而且歌词的故事性居然还比较完整,要知道方文山的中国风歌词那都是走的是印象画派、意识流小说这种风格 — 意象丰富、故事零碎。这倒是激起了我的兴趣,我上网搜了一下

tornado配合celery及rabbitmq实现web request异步非阻塞

CeleryRabitMQDiagram.png

Tornado和Celery介绍

1.Tornado

Tornado是一个用python编写的一个强大的、可扩展的异步HTTP服务器,同时也是一个web开发框架。tornado是一个非阻塞式web服务器,其速度相当快。得利于其非阻塞的方式和对 epoll的运用,tornado每秒可以处理数以千计的连接,这意味着对于实时web服务来说,tornado是一个理想的web框架。它在处理严峻的网络流量时表现得足够强健,但却在创建和编写时有着足够的轻量级,并能够被用在大量的应用和工具中。
进一步了解和学习tornado可移步:tornado官方文档

2.Celery

Celery 是一个简单、灵活且可靠的,处理大量消息的分布式系统,它是一个专注于实时处理的任务队列, 同时也支持任务调度。Celery 中有两个比较关键的概念:

  • Worker: worker 是一个独立的进程,它持续监视队列中是否有需要处理的任务;
  • Broker: broker 也被称为中间人或者协调者,br

深入golang之---goroutine并发控制与通信

Context调用链路

开发go程序的时候,时常需要使用goroutine并发处理任务,有时候这些goroutine是相互独立的,而有的时候,多个goroutine之间常常是需要同步与通信的。另一种情况,主goroutine需要控制它所属的子goroutine,总结起来,实现多个goroutine间的同步与通信大致有:

  • 全局共享变量
  • channel通信(CSP模型)
  • Context包

本文章通过goroutine同步与通信的一个典型场景-通知子goroutine退出运行,来深入讲解下golang的控制并发。

通知多个子goroutine退出运行

goroutine作为go语言的并发利器,不仅性能强劲而且使用方便:只需要一个关键字go即可将普通函数并发执行,且goroutine占用内存极小(一个goroutine只占2KB的内存),所以开发go程序的时候很多开发者常常会使用这个并发工具,独立的并发任务比较简单,只需要用go关键字修饰函数就可以启用一个goroutine直接运行;但是,实际的并发场景常常是需要进行协程间的同步与通信,以及精确控制子goroutine开始和

协同过滤Item-based算法实现电影推荐系统

摘要: 采用离线式计算推荐给每位用户的电影,采用Item-based算法并做了适当修改,
主要分两部分:

  1. 计算电影的相似度:利用调整的余弦相似度计算方法;
  2. 相似度加权求和:使用用户已打分的电影的分数进行加权求和,权值为用户未打分的各电影与打分的各电影的相似度,然后对所有相似度的和求平均。

系统详细设计

离线计算推荐电影模块

系统所用算法

本系统采用协同过滤(Collaborative Filtering)推荐算法。协同过滤推荐算法分为预测过程和推荐过程,其包括Item-based算法和User-based算法,但经查阅相关资料发现User-based算法存在两个问题:

  1. 数据的稀疏性:一个大型的电影推荐系统会有大量的电影信息,用户已打分的电影可能只占总量的很少一部分,不同用户之间电影打分的重叠性较低,导致算法无法找到一个兴趣用户;
  2. 算法的扩展性:最近邻算法的计算量会随着用户和电影信息数量的增加而增加,不适合信息量大的情况。所以本系统采用了Item-based协同过滤算法,并对其做了适当修改。

计算过程

读史时哪些故事让你动容?

读史,动容莫过于见证一个一个悲剧的发生。

诸葛孔明

读《三国演义》之时,我感觉像是亲历了孔明一生的大起大落,从踌躇满志辅佐刘皇叔兴复汉室,到最后回天无力命陨五丈原,可悲,可叹,可泪。
意气风发

卧龙翔天

  • 汉灵帝光和四年,孔明诞生于琅邪阳都。
  • 建安四年,孔明与友人徐庶等从师水镜先生司马徽,这一年,孔明19岁。
  • 建安十二年,刘备前往襄阳(今湖北襄樊)三顾茅庐,孔明对刘备陈说《隆中对》,详尽描述了他的三分天下之计。随即出山辅助刘备,这一年,孔明27岁。
  • 同年,孔明出山第一战,火烧博望坡,彼时的曹孟德

精品国漫荟萃之3D动画篇

传说江湖中有一条漫画鄙视链:日漫粉鄙视美漫粉,美漫粉鄙视国漫粉,国漫粉鄙视其他所有粉...

国漫比不上日漫美漫这是事实,整个产业真正发展起来才没几年而且整个产业非常浮躁,很少有业内人能真正静下心来制作一部优秀的国漫,所以质量普遍不如日漫也得承认,但是,国漫产业也在慢慢好转,近些年也不断有优秀的作品涌现,非常值得关注,我虽然也经常看日漫,但也追国漫中的精品,也算有些心得,在这里给大家推荐几部当前国漫中的优秀作品,有兴趣的可以去看一看,希望国漫崛起不仅仅是一句口号而已。

3D动画

秦时明月

秦时明月

故事概要

易水河畔,墨家巨子、燕国太子丹为阻止秦灭六国的步伐,遣使天下第一刺客荆轲前往咸阳刺杀秦王嬴政。荆轲刺秦,一是为了阻挡秦灭六国,二是因为他的恋人—天下第一美人丽姬被嬴政虏去为妃,彼时,丽姬已身怀六甲,腹中胎儿便是荆轲之子荆天明。剑圣盖聂,天下第一剑客

精品国漫荟萃之2D动画篇

2D动画

一人之下

《一人之下》是2015年2月26日开始在网络平台腾讯动漫上连载的一部网络漫画作品,作者是米二。2016年8月开始由浙江人民美术出版社发售漫画单行本。动画《一人之下》改编自米二创作的同名网络漫画,动画由日本动画公司Pandanium负责制作。中国网络版于2016年7月8日起每周五在版权网站更新国语版;7月15日起每周五更新日语版。日本电视版于2016年7月9日起每周六20:00在 TOKYO MX 首播,全12话。

《一人之下2》之罗天大醮于2017年10月27日起在网络更新,动画制作更换为上海绘界文化传播有限公司。

作者米二,漫画界人称二叔,擅长细腻的人物性格刻画、紧凑巧妙的剧情设计以及浓烈的国风,代表作有《Project大爱》、《九九八十一》、《一人之下》等,自其漫画在网络连载以来,累积人气超过百亿,2013年被列为中国漫画作家富豪榜第七名,《一人之下》将中国超能力者、道家武学体系、八卦玄学、《西游记》别解、传

数据库内部排序算法之两阶段多路归并排序算法实现

摘要: 两阶段归并排序算法是数据库查询的一个基础技术,在数据库应用中,常常采用“两阶段多路归并排序算法”来解决对海量数据的排序问题(这里的海量数据是指数据大小远远超过了数据库可用的主存的大小,无法将所有数据一次性的载入主存进行排序)。

前言

基于斯坦福大学的《数据库系统实现》,实现两阶段多路归并排序算法,通过merge-sort算法的实现,理解外存算法所基于的I/O模型与内存算法基于的RAM模型的区别;理解不同的磁盘访问优化方法是如何提高数据访问性能的。

首先生成一个具有10,000,000个记录的文本文件,其中每个记录由100个字节组成。实验只考虑记录的一个属性A,假定A为整数类型。记录在block上封装时,采用non-spanned方式,即块上小于一个记录的空间不使用。Block的大小可在自己的操作系统上查看,xp一般为4096 bytes。在内存分配50M字节的空间用于外部merge-sort。要求设计和实现程序完成下列功能:

  1. 生成文本文件,其中属性A的值随机产生。
  2. 对文本文件中的记录,按照属性A进行排序,其中在第二阶段的排序中每个子列表使用一

64位Ubuntu14.04下安装hadoop2.6单机配置和伪分布配置详解

环境

系统: Ubuntu 14.04 64bit

Hadoop版本: Hadoop 2.6.0 (stable)

JDK版本: oracle jdk7

操作

在Ubuntu下创建hadoop用户组和用户

  1. 创建hadoop用户组
sudo addgroup hadoop
  1. 创建hadoop用户
sudo adduser -ingroup hadoop hadoop

3. 给hadoop用户添加权限,打开/etc/sudoers文件

sudo gedit /etc/sudoers

在root ALL=(ALL:ALL) ALL下添加hadoop ALL=(ALL:ALL) ALL.

安装SSH server、配置SSH无密码登陆

ssh 是一个很著名的安全外壳协议 Secure Shell Protocol。 rsync 是文件同步命令行工具

sudo apt-get install ssh rsync

mapreduce之数据去重和数据排序实例

数据去重:
数据去重,只是让出现的数据仅一次,所以在reduce阶段key作为输入,而对于values-in没有要求,即输入的key直接作为输出的key,并将value置空。具体步骤类似于wordcount:

Tip:输入输出路径配置。

import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.m

hadoop平台wordcount程序的python实现

摘要: ​尽管Hadoop框架是用java写的,但是Hadoop程序不限于java,可以用python、C++、ruby等。本例子中直接用python写一个MapReduce实例,而不是用Jython把python代码转化成jar文件。

例子的目的是统计输入文件的单词的词频。

  • 输入:文本文件
  • 输出:文本(每行包括单词和单词的词频,两者之间用'\t'隔开)

Python MapReduce 代码

使用python写MapReduce的“诀窍”是利用Hadoop流的API,通过STDIN(标准输入)、STDOUT(标准输出)在Map函数和Reduce函数之间传递数据。
我们唯一需要做的是利用Python的sys.stdin读取输入数据,并把我们的输出传送给sys.stdout。Hadoop流将会帮助我们处理别的任何事情。

Map阶段:mapper.py

在这里,我们假设把文件保存到hadoop-0.20.2/test/code/mapper.py

#!/usr/bin/env python
import sy

网络爬虫详解与python实现

网络爬虫是捜索引擎抓取系统的重要组成部分。爬虫的主要目的是将互联网上的网页下载到本地形成一个或联网内容的镜像备份。这篇博客主要对爬虫以及抓取系统进行一个简单的概述。

网络爬虫的基本结构及工作流程

一个通用的网络爬虫的框架如图所示:

image

网络爬虫的基本工作流程如下:

  1. 首先选取一部分精心挑选的种子URL;
  2. 将这些URL放入待抓取URL队列;
  3. 从待抓取URL队列中取出待抓取在URL,解析DNS,并且得到主机的ip,并将URL对应的网页下载下来,存储进已下载网页库中。此外,将这些URL放进已抓取URL队列。
  4. 分析已抓取URL队列中的URL,分析其中的其他URL,并且将URL放入待抓取URL队列,从而进入下一个循环。

从爬虫的角度对互联网进行划分

对应的,可以将互联网的所有页面分为五个部分:

![image](http://118.126.91.74/upload/2018

Ubuntu下通过PPA仓库安装JDK

摘要: 在Ubuntu14.04下通过PPA仓库安装JDK,这样就无需自己配置环境变量,完全自动配置好,比较方便,而且还可以保持JDK的版本是最新的.

在我们继续了解如何安装Java之前,让我们快速地了解JRE、OpenJDK和Oracle JDK之间的不同之处。

JRE(Java Runtime Environment),它是你运行一个基于Java语言应用程序的所正常需要的环境。如果你不是一个程序员的话,这些足够你的需要。

JDK代表Java开发工具包,如果你想做一些有关Java的开发(阅读程序),这正是你所需要的。

OpenJDK是Java开发工具包的开源实现,Oracle JDK是Java开发工具包的官方Oracle版本。尽管OpenJDK已经足够满足大多数的案例,但是许多程序比如Android Studio建议使用Oracle JDK,以避免UI/性能问题。

检查Java是否已经安装在Ubuntu上
打开终端,输入以下命令:

java -version

如果有看到类似以下的输出,则表明你的电脑上已经安装好了JDK,否

MapReduce实现自定义二次排序

摘要: MapReduce框架对处理结果的输出会根据key值进行默认的排序,这个默认排序可以满足一部分需求,但是也是十分有限的。在我们实际的需求当中,往往有要对reduce输出结果进行二次排序的需求。对于二次排序的实现,网络上已经有很多人分享过了,但是对二次排序的实现的原理以及整个MapReduce框架的处理流程的分析还是有非常大的出入,而且部分分析是没有经过验证的。本文将通过一个实际的MapReduce二次排序例子,讲述二次排序的实现和其MapReduce的整个处理流程,并且通过结果和map、reduce端的日志来验证所描述的处理流程的正确性。

概述

MapReduce框架对处理结果的输出会根据key值进行默认的排序,这个默认排序可以满足一部分需求,但是也是十分有限的。在我们实际的需求当中,往往有要对reduce输出结果进行二次排序的需求。对于二次排序的实现,网络上已经有很多人分享过了,但是对二次排序的实现的原理以及整个MapReduce框架的处理流程的分析还是有非常大的出入,而且部分分析是没有经过验证的。本文将通过一个实际的MapReduce二次排序例子,讲述二次排序

用Dijkstra算法求解无向图的最短路径

Dijkstra算法是典型的算法。Dijkstra算法是很有代表性的算法。Dijkstra一般的表述通常有两种方式,一种用永久和临时标号方式,一种是用OPEN, CLOSE表的方式,这里均采用永久和临时标号的方式。注意该算法要求图中不存在负权边。      

微软编程比赛里面的一道难度系数5%的编程题目如下:

image
image

Dijkstra算法是用来求解图中顶点到另外其他顶点的最短路径的,根据题目,我们可以把每两个岛屿往来所花的最少金币当成图中的边权值,由此可以用Dijkstra算法来解决这个问题。

image