豪翔天下

Change My World by Program

0%

确实在意料之外! 最近连续几个月的周更,只是想跟上我博客的节奏,早点让公众号的更新进度赶上博客的更新进度。在上周突然接到“原创开通邀请通知”,给我开通了声明、赞赏、留言、页面这四个模块,所以一个个人订阅号的全部功能我几乎就同时拥有了。

现在看来,拿到原创功能原来并不用那么难。在保证你的内容是真的原创的情况下,只需要能稳定更新几个月就行了。就这么简单,我猜,微信团队现在对原创的审核应该都是交给机器在做,对内容质量的要求并不高,对订阅数量和实际阅读数量的要求都不高。这可不是我胡乱猜测的,因为我知道自己的水平。最近的微信文章基本都是转载的我个人博客前几年的历史文章,内容的质量相对是比较低的;订阅数量是非常低的,但是不方便透露;阅读数大家是有目共睹的,真的低。所以,这个原创功能,真的不难。而且大多数人对原创这个标识根本就不敢兴趣,用户只关心内容本身,而不是来源。

阅读全文 »

别离生活太远,最近发的博文都不怎么接地气,这一篇原本是记录在numbers里面的,现在直接记录在博客里,这才是我的记录工具。

项目 渠道 品牌 价格
电源延长线 京东 包尔星克(1.5m) 12.9
茶几 京东 乐和居 856
钻头套装 京东 工蜂 26
燃气热水器 京东 美的(JSQ22-12HWA) 1059
电视 京东 乐视超55 3868
电动牙刷 京东 飞利浦 0(活动赠送)
电视柜 京东 华纳斯 1632.5
主卧空调 京东 美的(KFR-35GW/WXAA2正1.5匹) 3199
次卧空调 京东 奥克斯(KFR-26GW大1匹) 1899
冰箱 京东 海尔(BCD-571WDEMU1) 3399
人体感应灯 京东 壹秀 47
儿童床 京东 健优美 3030
开关插座 京东 施耐德 733.5
无线路由器 京东 斐讯 0
角阀 京东 莱尔诗丹(8个) 165
水龙头 京东 厦能厨卫(6分) 21
生料带 京东 莱尔诗丹(5个) 9.9
绝缘胶带 京东 赛拓(3卷) 9.9
空气开关 京东 德力西(7个) 152.44
六类屏蔽模块 京东 安普康(3个) 76.4
USB开关插座 京东 简宜电气(9个) 127.6
电动牙刷 京东 飞利浦 250
洗衣机 京东 西门子 2398
抽油烟机+燃气灶 京东 老板 2800
六类屏蔽网线 京东 秋叶原(100m) 190
插座暗盒 京东 西蒙电气(42个) 96.6
沐浴花洒 京东 四季沐歌 299
吸顶灯 京东 松下 999
阳台吸顶灯 京东 松下 0
电饭煲 京东 九阳 139
切磨套装 淘宝 淘宝店铺 37
毛巾架 淘宝 淘宝店铺 29.9
塑料凳 淘宝 淘宝店铺(4根) 36.5
木凳子 天猫 淘宝店铺(6根) 179.4
厨房防油贴纸 淘宝 淘宝店铺(10米) 25.8
冰箱增高垫 淘宝 8个 17.6
储物凳 淘宝 2个 67.04
电钻 天猫 淘宝店铺 49
蓝牙音箱 天猫 boas 48
电风扇 天猫 艾美特电器旗舰店 169
扫把 天猫 淘宝店铺 18.9
浴室LED灯 天猫 20w 18
主卧窗帘轨道 淘宝 淘宝店铺 154
钻头 淘宝 3个 3.6
客厅窗帘轨道 天猫 淘宝店铺 97.8
衣柜杆 天猫 淘宝店铺 15.8
次卧窗帘轨道 淘宝 淘宝店铺 48
儿童床上铺床垫 天猫 淘宝店铺 347
儿童床下铺床垫 天猫 淘宝店铺 610
主卧床 天猫 林氏木业家具旗舰店 2478
梯子 淘宝 淘宝店铺 80
nas主板 淘宝 j3455 534.7
nas电源 淘宝 淘宝店铺 48.8
万能扳手 淘宝 淘宝店铺 18.93
键鼠套装 天猫 淘宝店铺 18.18
甲醛检测试纸 天猫 淘宝店铺 8.94
餐厅灯泡 天猫 3个 16.5
锂电钻 天猫 淘宝店铺 48
网线钳套装 淘宝 淘宝店铺 24.8
水槽 淘宝 欧淇 174
餐厅灯 天猫 淘宝店铺 182
网线插座 淘宝 2个 17.6
一次性口罩 淘宝 淘宝店铺 4.4
卷尺 淘宝 淘宝店铺 8
万能遥控器 小米 小米官网 79
米家智能家庭套装 小米 小米官网 375
小米水质TDS检测笔 小米 小米官网 35
小米空气净化器2 小米 小米官网 649
空气净化器滤芯 小米 小米官网 149
沙发床 宜家 重庆宜家 2999
餐桌 宜家 重庆宜家 1299
主卧次卧吸顶灯 飞利浦 2个 160
总计 38895.83

