CentOS、Ubuntu使用samba实现文件共享

安装服务端

sudo yum  install -y samba samba-client ## centos
sudo apt install smbclient samba ## ubuntu

配置samba

[sambashare]
    comment = Samba on Ubuntu
    path = /home/username/sambashare
    read only = no
    browsable = yes

设置开机自动启动

sudo systemctl enable smb ## centos
sudo systemctl start smb ## centos
sudo systemctl enable smbd ## ubuntu
sudo systemctl start smbd ## ubuntu

添加当前用户到smb

sudo smbpasswd -a username

Windows访问samba

打开资源管理器,地址栏输入"\ip",然后输入密码即可

使用Splash解决爬取页面时需要执行JS问题

写 Scrapy 爬虫时,遇到了 js 进行跳转的页面,大家有没有好的解决方法?

答案是:

splash

Splash is a javascript rendering service with an HTTP API. It’s a lightweight browser with an HTTP API, implemented in Python 3 using Twisted and QT5.

It’s fast, lightweight and state-less which makes it easy to distribute.

Documentation Documentation is available here: https://splash.readthedocs.io/

scrapy-splash

This library provides Scrapy and JavaScript integration using Splash. The license is BSD 3-clause.

参考:

一只球队如何赢球

  1. 组建团队(教练有丰富经验和远大理想,招聘最优秀的人才,搭配分工)
  2. 训练(努力,工作量,提高专业性)
  3. 比赛(树立明确目标并超越,积小胜为大胜,一场战争到一场战役)

《定位》读书笔记

定位的最新定义是:如何让你在潜在客户的心智中与众不同。

定位三步定位法

他们善于分析外部环境,明确知道竞争对手的价值。

避开竞争对手的强势,利用别人弱点,确立品牌优势。

  • 寻找空位:尺寸空位mini,高价空位劳力士zippo,性别空位万宝路ck,年龄空位舒客儿童牙膏,时段定位白加黑,经销方式瓜子二手车没有中间商赚差价)
  • 重新定位竞争对手(有药好得更块些,不上火)

最重要的一点:简化深耕

一个词定位:奔驰宝马沃尔沃

定位金句

  • “当第一胜过做得更好”是迄今为止最有效的定位观念。
  • 找出空位,然后填补上去。
  • 人们喜欢看到神话的破灭
  • 心智靠耳朵而不是靠眼睛来运转的
  • 理解品牌延伸问题的关键之一是,把短期效应与长期效应分开来看
  • 牌延伸能够继续流行的原因之一是,它在短期内确实有一定的优势
  • 品牌延伸的经典测验法是购物单
  • 定位需要逆向思维。定位需要从潜在顾客开始,而不是从自己开始
  • 创意本身一文不值,只有为定位目标服务的创意才有意义

《可复制的领导力》读书笔记

一、80%的管理者能达80分

  • 将员工变成团队的战略合作者
  • 人人都能学会领导力
  • 六西格玛:发现问题,分析问题,解决问题,反馈
  • 西方发达国家企业的优势在于管理能力和培训水平,西方企业管理能力有一个个工具组成,可以标准化,普通人通过训练也可以轻松拥有
  • 面向企业问题的标准处理机制,使西方企业普遍寿命长
  • 员工执行力不强,是因为管理者管理能力不过关
  • 布置任务时要说5遍
  • 提升领导力的四重修炼:1,建立信任:本职工作做到出色;深刻体会“通过别人”的管理精髓;2,建立团队:敢于放手,不怕犯错;3,建立体系:体系可以保证组织自然运转,建立体系需要建立标准,并通过引进技术来用技控代理人控;4,建立文化,企业文化是企业价值观、信念等的精神因素的结合

二、明确角色定位避免亲力亲为

  • 管理者的使命是培养员工,打造有战斗力的团队
  • 衡量管理者能力的高低,是看他培养了多少人才
  • 管理就是通过别人完成任务
  • 团队就像一首船:要想快速前进,必须分工和组织体系
  • 学会授权,别怕员工犯错
  • 学会鼓励
  • 管理的三种角色:1,执行者使命必答;2,中层管理面面俱到,勇往直前,管理能力需要刻意反复练习;3,高层领导营造氛围:任何事需要考虑团队成员情绪,凝聚人心
  • 优秀管理者都是营造氛围的高手(得人心者得天下)

