分类: 项目

  • 银耳汤

    从前,在一个遥远的国度里,有一位善良的老奶奶。她喜欢在自家的小花园里忙碌,为了给周围的人带来快乐和温暖。有一天,她从市场上回来,发现天空中下起了大雪。她担心那些没有温室保暖的动物们,于是她决定煮一锅热汤,给它们送温暖。
    她穿上了最保暖的衣服,戴上了帽子和围巾,然后出发了。虽然雪花飘落在她的身上,但她依然兴高采烈地寻找着。
    在森林里,老奶奶遇到了一只小松鼠,它正躲在一棵树下颤抖。老奶奶把银耳汤端给小松鼠,小松鼠激动得无法用语言表达。它用可爱的眼神看着老奶奶,仿佛在说:“谢谢您,善良的奶奶!”
    接着,老奶奶遇到了一只小兔子,它也正为寒冷而发愁。老奶奶把银耳汤端给小兔子,小兔子感到一股暖意从心底冒出,它高兴地蹦了起来。
    不久后,老奶奶又遇到了一只小狐狸。小狐狸以前从未见过如此美味的汤,它吃了一碗后,还想要更多。老奶奶心满意足地给了它一碗银耳汤,小狐狸感激地看着老奶奶,说:“谢谢您,亲爱的奶奶!”
    动物们都品尝到了老奶奶煮的最好的银耳汤,感到非常开心。
    从那以后,老奶奶煮的银耳汤传遍了这个国度。动物们都爱戴着老奶奶,它们知道,老奶奶用她的善良和爱,为它们带来了温暖和幸福。而老奶奶,也因为她的善良和关爱,被动物们称为“银耳汤奶奶”,成为了这个国度最受尊敬的人物。

  • win10部署fast-whisper实测最佳方案

    因为不喜欢win10上的shell,一直都比较喜欢在wsl中的ubuntu中跑服务,结果轮到fast-whisper的时候发现容器中无法加载模型,因为无法利用宿主机的代理,又不太方便把模型下载完放进去。

    还有个情况是,无法用到GPU,导致用CPU跑超慢。

    win10上的docker-desktop也是基于wsl的,但是创建容器的时候发现有个区别,一种是在powershell中跑命令,那么创建的容器可以走代理,下载模型顺利,而在wsl中的ubuntu跑创建docker命令创建的容器则不行,目前没有资料证实是否这样,没有太多时间再去研究这个网络。

    最后实测最佳方案是,在powershell中运行:

    docker run -d --gpus all -p 7860:7860 --name fast-whisper --mount type=bind,source=$(pwd)/.cache/whisper,target=/root/.cache/whisper --mount type=bind,source=$(pwd)/.cache/huggingface,target=/root/.cache/huggingface --restart=on-failure:15 registry.gitlab.com/aadnk/whisper-webui:latest app.py --input_audio_max_duration -1 --server_name 0.0.0.0 --auto_parallel True --default_vad silero-vad --default_model_name large-v2

    另外,打开Word Timestamps – Highlight Words以后,效果似乎更棒一些,还加上了标点符号,准确度很高。

  • 关于积水地图

    其实LBS还有很多可以发挥的点,最近聊到了老兵地图,之前我还搞过绘本馆地图、北京露营地地图等。

    最有意义的当属积水地图。

    积水地图

    那时候真好,虽然微博只有两千多粉,但发点东西,这几家地图提供商都很积极响应,高德最快,上线也最快。

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

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

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

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

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

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

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

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

    (征求意见稿)

    各有关单位:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    自习室是十年前的一个创业想法,http://futuremeng.sincebirth.spac/?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);
        },
      });

    打印成功。