基装4万+软装4万,总共8万多。软装的钱基本上是京东的免息分期,大概后年就能还完了。。。

SQLAlchemy是Python最广泛使用的一个ORM(对象关系映射,简单地说就是把数据库的表即各种操作映射到Python对象上面来)工具。它支持操作PostgreSQLMySQLOracleMicrosoft SQL ServerSQLite等支持SQL的数据库。文档地址

  • 需要特别注意的是,SQLAlchemy只是适用于一些通用的微型框架,而全栈框架Django的orm在结合特定框架用起来可能更加便利,所以在使用SQLAlchemy的时候,如果不知道怎么完成复杂的定义,那就干脆自己写sql吧,自己去join什么的
  • 有另外一个选择peewee,提供类似Django那样又好的查询API,比SQLAlchemy易用,虽然可能没那么强大,性能可能也没那么好(并没有人去对比过性能),但是peewee还不支持Oracle等数据库,虽然我不用,但是为了防止以后多学习一门,就决定是SQLAlchemy
  • SQLAlchemy本身并不支持异步,在tornado/sanic中只有手动去执行异步

SQLAlchemy安装

1
pip install sqlalchemy

SQLAlchemy连接数据库

阅读全文 »

当我搬新家的时候我看了《怦然心动的人生整理魔法》,当我寂寞孤独的时候遇到了《岛上书店》,当我开始决定学习投资的时候又来了《富爸爸,穷爸爸》,不知道是我选择了书,还是书选择了我,缘,妙不可言。

此书是以主人公的视角来教育我们重新审视金钱的,看到最后,故事已经很模糊了,我基本记不清,但是故事的转折点,以及富爸爸穷爸爸的教育对比却是那么的让人印象深刻。罗伯特无疑是非常幸运的,有一位不直接给钱而是直接教他怎么挣钱的爸爸。我不一样,或者说我们这个国度,我们这一代人,都不一样,我们的社会还没发展到那种程度。我们从小接受的教育就如穷爸爸那样,好好读书,找一份好工作,勤俭节约,好好存钱,最终就能过上幸福的生活。这种说法有错吗?当然没错。即使是在发达国家,这种观念也是没错的。我虽然喜欢平平淡淡的生活,但是我并不喜欢千篇一律的生活。生活总得来点刺激,不是吗?

阅读全文 »

目前项目中遇到一个需求,需要私有云在单独机房下的实例数量。需求本身很简单,最简单的做法就是给每个机房添加一个单独的字段表示最大配额。但是在和团队一起碰撞下,一致认为这个需求的背后可能会有无数个奇葩的需求。想象一下,今天想要限制机房下的实例数量,明天想要限制某种实例的数量,后天又想限制某个机房某个环境的实例数量……这一个需求能够衍生出无数的类似的需求,所以我们决定做一个相对通用的方案。经过两天的思维碰撞,我把这个想法总结了一下。

其实可以把这个配额管理的场景在抽象一下,主要的难点就是需要在有多个不同限制条件(不同的字段)的情况下,随机组合条件进行搜索。想了那么久,现在记录下来的时候,却突然感觉那么简单了。基本的数据结构如下:

1
2
3
4
5
6
7
8
target_id: 目标主体的id
target_type: 目标主体的类型
pattern: 多个条件的组合
pattern_type: 被限制目标的属性的类型
privority: 优先级
min: 最小值
max: 最大值
remain: 剩余值

这里的target_type是指我们要限制的目标的类型,而pattern_type是指我们要限制目标的属性的类型。比如我要限制总共有几个机房,那么target_type就是指机房ROOM,而pattern_type就是指数量MOUNT,再比如要限制机房的实例的数量,那么target_type就是指机房ROOM,而pattern_type就是指实例INSTANCE

最大值最小值剩余值都不用解释。如果业务简单,最大最小值可以仅仅用一个limit字段来表示,remain也可以直接在需要的时候直接查询数据库count一下。

最重要的是pattern字段,我最先的设想是每个限制条件都被表示为数据库的一个字段,如果没有该值则为空,查询的时候直接用SQL的OR来进行筛选。但是我同事有更好的想法。仅仅用一个字段来表示条件,多个不同的条件用分隔符分开。pattern_type为实例的时候,条件可能为磁盘类型、系统类型和环境类型,那么这三个条件组成一个序列:disk:system:env,如果仅仅限制disk那么可以存储成disk:ALL:ALL,这里用ALL代表该条件不对该条件进行限制;如果限制diskenv,那么可以存储成disk:ALL:env。最后在实际搜索时使用正则匹配一下即可。这种实现方式相当于用target_typepattern_type来唯一确定pattern的样式,这样不同type的条件可以放在一个字段中,也就规避了不同配额类型限制条件不同造成的增加表或者增加表字段的局面。

这只是目前的一个初步构想与实践,满足我们当前的需求当然是绰绰有余了,不过是否能入我们预期的那样满足今后的一些变态需求,就要看时间的考验了。

基于AngularJS进行的封装,性能中等。

ionic开发环境部署

ionicapp主要使用命令行进行构建并使用Cordova用来构建和打包。首先安装NodeJs,然后在ionic官网注册一个账号

1
2
3
4
5
6
npm install -g inoic cordova	# 安装命令行工具
ionic start test # 创建一个测试项目,期间会提示你登录你的账号
ionic start test tutorial # 最后一个参数可以新建默认的模板项目,例如tabs表示3个tab的layout(默认选项),sidemenu、blank、super、tutorial
cd test
git push ionic master # 初始化项目完成后按照提示进行push操作,push到ionic的控制台里面去
ionic serve # 自动打开网页,第一个项目能跑起来了

此时可以去ionic的控制台查看该项目的信息以及设置一些自动构建相关配置了。但是目前只能在web端访问,如果想要生成ios或者android平台的项目还需要安装单独的工具:

for ios

1
2
3
xcode-select --install	# 安装xcode命令行工具
npm install -g ios-deploy # 安装ios部署工具
ionic cordova run ios # 即可自动打开模拟器

ionic ios

Ionic常用项目结构

基本配置

可以自己创建一个全局的配置文件,类似koa2

1
2
3
4
5
6
7
8
# vim config/index.ts
export default {
"option1" : "option1 value"
};

# 使用方法
import Config from '../../../config';
console.log(Config.options1);

API

Controller可以直接在page的构造函数中自动注入,例如

1
2
3
4
5
6
7
8
import { ModalController } from "ionic-angular";

constructor(public modalCtrl: ModalController) {}

createModal() {
let searchPageModal = self.modalCtrl.create(myPage, {origin: self.origin});
searchPageModal.present();
}

ModalController

模态框,弹出层。

1
2
3
4
5
6
7
8
9
const profileModal = this.modalCtrl.create(Profile, { userId: 8675309 });
profileModal.present(); // 展示出来,一般从下方往上滑动

@Component(...)
class Profile {
constructor(params: NavParams) { // page之间传递参数
console.log('UserId', params.get('usreId')); // 获取参数
}
}

主要负责导航的controller。包含有如下一些属性