三、构建游戏化组织,让工作变得更有趣

  • 需要有宏达且具体的愿望,才能成为指数型组织
  • 企业愿景是必须得到所有成员的认可,大家共同努力的目标
  • 制定清晰的游戏规则,游戏规则的目的是使大家达到共赢
  • 将员工打造成业务站点的海星模式
  • 建立及时的反馈机制:发奖文化,及时表达对员工的肯定
  • 资源参与和退出的游戏机制
  • 找到自愿参与的人,招聘创意精英
  • 为员工设定期望值:员工分为自燃型,阻燃型,和点燃型
  • 用协议提醒员工(不是胁迫)

四、理清关系,打造团队一致性

  • 团队不是家,是球队,目标是赢球(团队存在的目的是为了胜利)
  • 任何一个员工需要反馈的时机,都是打造团队一致性的好时机:1,员工离职时;2,发放奖金时;
  • 企业要将员工视为投资人,员工为企业的成长投资了最宝贵的资源-时间,引起企业保证这些时间内让员工有所提升,变得更好。企业管理者严格管理员工,就是为了提升员工的价值
  • 一致性让团队成员不断进步,最终达到双赢
  • 严格管理团队是对团队成员的负责(不严格就是不负责)
  • 将你要员工做的事,变成他自己要做的事:1,强化员工为自己工作的观念;2,用共同的目标管理;3,适度,有效授权。
  • 前员工是熟人,而非路人:1,给现有员工示范作用;2,维护企业口碑;3,为企业带来新的发展机遇;
  • 如何善待前员工:1,建立前员工联盟;2,投资创业员工;

五,用目标管人,而不是人管人

  • 目标是一切管理的基础和开始
  • 企业管理说到底就是目标管理
  • 企业目标分为三大类型:1,方向型(应该注重社会价值);2,过程型(具有逻辑性,途径);3,理性型(具体数据指标,标准);
  • 目标管理四大难题:1,成员参与度不够,执行积极性不高(让成员参与目标制定:1,过程团队成员主导2;进行充分的目标对话;3,管理者与员工平等;4,双方认可);2,资源匮乏:找亮点,突破性思维;3,目标拆分不合理:将目标管理当做一个系统工程;4,目标总在变化:1,理解企业决定;2,准备提前预案;
  • SMART法则:1,Specific明确具体;2,Measurable可量化;3,Attainable可接受,可实现,沟通充分;4,Realistic相关性和符合实际;5,Time limited有时间限制;
  • 套用公式制定目标: 1,动词+任务;2,指标:业务重点,关键因素,关键指标,难于量化的团队采用比率,指标逐级分解;3,目标:因人而异,全员参与,可测量,及时反馈沟通,目标灵活可变,将目标作为动力而不是压力;
  • 目标管理的标准化化:1,利用目标书写公式写出目标;2,列出阻碍目标实现的因素;3,列出可以帮助目标实现的条件;4,写下个人特征;5,列出要做的事(三个角色);

六、利用沟通视窗,改善人际沟通

隐私象限:正面沟通,避免误解

  • 沟通视窗,也称乔哈里视窗,是一种关于沟通的技巧和理论,也被称为“自我意识的发现-反馈模型”。
  • 沟通视窗分为隐私,盲点,潜能,公开四大区域
  • DDS(deep dark secret):做到坦荡
  • 不好意思说:及时纠正错误,避免造成更大错误
  • 忘了说:一遍一般传达认知和理念,不严其烦的向员工传达我们的共同愿景
  • 打破知识诅咒的方法:简单,意外,具体,可信,情感和故事《让创意更有粘性》

盲点象限:利用反馈看到自身局限

  • 子路:闻过则喜,
  • 大禹:禹闻善言,则拜
  • 闻过则问
  • 利用反馈和建议改善盲点
  • 盲点不一定是缺点

