GoAccess web日志可视化 有时候我们希望能分析一下web服务器的访问记录,如果是直接打开 /var/log/nginx/access.log 的话,虽然的确可以看到访问记录,但是数据太多了,也很难直观的分析出我们想要的结果。而使用命令来分析虽然可行,但是命令比较难记忆,也不算直观。 今天了解到了一款轻量易部署的工具—— goaccess ,可以用来将我们nginx服务器的访问日志可视化,将数据直观的展现给我们。 除了nginx日志,该工具还可以将apache等服务端的日志可视化展示 安装GoAccess 官方给出了 安装教程 ,有linux包管理器安装,源码编译安装,docker镜像等多种部署方式,由于ubuntu18源里面的goaccess版本还算比较新,可以直接使用 sudo apt install goaccess 来安装 强烈建议不想折腾的话直接用包管理器安装!!!体验基本是相同的 。 不过这篇文章中我计划直接下载源码编译安装最新版,获得最新的体验: 我计划使用geoip city的mmdb数据库(一开始我以为可以精确到城市,但是查看github issues发现他们其实还没做精确到城市的显示…),所以得先去下载geoip2的数据库 https://www.maxmind.com/ 需要注册才能下载,还不能挂代理。 bash # 首先安装依赖避免出现下面那些报错 sudo apt-get install libncursesw5-dev libglib2.0-dev libgeoip-dev libtokyocabinet-dev libbz2-dev $ wget https://tar.goaccess.io/goaccess-1.3.tar.gz $ tar -xzvf goaccess-1.3.tar.gz $ cd goaccess-1.3/ $ ./configure --enable-utf8 --enable-geoip = mmdb --enable-tcb = btree #这里的各个配置可以查看教程中的介绍如果要开启ssl 使用 --with-ssl参数 $ make $ make install 第一次尝试安装出现报错 checking for MMDB_open in -l... 阅读全文
Swagger生成php restful API接口文档 背景 我们的restful api项目采用yaf框架, 整体结构简单, 我们只需要用swagger扫描 application目录即可。 下面简称我们的php项目为yaf_project. 搭建 先说下最终的文档生成流程会是什么样子,以便先有个整体的认识: 搭建完成后, 整个流程, 从文档生成到前端展现, 大体如下: 在php文件中写 swagger 格式的 /** 注释 */ 用 swagger-php 内的 bin/swagger.phar 命令扫描 项目application 所在目录, 生成 swagger.json 文件 将 swagger.json 文件拷贝到swagger-ui中index.html指定的目录。 打开 swagger-ui 所在的 url, 就可以看到文档了. 文档中的各个 api 可以在该网址上直接访问得到数据. 实现此需求,只需要swagger如下的两个项目: swagger-php: 扫描 php 注释的工具. 内含一个不错的例子. swagger-ui: 用以将扫描工具生成的 swagger.json 文件内容展示在网页上. git clone https://github.com/zircote/swagger-php.git git clone https://github.com/swagger-api/swagger-ui.git 或者: npm install swagger-ui-dist 文档生成工具(swagger)部署 NOTE: swagger-php 只是个工具,放在哪里都可以. 主要工作,解决composer依赖。 因为国内直接用 composer 比较蛋疼,所以最好设置下国内的那个 composer 源. 文档工具部署,需要以下三个命令: cd swagger - php composer config repo . packagist composer https : // packagist.phpcomposer.com composer update 只要中间不报错,就算部署完成了. 完成后可以生成一份文档试一下. swagger-php 项目下的 Examples 目录下有一个示例php工程,里面已经用 swagger 格... 阅读全文
Matomo API 官方接口详情 API接口 你可以通过调用Matomo的分析接口将数据集成到其他应用中去。这些数据包括访问数,页面网址、网页标题、用户设置、搜索引擎、关键词、推荐网站、用户浏览器 其中的请求参数和返回值需要对照官方手册来 未定义 ## API `未定义` ## Annotations `未定义` ## Contents `未定义` ## CoreAdminHome `未定义` ## CustomDimensions `未定义` ## CustomJsTracker `未定义` ## CustomVariables `未定义` ## DBStats `未定义` ## Dashboard `未定义` ## Events `未定义` ## Feedback `未定义` ## Goals `未定义` ## ImageGraph `未定义` ## LanguagesManager `未定义` ## Login `未定义` ## Marketplace `未定义` ## MobileMessaging `未定义` ## PagePerformance `未定义` ## Provider `未定义` ## SEO `未定义` ## SitesManager `未定义` ## TagManager `未定义` 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 Actions 动作(行为) Actions.get 访客分析-概述-访客概览(右边一列) Actions.getPageUrls 行为-页面 Actions.getPageUrlsFollowingSiteSearch Actions.getPageTitlesFollowingSiteSearch Actions.getEntryPageUrls 行为-进入页面 Actions.getExitPageUrls 行为-退出页面 Actions.getPageUrl 行为-通过页面的PageUrl查看详情(获取单条记录) Actions.getPageTitles 行为-页面标题 Actions.getEntryPageTitles 行为-页面标题-进入页面标题 Actions.getExitPageTitles 行为-页... 阅读全文
终极学习法:费曼学习方法 像我们这种,孩子要N年以后才会高考的,也忍不住掺和一下。伸着脖子,想打听一点学霸的成功经验。 听来听去,除了天赋、努力之外,反复被提到的一个关键词即是:学习方法。 之前,分享过写的超好的一篇文章,反复强调的也是类似的观点,排名前 1% 的学生靠的不是天赋也不是努力,而是更高阶的思维和学习习惯…… 那究竟什么才是好的学习方法? 带着这样的疑问,开始了搜寻,后来找到了它。 先说说它的神奇。 一个叫Scott Young的加拿大人,用它在几天之内学完了线性代数,一年的时间里自学完成了麻省理工全部计算机学课程。一共33门课程,这意味他平均通过一门课程也就花了一周半左右。 不卖关子啦,它就是 著名的费曼学习法。 知乎上很多人怒赞“费曼学习法”,还将其称为是“终极学习法”。 P.S.,它还能解释,为啥相比老二、老三,老大更加聪明,很神奇吧? 1费曼,你是谁? “费曼学习法”来源于20世纪美国物理学家、 教育 家、音乐家——理查德·费曼。 “男神”费曼是不是很帅~ 如果说20世纪全世界第一伟大的科学家是爱因斯坦,那么排名第二的可能就是费曼先生了。 他不仅获得1965年的 诺贝尔 物理学奖,还参与过美国的原子弹项目”曼哈顿计划“,同时也是第一位提出纳米概念的人。 这样一位史诗级人物,对学习方法他有着自己的独特一面:学完了,再教一下他人。 这个方法伴随了他一生,也成就了他一生,而要追溯到他最开始的学习,则是归功于他的父亲对他思维方式的引导和积淀。 费曼和 爸爸妈妈 的合影。 费曼的父亲是一位推销制服的销售,文化程度并不高,但就是这样一位普通人,却在跟费曼一起读书的时候,逐渐教会了他怎样去理解和思考。 比如,一起读《大英百科全书》,父亲不是照本宣科,而是用更加形象的方式让小费曼真正理解。 有一次,他们讲到了霸王龙。书上说:”霸王龙有20英尺高,头有6英尺宽。“很准确,但是很抽象的表述。 父亲很巧妙地用“它的头想伸到窗户外,但是却伸不出去,因为它的头太宽了”的话语,让抽象变的具象。 这让费曼不仅理解了霸王龙的庞大,更加理解了20英尺高、6英尺宽是一个什么概念。 正是通过这种方式,小费曼不仅对科学产生了浓厚的兴趣,还认识到无论学什么,都要去理解它背后真正的含义,而不仅仅停留在表面。 不要小看这句话,因为这也正是“费曼学习法”的精髓所在。 2费曼学习方法的精髓是啥? 在介绍“费曼学习法”之前... 阅读全文
Yaf framework 相关项目骨架 在 yaf 的源码目录,附带了一个工具 tools 目录, 下面有个 cg/yaf_cg 工具,是通过模版生成 yaf 项目骨架的工具。 Usage: ./yaf_cg ApplicationName [ApplicationPath] 项目目录 ├── application │ ├── Bootstrap .php │ ├── controllers │ ├── library │ ├── models │ ├── plugins │ └── views ├── conf │ └── application .ini └── index .php index.php 程序的入口文件 application 主要的应用程序代码目录。 2.1 可以通过 application.directory 这个配置来修改。 2.2 application 目录下的目录(controllers、models、plugins、views)是默认的代码结构目录,yaf 会根据相关的类名称,去相关目录下加载相关的文件,例如 IndexController extends Yaf\Controller_Abstract 这个文件,yaf 就会到 controllers 目录下查找 Index.php、类 UserModel 就会到 models 目录下查找 User.php(可以定制文件后缀或前缀模式,如 ModelUser 就是前缀模式)。 2.3 除了 library 目录以外,其它目录都是在框架编译的时候确定的,library 目录主要是存放一些本地库文件例如我有个 Helper_Html (名称空间模式 Helper\Html) 类,通过注册本地类名称空间 Yaf_Loader::registerLocalNamespace("Helper") 来加载,文件的存储结构是 library/helper/Html.php 需要注意的就是要开启名称空间,使用 namespace 的类名称和不使用 namespace 的 classname 有些差异。 2.4 Bootstrap.php 是框架的引导类 (可以没有),继承自 Yaf\Bootst... 阅读全文
ThinkPad E480 黑苹果踩坑和黑苹果常用操作备忘 由于囊中羞涩,只好一部 ThinkPad 商务本凑合一年有余。最近赋闲在家无事可干,打算更新一下开发环境。Windows 搭配 Cygwin 的选择毫无疑问被排除在外、WSL 的 IO 性能无法直视、开源拖拉机 Linux 的生态一时半会无法适应。想来想去,不如装个黑苹果(Hackintosh)过把用 macOS 的瘾。 本文前半部分会记录我在 ThinkPad E480 上踩过的几个坑和解决方法,后半部分则是我自己备忘的黑苹果的相关知识。 我不是专业安装黑苹果的玩家, 在短期内 我也不会考虑开源我的 EFI。 EFI 已使用 Unlicense 开源协议在 GitHub, 地址 。 ThinkPad 黑苹果无线网卡 ThinkPad E480 出厂时搭载的无线网卡是 Realtek 8821CE Wireless LAN 802.11ac PCI-E NIC ,目前没有办法驱动。 目前最好的选择是换装 DW1560 ,在 macOS 下毫不费力就可以驱动,在 Windows 下也能轻易驱动。不推荐用 DW1820A ,在 ThinkPad 系列机型上都需要屏蔽识别针脚、在系统中容易引发冻屏。而且 DW1820A 有的批次可以轻易驱动、有的则难如登天。如果你执意要趟坑 DW1820A ,请参考 黑果小兵的这篇文章 。 AppleALC 驱动声卡 ThinkPad E480 的内置的声卡是相对罕见的 Conexant CX20753/4 。但是好消息是, MacPeet 为 AppleALC 添加了 CX20753/4 支持( layout-id: 15 ),而且 MacPeet 的机型是 ThinkPad E580、是 ThinkPad E480 的姊妹机型。在实际测试中, layout-id 取 3 或者 15 都可以驱动 ThinkPad E480 的声卡,3.5mm 耳机接口和外放都可以正常使用。 触摸板、键盘、ThinkPad 小红点驱动 建议使用 Rehabman 版本的 VoodooPS2Con... 阅读全文
如何防止Cloudflare CDN背后的图片被盗连(Hotlink Protection)? 「Hotlink Protection」(直接链接保护)是经营网站经常需要去注意的一块,但为什么我们会需要「Hotlink Protection」呢?身为图文并茂的网络文章作家,最担心得就是自己的文章被别人整篇连文带图地拷贝粘贴到其它地方了。此时如果图片有套用「Hotlink Protection」的话,就可以让被盗用的图片在其它网站上「不被正常显示」出来,如此一来,就能使其它误入盗文页面的访客可以知道该篇文章是篇被盗用的文章。不同的网站架构有不同的「Hotlink Protection」的设置方式,如果您的网站有打开Cloudflare的CDN服务的话,可以参考这篇文章,来实现「Hotlink Protection」的功能。 我的网站服务器是用Nginx或Apache,难道不能直接对它们做设置吗? 很遗憾,只要我们有激活Cloudflare的CDN服务,就无法有效地通过自己的服务器程序来设置Hotlink Protection。这是因为网页浏览器在打开您网站的图片时,会去链接Cloudflare的CDN服务器,而非我们自己的服务器,所以就算我们有在自己的服务器上制作Hotlink Protection的功能,也根本不会被触发到。 既然有Cloudflare CDN,为什么还要Hotlink Protection?被盗连的图,其流量不是不会算在我们头上吗? 的确,有了Cloudflare CDN之后,就算图片被盗连,它主要也还是会去吃Cloudflare CDN服务器的流量。但是,您真的愿意让您文章中的图片原封不动地在盗文网站上显示出来吗?所以还是设置一下Hotlink Protection吧! Cloudflare内置的Hotlink Protection开关 Cloudflare的控制后台中,其实就有提供一个一键套用Hotlink Protection的开关,只要打开来,就可以让有激活CDN功能的网域拥有Hotlink Protection的功能。这个开关藏在Cloudflare控制后台的「Scrape Shield」分页中。 这个Hotlink Protection一旦打开,整个有打开Cloudflare CDN服务的网域(包含子网域)下的图片链接,就只能在这整个网域(包含子网域)下打开,否则的话会直接回传HTTP的403... 阅读全文
JavaScript 实用窍门总结 1. 删除数组尾部元素 一个简单方法就是改变数组的length值: 1 2 3 4 5 6 7 8 const arr = [ 11 , 22 , 33 , 44 , 55 , 66 ] ; // truncanting arr . length = 3 ; console . log ( arr ) ; //=> [11, 22, 33] // clearing arr . length = 0 ; console . log ( arr ) ; //=> [] console . log ( arr [ 2 ] ) ; //=> undefined 2. 使用对象解构(object destructuring)来模拟命名参数 如果需要将一系列可选项作为参数传入函数,你很可能会使用对象(Object)来定义配置(Config)。 1 2 3 4 5 6 7 doSomething ( { foo : 'Hello' , bar : 'Hey!' , baz : 42 } ) ; function doSomething ( config ) { const foo = config . foo !== undefined ? config . foo : 'Hi' ; const bar = config . bar !== undefined ? config . bar : 'Yo!' ; const baz = config . baz !== undefined ? config . baz : 13 ; // ... } 不过这是一个比较老的方法了,它模拟了 JavaScript 中的命名参数。 在 ES 2015 中,你可以直接使用对象解构: ... 阅读全文
斐讯N1小钢炮Docker安装OpenWrt/LEDE做旁路由 前言: 如今很多路由器都支持第三方固件,大家也都纷纷将路由器刷成了 OpenWrt / LEDE ,梅林,Pandavan,高恪,潘多拉等固件来实现各自的一些目的。如: 去广告 多播叠加带宽 科学上网 挂机下载 KMS等 这些功能往往是在普通路由器的原版固件中没法实现的。既然大家已经有主路由可以刷第三方固件实现以上功能后,为什么又会有旁路有的需要呢? 那自然是因为 旁路由 有它独到的好处。不知道大家有没有经历过以下的感受,当大家欢喜的在主路由上打开各种功能后,经过一段时间,总感觉代理速度不稳定,或者网络信号稳定等情况。这就是因为路由器本身的性能有限,你开的功能越多,它同时兼顾的东西就越多,自然就容易出现一些稀奇古怪的问题。这时候, 旁路由 就起到了它的作用。 我们用 旁路由 连接主路由,主路由关闭一切其它功能,只让它安心的拨号上网,发射WIFI信号,而一切杂七杂八的功能,都让 旁路由 来承担。 旁路由 同时也不用去做主路由的工作,它不需要拨号,不需要发射WIFI信号,它只需要做好它的科学、去广告的功能,这样就形成了一种各司其职的状态。如果你有一个很好的机场+上一个很高的带宽,通过这种配置,就可以进一步将它稳定的发挥出来。那么接下来,就让我们来看下,如果将斐讯N1小钢炮固件下使用Docker安装OpenWrt路由器固件作为 旁路由 ,充分发挥N1的作用。 步骤: 1、Docker安装及设置: 进入N1 小钢炮 管理后台,点击System选项,之后再点击Startup,在右侧往下拖,找到Docker的对应进程选项/etc/init.d/S60dockerd,把NO点为YES启用Docker,再点击左边的start,之后点击下面的SAVE保存 点击Apps-Other-Docker Setting-install Docker UI (没安装时默认为黄色,下图为已经安装完成后的显示) 等待Docker UI安装完成后,UI Running Status会显示2个绿色图白哦,点击第二个Docker UI进入Docker后台 首次进入设置你想要的用户名及密码,之后点击Local-Connet进入Docker管理界面 2、镜像拉取及设置: 使用 SSH 工具输入IP地址登录 小钢炮 (Windows使用Putt... 阅读全文
阿里盒马领域驱动设计DDD实践 前言 设计是把双刃剑,没有最好的,也没有更好的,而是条条大路到杭州。同时不设计和过度设计都是有问题的,恰到好处的设计才是我们追求的极致。 DDD(Domain-Driven Design,领域驱动设计)只是一个流派,谈不上压倒性优势,更不是完美无缺。 我更想跟大家分享的是我们是否关注设计本身,不管什么流派的设计,有设计就是好的。 从我看到的代码上来讲,阿里集团内部大部分代码都不属于 DDD 类型,有设计的也不多,更多的像“面条代码”,从端上一条线杀到数据库完成一个操作,仅有的一些设计集中在数据库上。我们依靠强大的测试保证了软件的外部质量(向苦逼的测试们致敬),而内部质量在紧张的项目周期中屡屡得不到重视,陷入日复一日的技术负债中。 一直想写点什么唤起大家的设计意识,但不知道写点什么合适。去年转到盒马,有了更多的机会写代码,可以从无到有去构建一个系统。盒马跟集团大多数业务不同,盒马的业务更面向 B 端,从供应到配送链条,整体性很强, 关系复杂,不整理清楚,谁也搞不明白发生什么了 。所以这里 设计很重要 ,不设计的代码今天不死也是拖到明天去死,不管我们在盒马待多久,不能给未来的兄弟挖坑啊。在我负责的模块里,我们 完整地应用了 DDD 的方式去完成整个系统 ,其中有我们自己的思考和改变,在这里我想给大家分享一下,他山之石可以攻玉,大家可以借鉴。 领域模型探讨 1. 领域模型设计:基于数据库 vs 基于对象 设计上我们通常从两种维度入手: Data Modeling : 通过数据抽象系统关系,也就是数据库设计 Object Modeling : 通过面向对象方式抽象系统关系,也就是面向对象设计大部分架构师都是从 Data Modeling 开始设计软件系统,少部分人通过 Object Modeling 方式开始设计软件系统。这两种建模方式并不互相冲突,都很重要,但从哪个方向开始设计,对系统最终形态有很大的区别。 Data Model 领域模型(在这里叫数据模型)对所有软件从业者来讲都不是一个陌生的名词,一个软件产品的内在质量好坏可能被领域模型清晰与否所决定,好的领域模型可以让产品结构清楚、修改更方便、演进成本更低。 在一个开发团队里,架构师很重要,他决定了软件结构,这个结构决定了软件未来的可读性、可扩展性和可演进性。通常来说架构师设计领域模型,开发人员基于这个领域... 阅读全文