1
2
3
# 生命周期函数(肯定是在page的constructor之后才会触发这些的)
ionViewWillEnter: 进入整个页面将要激活的时候触发
ionViewDidEnter: 当整个页面都载入完成过后并且激活后触发

ViewChild

可以使用@ViewChild获取Nav组件的一个实例。例如

1
2
// html中有<div #container class="post_container"></div>,定义了一个container,可以在ts中这样获取,定义该元素为ElementRef元素。
@ViewChild('container') postContainer: ElementRef; // ElementRef是Angular的知识,主要用于封装不同平台下视图层中的native元素。ElementRef.nativeElement就可以获取元素本身,之后就可以进行操作了,例如postContainer.naiveElement.style.backgroundColor。可以拿来当做jQuery中的$(this)了

ViewController

视图控制器。可以控制当前页面的显示。

1
this.viewCtrl.dismiss();	// 关闭当前page

UI组件

Button

按钮组件。

Content

ion-content

最基本的内容组件。

SearchBar

搜索框。

1
2
3
4
5
6
<ion-searchbar (ionInput)="getItems($event)"></ion-searchbar>
<ion-list>
<ion-item *ngFor="let item of items">
{{ item }}
</ion-item>
</ion-list>

SearchBar

搜索框。

Tab/Tabs

标签页,一般是位于页面底部,Tabs内部的元素就是Tab。需要注意的是,只有在控制器里面定义了ion-tab的root页面,页面才会显示,否则不会显示tabs。默认的tab的[root]属性至少填写一个,不然会空白或者全黑

如果每一页都有底部的tab,最好让app的rootPage直接设置为BasicPage

AngularJS组件

HttpClient网络请求

要发起网络请求,首先去要添加对应的module,在app.module.ts里添加

1
2
3
4
5
6
7
8
9
10
11
import { HttpClientModule } from "@angular/common/http";
@NgModule({
declarations: [
MyApp,
],
imports: [
BrowserModule,
HttpClientModule, // 这里添加该Module
IonicModule.forRoot(MyApp)
],
})

常用插件推荐

TroubleShooting

  • ion-tabs 不显示,显示空白或者黑色,或者ion-tabs empty blank:默认的ion-tab[root]属性必须填写,而且不能设置为null

  • SearchBar无法自动设置setFocus(),setFocus() not working临时解决方案:

    1
    2
    3
    setTimeout(()=>{
    self.searchBar.setFocus();
    },100);
  • Cannot find module ‘@awesome-cordova-plugins/core’ or its corresponding type declarations: 很多ionic的插件会包装一层awesome,此时需要将该包给撞上npm install @awesome-cordova-plugins/core --save

  • No installed build tools found. Install the Android build tools version 19.1.0 or higher.: 尝试export ANDROID_HOME=~/Library/Android/sdk && export PATH=${PATH}:${ANDROID_HOME}/tools && export PATH=${PATH}:${ANDROID_HOME}/platform-tools && export ANDROID_SDK_ROOT=~/Library/Android/sdk,但是我遇到了另外一个奇怪的问题,无论我怎么设置环境变量,代码里面得到的ANDROID_HOME都是/opt/homebrew/Caskroom/android-platform-tools下的,所以我直接在cordova.gradle文件里面的getAndroidSdkDir写死了envVar的值

  • FATL ERROR: Ineffective mark-compacts neara heap limit Allocation failed - JavaScript heap out of memory: 尝试执行 export NODE_OPTIONS="--max-old-space-size=8192"

you-get,强大的视频网站下载工具。与aria2相比,其功能主要用于音视频网站内容的获取,通过音视频网页的url链接直接下载媒体内容,几乎支持所有国内外的主流视频网站(例如: youtube、优酷、Bilibili、爱奇艺等)。这里的视频链接不是指真正视频的链接,而是视频网站的url即可,即使视频网站使用了各种方式混淆也能进行快速下载。使用它无论下载什么网站的视频都能达到满速下载,下载youtube也能几十兆每秒的速度(当然得有能慢速的代理)。

需要注意的是,you-get也可以用于其官方没有列出的网站的视频下载,但是无法保证速度和下载稳定性,建议对于其他的网站,使用aria2工具进行下载