潜能象限:不要轻视每一位员工的潜能

  • 赛马不相马,人人是人才 - 海尔张瑞明
  • 制造公平竞争,积极向上的氛围,重视赛马机制的建立
  • 克服偏见,以标准化流程公平对待每个成员,让每个成员都享有公平竞争的机会
  • 管理者需要思考的两大问题:1,是否充分调动员工积极性;2,是否为员工能力提升提供了规划和培训
  • 找到束缚能力发挥的源头

公开象限:让员工尊重你,而不是怕你

  • 领导力的核心在于得到员工的尊敬和信任
  • 拥有足够大的公开象限,就会拥有游戏的领导力
  • 将隐私象限转化为公开象限(自我揭示)
  • 将盲点象限转化为公开象限(万科将客服反馈的问题,复制成标准话术,运用到每个销售)

七、学会倾听,创建良性的交流通道

倾听是沟通的基础。倾听过程还要对信息进行解析,并作出积极回应

用心倾听,建立员工情感帐户

  • 从善入流
  • 培根说:读史使人明智
  • 刘邦善听
  • 兼听则明
  • 善于倾听是最重要的领导者素质,而没有反馈是最讨厌的素质
  • 崔永元主持节目能够给嘉宾积极反馈
  • 马斯克能随时听取并帮员工尽快解决问题
  • 骂人的资本
  • 建立情感帐户

倾听要点是吸收对方信息

  • 倾听步骤:深呼吸,提问,复述
  • 深呼吸:清除私心杂念,放下偏见,只留下平静的心为接下来的倾听做好准备
  • 提问:倾听中重要的是实时反馈,适时提问才是正确的回应方式
  • 封闭性问题:只能用是或者不是等具体答案来回答,主要用于销售不给予客户考虑空间
  • 开放性问题:不能轻易用是或者不是或者简单词或者数字来回答的问题。开放性问题需要对问题做进一步描述,并将他们自己的注意力转向说描述事情中比较具体的某个方面。“怎么样”比“为什么”更容易得到具体答案。
  • 复述:对倾听的结果做一个确认。
  • 沟通漏斗:想说的,实际说出来的,被听到的,听懂的,三天后,三个月后

肢体动作比语言更重要

  • 肢体语言包含了没有说出来的部分,解读肢体语言某种程度上重要性超过了语言本身
  • 书面语言:冷静客观,用于严肃的环境
  • 口头语言:带有主观色彩和即时性,但是仍然存在务虚因素。存在煽动性和目的性。
  • 肢体语言:除非经过可以训练,否则任何人无法控制和修改自己的肢体语言
  • 目光:如果交谈中员工不正视管理者,需要将话题引导至员工感兴趣的方面
  • 手势:人在撒谎时会抚摸自我安慰区
  • 腿部动作:如果员工进展时应该调整谈话内容,语气,或者结束谈话
  • 空间距离:46厘米到120是亲人,爱人之间;120到360是社交或者工作;360以上只有公众演讲
  • 应当避免的9种肢体错误:无精打采,夸张的手势和点头,看手表坐立不安拨弄头发,交叉双臂或者紧握拳头,言语和面部表情不一,避开对方目光,过于强烈的眼神接触,转动眼珠,皱眉或者不开心的表情

用认同化解对方的失控情绪

  • 面对情绪失控的人,最好的办法是让对方说是
  • 认同情绪和认同观点的区别
  • 让员工认识到自己的情绪,然后认可员工的情感,是员工产生归属感的重要方法

八、及时反馈,让员工尊重你、信任你

别用绩效考核替代反馈

  • 企业管理中,员工最害怕的是突然的惊喜
  • 考核结果反应的是员工表现和管理者的工作成果
  • 员工对于指导和反馈有着迫切的需求
  • 管理者需要给员工及时反馈来保证团队方向一致
  • 如果没有足够的尊重和新人,绩效考核结果会变得非常敏感,加大管理成本
  • 通过正面反馈,培养员工自尊心让其达到自律的目的

