分类归档 项目

通过孟繁永

如何优雅的转发会员付费文章

微信群里经常收到这样的文章,但看到财新我就怕了,你看半截,就看不下去了,因为人家要会员。

那如果自己有会员,又想把这篇文章分享给自己的朋友,该怎么办呢?

请看我在八年前提到的分享定价模式(http://futuremeng.com/?p=4244

具体来说,如果我是会员,我又想把一篇只有会员才能看的文章分享给朋友看,那我就为这篇文章付费,当然需要平台支持,买下若干次分享的权益,然后再转发到群里。

这样,最先若干个打开的用户就可以看了。分享数不够的时候,还可以点击申请分享者追加付费。

通过孟繁永

关于规范管理短租住房的通知(征求意见稿)点评

关于规范管理短租住房的通知

(征求意见稿)

各有关单位:

为加强短租住房管理,根据《中华人民共和国物权法》《中华人民共和国电子商务法》《中华人民共和国网络安全法》《中华人民共和国治安管理处罚法》《中华人民共和国反恐怖主义法》等相关规定,现就有关事项通知如下:

一、本通知所称短租住房是指利用本市国有土地上的居住小区内的住房,按日或者小时收费,提供住宿休息服务的经营场所。

二、经营短租住房应当符合下列条件:

(一)符合本小区管理规约或业主大会决定;(不赞成,对拥有产权的房产不应该设置前置条件,尤其是在目前小区规约或者业主大会在实质上无法高效低成本运行的情况下,这种议题很难落实,房东难以取得这样的决定通过。如果按这个来相当于封杀。)

(二)取得出租住房业主的书面同意;(不赞成,这个跟某些地方在家里注册公司办公地址一样,也是不应该的,不能假定这种业务就一定会扰民,否则有朋友来访问也要事先经过邻居同意,这不是很荒唐吗?这种只能通过邻居投诉,平台处罚,再升级到个人信用方面分层来解决。)

(三)房屋符合建筑、消防、治安、卫生等方面的安全条件;(这一条原则上不反对,但也不适合作为前置条件,这些房屋本身都是具备自住条件的,除非证明是公司化规模经营,有可能因为有限责任造成偷工减料或者过度经营产生隐患,房东对自有房产不会那么任性。何况短租平台的房屋信息比普通出租网站要详尽的多,房客也可以有充分的判断。)

(四)依法办理房屋出租登记。(赞成这一条,同时,也可以接受平台直接和相关部门联网,甚至在短租房安装联网监控设备,就像柴油车的联网监测一样。)

无管理规约或业主大会决定的,应当取得本栋楼内其他业主的书面同意。(不赞成,业主大会一般不应该涉及这个范围,无论是长租或者短租,其他业主无权干涉,这是业主的财产权。)

三、短租住房经营者通过互联网平台发布短租住房信息的,应当向互联网平台提交下列材料:

(一)所在小区管理规约、业主大会决定或本栋楼内其他业主书面同意的材料;(不赞成,上面说过了)

(二)业主身份证明;(没问题,目前平台都有身份验证)

(三)房屋权属证明;(没问题,目前平台都有身份验证)

(四)出租住房业主同意房屋用于短租经营的书面材料;(赞成,正当要求)

(五)经营者身份证明;(赞成,正当要求

(六)经营者与房屋所在地公安派出所签订的治安责任保证书面材料。(不赞成,但在登记时签一份也能接受,但这是公安推卸责任。)

四、互联网平台提供短租住房信息发布服务的,应当履行下列责任:

(一)核验短租住房经营者提交的材料;

(二)登记房屋详细地址,并实地查看房屋状况,确认符合相关规定;

(三)对短租住房经营者身份信息进行登记、审查并完成实名身份认证,对交易订单签订人和实际入住人员逐人登记身份信息和有效联系方式;

(四)按照公安、住建部门要求及时报送入住人员、房屋等信息。

互联网平台收集、使用其用户的个人信息,应当遵守法律法规有关个人信息保护的规定以及相关约定,不得泄露、篡改、毁损其收集的个人信息;未经被收集者同意,不得非法向他人提供个人信息。

五、互联网平台不得为下列短租住房提供信息发布服务:

(一)经营者提交的材料不齐全或核验未通过的;

(二)位置、面积与实际或权属证书记载不符的;

(三)图片、配套设施与实际不符的;

(四)使用旅馆业法规所规定名称的。

六、短租住房经营者应在住宿者入住前,当面核对住宿者身份证件信息,即时通过规定的信息系统申报登记信息。登记信息内容包括:承租人姓名、身份证件类别、身份证件号码、居住时间、有效联系方式等。(部分不赞同,目前的技术条件完全没有必要当面核对,微信视频或者直接安装联网的人脸核验设备都可以解决,短租房本身就不是自住,要求当面核验,极大地增加接待成本。)

短租住房经营者不得向无合法有效身份证明的人出租房屋。

七、住宿者应当携带合法有效身份证件,配合经营者和互联网平台登记申报身份信息和有效联系方式,不得利用短租住房从事违法犯罪活动、损害公共利益或者妨碍他人正常工作、生活。(后半句属于废话,无需声明。在扰民方面平台都有规约,比如根据房屋条件是否允许聚会等)

八、物业服务企业或房屋管理单位发现居住小区内存在违规短租住房的,应对违法违规行为进行劝阻、制止,劝阻、制止无效的,及时报告有关行政部门及属地街道、社区。(责任不明确,应该明确具体的定义违法违规行为,比如噪音扰民、未进行实名登记等,物业本身也不应该承担这样的检查责任,也没有这样的权利。相反,应该向短租房业主提供门禁方面的便利。)

九、住建(房管)、公安、网信等有关部门应当按照各自职责,做好短租住房的监督管理工作。(应该明确具体职责)

街道办事处、乡镇人民政府应加强对本辖区内短租住房的监督、巡查。(应该明确职责,法律依据,明确投诉渠道和解决流程)

十、短租住房出租人、短租住房经营者未按规定办理出租登记的,依照《治安管理处罚法》《反恐怖主义法》的相关规定处罚;互联网平台未要求用户提供真实身份信息或者向不提供真实身份信息的用户提供相关服务的,依照《网络安全法》《反恐怖主义法》的相关规定处罚;互联网平台未履行核验短租住房经营者提交的相关材料的,依照《电子商务法》相关规定处罚;短租住房存在其他违法情形或安全隐患的,依照相关法律法规查处。

十一、本通知自  年  月  日起施行。

通过孟繁永

不知不觉中“自习室”已然成了一种业态

自习室是十年前的一个创业想法,http://futuremeng.com/?s=%E8%87%AA%E4%B9%A0

经朋友提醒,发现不管是武汉还是北京,自习室都不下几十家了。十年前我核算的每个座位需要消费10元,现在每个座位均价在每日30元左右,北京的当然更贵一些,差不多要50元了。还有包月包季的。

这种微型房产项目是我十年前提出来的一个概念,说明服务业进一步细分,是好的方向,但是这种服务也是价格敏感的,尽管投入一般也不大。

不知道再过十年,从这些自习室里能走出一些什么大人物,就像老年间的咖啡馆那样。

通过孟繁永

一种房车垂直布局上下铺

如图所示,设计基础是6米的B型房车底盘。

车尾一个横向固定床,将一般的上下铺改为垂直布局,也可以视作是横床和纵床的结合。

设计思路:

(1)下面的横床枕上空间变高,上铺纵床用升降床,可尽量降低,也可以获得较高的空间。

(2)纵床下方接可上下伸缩的卫生间,卫生间在入睡前使用,夜间可将便携移动马桶放到车前备用。卫生间上下伸缩可将上部做成软的防水布帘或者上细下粗的嵌套方式。

另外,卡座上方也可以放置一个吊床,节省卡座改造的时间,也提升卡座变床的舒适度,放弃卡座上方的吊柜,或可以在吊床下面挂载一定的储物空间。这个吊床可以延伸到司机座位上方,增加长度到两米。

通过孟繁永

自制热敏打印机连接器始末(9)为什么要在osx上添加cups才能将指令发送到打印机

这个问题我一直很困惑,正如上一篇提到的raw打印,按说raw的意思就是直接将原始指令直接发送到设备上,比如将打印机视作一个usb设备,直接通过usb写入设备不就行了吗?

我一直没有调通这样的方案。理论上是可行的,但对打印机的一些设置可能会更复杂一些,或者是我的打印机不支持这种模式。

目前能做到的就是在oxs/mac上启用cups,添加一个打印机,添加一个匹配的驱动程序,很多国产(中国大陆)的热敏打印机不提供mac的驱动程序,但实际上,这些打印机的控制板厂商就那么几家,看看打印机说明书里面提到的指令类型,比如TSPL就知道该找哪个厂商的驱动,TSPL就找TSC,他家的官网上资料可以说是非常的全了,提供了各个语言的例程。

经过反复测试,在mac上有两种方式添加打印机,一种是开启cups的web页面(在那里添加打印机,选择raw方式,但这个路径我没跑通,打印机不正常工作。),可以在cups这里添加打印机,选择对应厂商的ppa驱动程序(同一个厂商的驱动程序因不同设备而有很多型号,但比较下文件就知道大同小异,主要体现在设备的最大打印宽度、最高打印速度、分辨率这三项上,还有一个是热敏和转印模式)。另一种方式是直接在系统偏好设置-打印机这里添加打印机,选择相应的ppa文件也可以。

最后回答题目里自己设置的问题,我也不知道。一种猜测是osx为了安全起见,必须通过cups才能访问打印设备。一种猜测是打印机不具备直接简单接收指令就能打印的能力,可能还需要一些默认配置,这些配置由驱动程序来提供(ppa文件就是一个文本/配置文件,里面的内容都可以看)。

通过孟繁永

自制热敏打印机连接器始末(8)一些基本概念

其实之前参考过这篇文章

https://www.printnode.com/en/docs/what-is-raw-printing

但是他们提供的api没有命令式的,只能打文件,现在回头来看,打印机确实可以这么连接,直接安装为raw的方式就可以用程序打印了,并不需要找驱动。

当然,为了简化cups的操作,对普通用户来说,提供一个tsc的驱动在传统的打印机界面上安装会更简单一些。

在cups中添加的raw打印机只能在cups中可见,打印机与扫描仪管理中是看不见的,当然,node-printer中可以调用到这个打印机。

梳理一下基本概念:

标签打印机:重点当然在标签,每次打印一小截,标签一般是固定大小,指令如TSPL

票据打印机:重点当然是票据,按需打印长度,然后撕掉。指令如EOP。

面单打印机:快递单那种,应该是跟标签打印机差不多,只不过更大。

其实对于打印机厂商来说,很多都已经兼容多种指令了,当然不包括得力这种OEM还不提供开发文档的。

要做一个跨平台的连接器,需要满足几个条件:

(1)能够构建跨平台的发布,所以范围就锁定在electron、xamarin这样的方案上,js和c#虽然都熟悉,但最近用的多的还是js,所以有限选electron,但是其实对node不够熟悉,所以造成了上一篇关于buffer类型的困惑。

(2)搞清楚打印机在不同的操作系统如何连接,目前还没尝试usb直驱这种,在mac上还是通过cups来连接,windows上都有相应的驱动,可以不单独讨论。

(3)指令集兼容性,目前只尝试了TSPL这一种,后续还需要其他的ZPL之类的测试一下,还需要在各种指令之间转换,方便原来用某个指令集编写的程序直接对接。

(4)接入方式的兼容性,至少应该支持socket和http。

(5)统一的api,尤其是友好的RestFul模式的api,便于开发对接。

通过孟繁永

自制热敏打印机连接器始末(7)指令如何编码,尤其是汉字的编码

接下来就想为什么汉字是乱码呢?是command.setText(50, 100, “TSS24.BF2”, 1, 1, “一二三”);里面的汉字需要转码吗?

对照jpPrinter.addCommand里面把原来的转码去掉了,如果在command.setText(50, 100, “TSS24.BF2”, 1, 1, “一二三”);中把汉字转成unico呢,试了试也不行。

把jpPrinter.addCommand恢复回去,

jpPrinter.addCommand = function(content) {
      // 将指令转成数组装起;
      var code = new encode.TextEncoder("gb18030", {
        NONSTANDARD_allowLegacyEncoding: true,
      }).encode(content);
      for (var i = 0; i < code.length; ++i) {
        command.push(code[i]);
      }
      // command = command + content;
    };

还是会报错,throw new TypeError(‘first argument must be a string or Buffer’);

然后仔细一看,原来data复制不止是string类型,还可以是buffer类型。

那就接着从BluetoothPrinter往这里扒,因为不是蓝牙,不受每次传输的长度限制,所以把分段传输的逻辑去掉。

var data = Array.from(uint8Buf);
  var buffer = new ArrayBuffer(data.length);
  
  var dataView = new DataView(buffer);
  for (var i = 0; i < data.length; ++i) {
    dataView.setUint8(i, data[i]);
  }
  console.log(
    "data type is: " + typeof data + ", is buffer: " + Buffer.isBuffer(data)
  );

但是,还是报同样地错误。

然后发现Buffer.isBuffer(data)是false,为什么类型不对呢?

于是搜到了这里http://nodejs.cn/api/buffer.html#buffer_static_method_buffer_from_arraybuffer_byteoffset_length

是nodejs里面对Buffer有不同于js的类型定义。

于是改成:

var uint8Buf = command.getData();
  var buffer=Buffer.from(uint8Buf);
  console.log(
    "buffer type is: " + typeof buffer + ", is buffer: " + Buffer.isBuffer(buffer)
  );
  var jobid = "";
  printer.printDirect({
    data: buffer, // or simple String: "some text"
    printer: "Deli_DL_888B_NEW_", // printer name, if missing then will print to default printer
    type: "RAW", // type: RAW, TEXT, PDF, JPEG, COMMAND.. depends on platform
    success: function(jobID) {
      console.log("sent to printer with ID: " + jobID);
      jobid = jobID;
    },
    error: function(err) {
      console.log(err);
    },
  });

打印成功。

通过孟繁永

自制热敏打印机连接器始末(6)验证指令可以驱动打印机输出但有乱码

后来我找到了https://github.com/qihang666/BluetoothPrinter这个项目,人家用蓝牙直接连打印机,比如我手头的DL-888AW就有蓝牙,我用usb为什么就不行呢,所以我就着手将这个项目中的代码拿过来。

尽管他里面的打印机指令集叫jprinter,但指令集实际上是TSPL,所以理论上应该可以复用。

拿过来的部分是https://github.com/qihang666/BluetoothPrinter/tree/master/components/gprint,

考虑到https://github.com/tojocky/node-printer/blob/master/examples/print_raw.js这里面提示的是data部分需要string类型,所以,我把tsc.js里面的command改成了字符串类型,把

jpPrinter.addCommand = function(content) {
      // 将指令转成数组装起;
      var code = new encode.TextEncoder("gb18030", {
        NONSTANDARD_allowLegacyEncoding: true,
      }).encode(content);
      for (var i = 0; i < code.length; ++i) {
        command.push(code[i]);
      }
    };

改成了

jpPrinter.addCommand = function(content) {
       command = command + content;
    };

然后打印的时候:

var command = tsc.jpPrinter.createNew();
  console.log(command);
  command.setSize(60, 40);
  command.setGap(2);
  command.setCls();
  command.setText(50, 10, "2", 1, 1, "Hello");
  command.setText(50, 100, "TSS24.BF2", 1, 1, "一二三");
  // command.setQR(50, 50, "L", 5, "A", "977767937@qq.com");
  command.setPagePrint();

  var data=command.getData();
  var jobid = "";
  printer.printDirect({
    data: data, // or simple String: "some text"
    printer: "Deli_DL_888B_NEW_", // printer name, if missing then will print to default printer
    type: "RAW", // type: RAW, TEXT, PDF, JPEG, COMMAND.. depends on platform
    success: function(jobID) {
      console.log("sent to printer with ID: " + jobID);
      jobid = jobID;
    },
    error: function(err) {
      console.log(err);
    },
  });

惊喜出现了,打印机工作了,但是汉字是乱码。

通过孟繁永

自制热敏打印机连接器始末(5)放弃直接驱动usb,尝试找替代的驱动程序

中间走了一段弯路,因为一直无法直接用程序驱动打印机打出东西来,无法验证以前的思路是否可行,所以,想着是否应该给打印机找一找mac版的驱动,然后尝试直接在电脑上打印一个pdf文件,来和程序做下对比。于是,按照打印机的说明书里说的TSPL这个语言,找到了TSC这个厂商,他们家的网站上资源真是全啊https://www.chinatsc.cn/

按照类似的规格找了几个型号的打印机,下载驱动,然后发现其实人家的驱动都在一起。

这个ppd文件就是所谓驱动,用vscode打开,发现就是文本文件,对比一下,发现基本上都是一样的,对于热敏打印机来说,只有几个参数有区别,主要是打印宽度、打印速度、打印方式(热敏/热转印)。

找到了驱动,就可以在系统的打印机管理中添加打印机,然后自选某个驱动文件,比如我试了TA200,Deli_DL_888B_NEW是可以打印文件的。

但是我用node-printer还是无法打印。

  printer.printDirect({
    data:"测试", // or simple String: "some text"
    printer: "Deli_DL_888B_NEW_", // printer name, if missing then will print to default printer
    type: "RAW", // type: RAW, TEXT, PDF, JPEG, COMMAND.. depends on platform
    success: function(jobID) {
      console.log("sent to printer with ID: " + jobID);
      jobid = jobID;
    },
    error: function(err) {
      console.log(err);
    },
  });

打印机有时间连动都不动。

通过孟繁永

自制热敏打印机连接器始末(4)分清楚热敏打印机的几种常用指令集

都调试起来以后,连接打印机,发现打印机根本没反应,网上找到的相关资料很少,大部分都是在windows或者linux上做的,难道是mac的osx有一些安全限制,导致打印的指令被拦截了。

于是照着这个思路查下去,终于找到了一个新的东西:CUPS。其实这个东西支持linux也支持mac,按照说明添加上打印机之后,确实能在mac的打印机列表中看到了,而且在系统打开一个文件用这个打印机打印,是有动作的,尽管是瞎走纸,没有真正的输出。但至少说明是有希望了。

那么为什么用electron-escpos还是无法打印呢,甚至依然连走纸反应都没有。

无奈又去得力的官网看了看,找到888B这个打印机的说明书,仔细瞅了一眼,竟然发现它说他的编程语言是TSPL,不兼容ESCPOS,擦,过于相信刚找到escpos这个神奇的协议的时候它所说的几乎所有的打印机都支持了。

https://blog.csdn.net/weixin_34355881/article/details/89543300这篇文章介绍了打印机主流的指令类型(ESC命令集+CPCL命令集+TSPL命令集)之间的区别。这就解释了上面我对打印机类型的模糊认识

好了,标签打印机一般用TSPL命令集,票据打印机一般用ESCPOS。而我用的得力888B(NEW)是标签打印机。

那么,就需要将原来的escpos换成tspl来写打印命令。