安装you-get

1
2
3
4
pip install you-get

# 最好安装ffmpeg依赖,否则很多网站视频是获取不了,目前最新稳定版是3.3.4
sudo apt-get install ffmpeg

you-get命令用法

1
2
3
4
you-get '视频链接'		# 最简单的下载
you-get -i '视频链接' # 列出视频信息,可以看到该网页提供的视频的信息,一般默认的就好,但有时候也有更高清的可供选择,通过这种方式可以获取其itag,然后用下面的方式进行下载
you-get --itag=127 '视频链接' # 下载指定质量的视频,国内网站一般默认就是最高清的,但是国外的还有更高清的
you-get -x 127.0.0.1:8118 '视频链接' # 设置http代理

###you-get代码用法

和众多其他命令行工具一样,you-get同样支持在代码中直接使用

1
2
from you_get.extractors import *	# 可以获取到各个网站的下载器
download_urls([url], title, 'mp4', 0, './videos')

这是一本在去年非常火的一本书,朋友圈都在晒,仿佛一夜之间大家又变成了喜欢读书的人,或者,朋友们也都如我一样,在这世间,孤独寂寞地走着。
这本书的翻译水平感觉有点儿不尽人意呀,不过也说得过去,毕竟,这本来就是一本讲书店的书,书中每个章节的开始也都是引用一本书的内容,里面自然有很多难以翻译的“书中书”了。不过,此书原名The Storied Life of A. J. Fikry,把它翻译成岛上书店,这一个翻译是非常值得表扬的,如果只是直译过来,我想,这本书在国内并不会收到那么多关注。故事情节可以给到8分以上,非常不错,环环相扣,并不如评论里所说那样看到前面就能立马才到后面,此书是到全书的后半段,才慢慢解释来龙去脉,最后结局也是非常精彩的,大家都走出了自己那困惑的人生。虽然主人公最后死去了,但是岛上书店的故事却会一直持续下去。这本书的前面四分之一算是比较无聊的叙事,也没有什么波澜,所以如果你在只看了一点点的时候千万不要放弃,相信我,这本书的后半段会让你爱不释手的。
我们每个普通人的一生都会有或多或少的低谷,我们总是沉浸在其中无法自拔。人到中年,当觉得自己并不能拯救这个世界,第一次发现自己只是一个普通人的时候,我们都曾痛苦过。但是请再坚持一下,不要像AJ的前两年那样用酒精麻醉自己,我们需要的是希望,这世界上总会有人给你带来希望,不是每个人都能像AJ那样有玛雅相伴,但是我们每个人都不是孤独的。我们有朋友、有家人、有恋人,我们痛苦的时候他们也会痛苦,不如勇敢一点,爱得更用力一点,别像那种生活低头,生活总会慢慢好起来的嘛。

最近年轻气盛、心血来潮、突发奇想地决定去分析一下特定类型电影的数据,我的爬虫技术自我感觉还算不错,但是爬取数据来具体该如何分析,我只能算是个新手。

练手的具体网站就不说了,总共有36956.avi条数据,总共发送约4000个请求,切换了上百个代理,不得不说,在同类型网站里面,该网站的的反爬策略算是中规中矩的。以下是我对本次爬取数据的基本描述与简单分析:

基本数据
statistics
总数量 36956
总大小(G,我可不会下载) 940
总时长(hour) 9688.56
总观看量 2,418,738,994
排行数据

观看量排名前十的影片:

观看量排名前十的影片

观看量排名后十的影片:

好评率排名前十的影片(这个指标基本上不能代表什么,该网站没人评分少的基本上都能很高,评分算法有问题):

时长排名前十的影片(强撸灰飞烟灭,应该没人看完):

词云

最后来一个词云(分析就不言而喻了,重口味,绝对的重口味)

总结
  1. 此次爬虫所使用的技术比较简单,Python3.6做主要的程序语言,requests做curl请求,jieba中文分词做标题分词提取,skydark/nstools的繁简转换,amueller/word_cloud做词云图片。
  2. 有些东西确实看得越多,越重口
  3. 我终于知道网上这类网站的分析为什么那么少了,我得去补补了。