警惕“推理阶梯”,避免误解和伤害

  • 反馈分为正面(鼓励性反馈)和负面(纠正调整型反馈)
  • 推理的过程:1,收集数据;2,选择性接收数据;3,赋予意义,给出结论,采取行动
  • 做决定之前要问下自己:有没有可能只是一个推理,实际情况并非如此
  • 再谈话之前,先不做出任何主观结论,只陈述自己看到的现象和对现象的担忧
  • 员工明白管理者的要求,并且得到相应尊重,主管能动性自然会得到提高

通过正面反馈,引爆你的团队

  • 反馈级别:零级反馈无动于衷;一级反馈口头表扬;二级反馈表扬并告诉原因
  • 每个人在做任何事情时,都希望得到来自群体的反馈和认可,没有人可以免俗
  • 有功不赏是企业管理大忌
  • 公开正面的口头表扬会让员工明确以后的工作方向,深刻认识工作的意义
  • 金钱的两个弱点:衰减和腐蚀
  • 管理者的终极任务是通过各种手段塑造和调整员工行为
  • 正面反馈是塑造行为的最佳时机

负面反馈时,对事莫对人

  • 三明治反馈模式:表扬平时工作不错,提出现阶段工作中存在的问题,告诉员工改进后会达到的成就
  • 负面反馈的四大流程:准备事实,谈话(设定情景,给予反馈BIC,鼓励和倾听,商讨改变),行动总结,跟进计划
  • 人在自信时才会勇于承担责任
  • 优秀的管理者善于培养员工的自主性,自觉性,自律性
  • 自律来自自尊,自尊来自一次次被肯定
  • 将工作视为一次次刻意训练

九,有效利用时间,拒绝无效努力

把时间用在关键任务上

  • 管人是企业管理工作中重要的部分
  • 管理者的主要任务就是分清主次
  • 管理者主要的任务就是培养,带领员工成长
  • GTD:收集,整理,组织,回顾和执行

告别气氛沉闷,效率低下的回忆

  • 为什么要进行头脑风暴:1,惰性,2,局限性
  • 头脑风暴原则:1,对于意见不批评,不深入讨论;2,不要急着否定
  • 头脑风暴的流程:1,明确会议具体问题;2,不要急着发言,先记录,构思;3,各自陈述。头脑风暴人数不宜过多,最好请一个局外人参与。
  • 六顶帽子思考法:1,白色客观事实和数据;2,绿色创造力和想象力;3,黄色价值可肯定;4,黑色否定,怀疑,质疑;5,红色情感直觉,感受,6,蓝色控制和调节思维过程
  • 六领帽子的意义:1,达成共识,2,决策质量,3,会议气氛,4,执行有效。

通过JS记录和阻止http劫持

相关代码

try {
    setTimeout(function () {
        t = Math.random();
        data = {};
        data.from = location.href;
        data.urls = [];
        isUrlLooksGood = function (url) {
            if (url === 'about:blank') { return true; }
            url = new URL(url); hostname = url.hostname;
            var l = getLocation(url);
            return /(baidu.com|qq.com|mydomain.com)$/.test(l.hostname);
        };
        $('script').each(function () {
            var src = $(this).attr('src'); if (!src) { return; }
            if (!isUrlLooksGood(src)) {
                data.urls.push(src);
            }
        });
        $('iframe').each(function () {
            var src = $(this).attr('src'); if (!src) { return; }
            if (!isUrlLooksGood(src)) {
                data.urls.push(src);
            }
        });
        if (data.urls.length > 0) {
            (new Image).src = '/http_hijack.png?t=' + Math.random() + '&d=' + encodeURIComponent(JSON.stringify(data));
        }
    }, 3000);
} catch (e) { }

HTML转为PDF的两种方案(含nodejs、PHP以及Python三种实现代码)

采用chrome headless方案

为什么要采用Chrome headless

因为wkhtmltopdf内置的为qt的webkit,已经很久不更新了,很多css3以及html5都支持不友好。

Chrome官方提供的页面转换为PDF的接口

https://chromedevtools.github.io/devtools-protocol/tot/Page#method-printToPDF

命令行方式

chrome --headless --print-to-pdf=path/to/file.pdf https://example.com

参考:HTML to PDF conversion using Chrome pdfium?

NodeJS扩展

html-pdf-chrome HTML to PDF converter via Chrome/Chromium.

PHP扩展

chrome-html-to-pdf Converts HTML to PDF using Google Chrome

Chrome命令行参数列表

List of Chromium Command Line Switches

采用Qt的Webkit(PyQt5)

由于当前的chrome转换存在BUG,转换大文件时内存消耗特别大,生成的文件也比较大,测试了10多种方法后,最后决定采用PyQt5来做

#!/usr/bin/env python3

import sys
import argparse

from PyQt5.QtCore import QUrl, QMarginsF
from PyQt5.QtGui import QPageLayout, QPageSize
from PyQt5.QtWebEngineWidgets import QWebEngineView
from PyQt5.QtWidgets import QApplication


class PrinterView(QWebEngineView):
    def __init__(self, url, filename, do_preview, parent=None):
        super(PrinterView, self).__init__(parent)
        self.do_preview = do_preview
        self.setUrl(QUrl(url))
        self.setZoomFactor(1)
        self.loadFinished.connect(self.load_finished)
        self.filename = filename

    def load_finished(self):
        if self.do_preview:
            self.show()
        else:
            pageLayout = QPageLayout(QPageSize(QPageSize.A5), QPageLayout.Portrait,
                                     QMarginsF(0, 0, 0, 0))
            self.page().printToPdf(self.filename, pageLayout)
            self.page().pdfPrintingFinished.connect(on_pdf_finished)


def on_pdf_finished(result):
    if result:
        print(result)
        QApplication.exit()
    else:
        QApplication.exit(1)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    parser = argparse.ArgumentParser()
    parser.add_argument("--url", "-i", help="Input URL (http://example.com, file:///home/user/example.html, ...)",
                        required=True)
    parser.add_argument("--output", "-o", help="Write pdf to this file", required=True)
    parser.add_argument("--preview", "-p", help="Open preview", action="store_true")
    args = parser.parse_args()
    a = PrinterView(args.url, args.output, args.preview)
    sys.exit(app.exec_())

 采用qt打印

import sys
import argparse

from PyQt5.QtCore import QUrl, QMarginsF
from PyQt5.QtGui import QPageLayout, QPageSize
from PyQt5.QtWebEngineWidgets import QWebEngineView, QWebEnginePage, QWebEngineProfile
from PyQt5.QtWidgets import QApplication
from PyQt5.QtPrintSupport import QPrinter, QPrintDialog


class PrinterView(QWebEngineView):
    def __init__(self, url, filename, do_preview, parent=None):
        self.printer = QPrinter()
        self.printer.setPageSize(QPrinter.A5)
        self.printer.setOrientation(QPrinter.Portrait)
        self.printer.setOutputFormat(QPrinter.PdfFormat)
        self.printer.setOutputFileName(filename)
        self.printer.setPageMargins(0, 0, 0, 0, QPrinter.Millimeter)
        super(PrinterView, self).__init__(parent)
        self.do_preview = do_preview
        self.page().profile().setHttpCacheMaximumSize(5 * 1024 * 1024 * 1024)
        self.page().profile().setHttpCacheType(QWebEngineProfile.MemoryHttpCache)
        self.setUrl(QUrl(url))
        self.setZoomFactor(1)
        self.loadFinished.connect(self.load_finished2)
        self.filename = filename

    def load_finished(self):
        if self.do_preview:
            self.show()
        else:
            pageLayout = QPageLayout(QPageSize(QPageSize.A5), QPageLayout.Portrait,
                                     QMarginsF(0, 0, 0, 0))
            self.page().printToPdf(self.filename, pageLayout)
            self.page().pdfPrintingFinished.connect(on_pdf_finished)

    def load_finished2(self):
        self.show()
        self.page().print(self.printer, on_pdf_finished)


def on_pdf_finished(result):
    if result:
        print(result)
        QApplication.exit()
    else:
        QApplication.exit(1)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    parser = argparse.ArgumentParser()
    parser.add_argument("--url", "-i", help="Input URL (http://example.com, file:///home/user/example.html, ...)",
                        required=True)
    parser.add_argument("--output", "-o", help="Write pdf to this file", required=True)
    parser.add_argument("--preview", "-p", help="Open preview", action="store_true")
    args = parser.parse_args()
    a = PrinterView(args.url, args.output, args.preview)
    sys.exit(app.exec_())

使用firefox的pdf

slimer-html-pdf – convert any HTML document to PDF format using slimerjs (Gecko)

大文件合并(Python)

 def on_pdf_finished(self, result):
        if result:
            print(result + ', total ' + str(self.total))
        else:
            print("导出失败")
        self.printed = self.printed + 1
        print('导出第', self.printed, '本')
        if self.printed < self.total:
            self.print_book()
        else:
            print('开始合并')
            merger = PdfFileMerger()
            for index in range(0, self.total):
                filepath = self.filename + '.' + str(index) + '.pdf'
                merger.append(filepath)
                print('合并第', index, '本')
            merger.write(self.filename)
            merger.close()
            print('合并完成,开始清除临时文件')
            # for index in range(0, self.total):
            #     filepath = self.filename + '.' + str(index) + '.pdf'
            #     os.remove(filepath)
            print('清除临时文件完成')
            QApplication.exit()

HTML转markdown工具比较

Html2MarkDown – aTool在线工具

一款html和markdown标签互转的工具,直接输入Html,网页会自动帮你转换。

HTML2Markdown

Javascript Implementation for converting HTML to Markdown text.

html2markdown

Javascript implementation for converting HTML to Markdown text. Browser and Node.js support.

Turndown

Convert HTML into Markdown with JavaScript.

Python 新轮子 Tomd: HTML 转 Markdown 工具库

用途: 爬虫爬文章保存到本地为 Markdown 格式

LCTT选题工具

将内容复制到左侧输入框内,点击生成MD,在中部编辑器处进行二次修改,并在右侧的预览框中查看效果。 确认无误后点击上方的复制代码按钮即可将代码复制到剪贴板中!

html-to-markdown

An HTML-to-markdown conversion helper for PHP

Markdown Navigator 2.0

Markdown language support for IntelliJ platform

django2 + uwsgi + nginx

安装uwsgi模块

pip install uwsgi

测试uwsgi服务

uwsgi --http 0.0.0.0:8080 --file project/wsgi.py --static-map=/static=static

配置uwsgi.ini

# uwsig使用配置文件启动
[uwsgi]
# 项目目录
chdir=/data/pyproject/zc1024
# 指定项目的application
module=zc1024.wsgi:application
# 指定sock的文件路径
socket=/data/pyproject/zc1024/tmp/uwsgi.sock
# 进程个数
workers=4
pidfile=/data/pyproject/zc1024/tmp/uwsgi.pid
# 指定IP端口
http=127.0.0.1:8080
# 指定静态文件
static-map=/static=/data/pyproject/zc1024/static
# 启动uwsgi的用户名和用户组
uid=ning
gid=ning
# 启用主进程
master=true
# 自动移除unix Socket和pid文件当服务停止的时候
vacuum=true
# 序列化接受的内容,如果可能的话
thunder-lock=true
# 启用线程
enable-threads=true
# 设置自中断时间
harakiri=30
# 设置缓冲
post-buffering=4096
# 设置日志目录
daemonize=/data/pyproject/zc1024/tmp/uwsgi.log

运行配置

uwsgi --ini uwsgi.ini

配置nginx

 # 指定项目路径uwsgi
location / { # 这个location就和咱们Django的url(r'^admin/', admin.site.urls),
include uwsgi_params; # 导入一个Nginx模块他是用来和uWSGI进行通讯的
uwsgi_connect_timeout 30; # 设置连接uWSGI超时时间
uwsgi_pass unix:/data/pyproject/zc1024/tmp/uwsgi.sock; # 指定uwsgi的sock文件所有动态请求就会直接丢给他
}

# 指定静态文件路径
location /static/ {
alias /data/pyproject/zc1024/static/;
index index.html index.htm;
}

重新加载nginx配置

nginx -s reload