Canonical正式发布专为物联网和嵌入式设备优化的Ubuntu Core 22操作系统

2022年6月16日,Canonical 宣布推出专为物联网和边缘设备优化的 Ubuntu 22.04 LTS 完全容器化的版本 Ubuntu Core 22,该操作系统现在可通过https://cn.ubuntu.com/download/iot下载。

结合 Canonical 提供的技术,该版本将 Ubuntu 全面且行业领先的操作系统和服务带到各种嵌入式和物联网设备中。

物联网制造商面临着复杂的挑战,他们需要控制在预算范围内并准时地部署设备。随着设备组的扩大,确保大规模安全性和远端管理也并非易事。Ubuntu Core 22通过提供具备超高安全性、自我修复且低接触的操作系统,帮助制造商应对这些挑战。该操作系统对不断扩大的芯片和物联网设备制造商合作伙伴生态系统提供支持。

Canonical 首席执行官 Mark Shuttleworth 表示:“Canonical 的目标是从开发环境到云端,再到边缘和设备的任何位置,提供安全、可靠的开源操作系统。通过发布新版操作系统,以及 Ubuntu 的实时内核(Real-Time Kernel),我们已经准备好为整个嵌入式世界提供 Ubuntu Core 的优势。”

支持实时内核

Ubuntu 22.04 LTS 的实时内核现已推出 beta 版,可提供高性能、超低延迟和工作负载可预测性,适用于对设备反应时间敏感的工业、电信、汽车和机器人等使用场景。

新版本包含一个完全先占式(Preemptible)内核,用以确保有时限的反应时间。Canonical 与芯片商和硬件制造商合作,在 Ubuntu 认证硬件上实现开箱即用的实时计算功能。

以物联网应用为中心

Ubuntu Core 提供功能强大、完全容器化的 Ubuntu,将 Ubuntu 拆分成被称为 snap 的软件包,包括内核、操作系统和应用程序。每个 snap 都是一个独立的沙箱,其中包含应用软件的依赖包,完全实现可移植性和可靠性。Canonical 的 Snapcraft 框架支持多通道的 snap 开发,进而实现快速迭代、自动化测试和可靠部署。

每台运行 Ubuntu Core 的设备都有一个专属的物联网应用商店平台(IoT App Store),不仅可以完全控制相应设备上的应用,还可在同一个物联网应用商店平台上创建、发布和分发软件。物联网应用商店平台还为企业提供高级的软件管理解决方案,从而实现一系列新的本地部署功能。

该系统可确保内核、操作系统和应用程序的事务化、任务关键型在线更新(OTA),更新始终会成功完成,否则会自动回滚到以前运行的版本,因此设备不会因更新未完成而“变砖”。Snap 还提供增量更新来尽量减少网络流量,并提供数位签名以确保软件的完整性和来源。

安全和低接触

Ubuntu Core 提供开箱即用的高级安全功能,包括安全启动(Secure Boot)、全储存加密(Full Disk Encryption)、安全的系统恢复以及对操作系统和应用程序的权限限制。

KMC Controls 的首席运营官 Brad Kehler 表示:“KMC Controls 的一系列物联网设备专门为关键任务型工业环境而设计。对我们的客户来说,安全最为重要。我们之所以选择 Ubuntu Core 是因为它具有内置的高级安全功能和功能强大的在线更新框架。Ubuntu Core 提供10年安全更新承诺,让我们能够在长期使用设备的过程中确保其安全性。借助已验证的应用支持框架,我们的开发团队可以专注于创建用于解决业务问题的应用。”

客户受益于 Canonical 提供为内核、操作系统和应用程序代码级别的10年长期安全维护服务,使设备及其应用能够满足企业和公共领域的数位安全要求。

不断发展壮大的合作伙伴生态圈

如今 Canonical 已与研华科技和联想等多家领先的芯片和硬件厂商建立合作伙伴生态圈,由此确立了 Ubuntu Core 的市场地位。

Ubuntu 认证计划更定义了一系列现有的物联网和边缘设备,这些受信任的设备可与 Ubuntu 配合使用。该计划的独特之处在于,在设备的整个生命周期内,Canonical 实验室会在认证硬件每次安全更新时对其进行持续测试。

研华 WISE-Edge+ 总监 Eric Kao 表示:“研华提供嵌入式、工业、物联网和自动化解决方案。我们将继续深入参与 Ubuntu 硬件认证计划。Canonical 认证的硬件会通过广泛的测试,提供稳定、安全和优化的 Ubuntu Core,帮助我们的客户加快产品上市和缩减开发成本。”

更多Ubuntu Core 22的详细资讯

如需了解 Ubuntu Core 22 的更多资讯,请访问 http://cn.ubuntu.com/internet-of-things/core 。Canonical 将发布一系列技术文章,对 Core 22 的功能进行更深入的探讨。

如需立即开始使用 Ubuntu Core 22,请通过此链接下载已支持的平台的镜像。


关于Canonical

Canonical 是 Ubuntu 发行商,Ubuntu 是用于容器、云、超大规模计算的领先的操作系统。大部分公有云工作负载都用Ubuntu,大部分的新智能网关、交换机、自动驾驶汽车和先进的机器人也如此。Canonical 为 Ubuntu 商业用户提供企业级支持和服务,公司创立于2004年,是一家私人控股公司。

让Apache IoTDB轻松部署到ARM开发板

Apache IoTDB(物联网数据库)是一体化收集、存储、管理与分析物联网时序数据的软件系统。

采用轻量式架构,具有高性能和丰富的功能,并与Apache Hadoop、Spark和Flink等进行了深度集成,可以满足工业物联网领域的海量数据存储、高速数据读取和复杂数据分析需求。

官方提供了x86的版本和源代码,但没提供ARM的版本。

这里编译了一个arm64的版本,方便广大的ARM玩家测试使用。

你可以在树莓派4B,Rockpi,Firefly,香蕉派等arm64架构的系统上调试,运行此镜像。

注:这里的v0.13版本,对应的是apache-iotdb-0.13.0-server-bin.zip这个官方包。

主要工作目录:

/iotdb/sbin

运行后,执行start-server.sh文件,即可启动IoTDB。

nohup start-server.sh >/dev/null 2>&1 &

默认用户名密码都是root。

命令行登录,请执行:

start-cli.sh -h 127.0.0.1 -p 6667 -u root -pw root

官方仓库说明:

https://hub.docker.com/r/verdureorange/iotdb_arm

直接拉取镜像:

docker pull verdureorange/iotdb_arm:v0.13

Python的打包神器 —— Nuitka

一. pyinstaller和Nuitka使用感受

1.1 使用需求

这次也是由于项目需要,要将python的代码转成exe的程序,在找了许久后,发现了2个都能对python项目打包的工具——pyintaller和nuitka。

这2个工具同时都能满足项目的需要:

  • 隐藏源码。这里的pyinstaller是通过设置key来对源码进行加密的;而nuitka则是将python源码转成C++(这里得到的是二进制的pyd文件,防止了反编译),然后再编译成可执行文件。
  • 方便移植。用户使用方便,不用再安装什么python啊,第三方包之类的。

1.2 使用感受

2个工具使用后的最大的感受就是:

  • pyinstaller体验很差!
    • 一个深度学习的项目最后转成的exe竟然有近3个G的大小(pyinstaller是将整个运行环境进行打包),对,你没听错,一个EXE有3个G!
    • 打包超级慢,启动超级慢。
  • nuitka真香!
    • 同一个项目,生成的exe只有7M!
    • 打包超级快(1min以内),启动超级快。

二. Nuitka的安装及使用

2.1 nuitka的安装

  • 直接利用pip即可安装:pip install Nuitka
  • 下载vs2019(MSVS)或者MinGW64,反正都是C++的编译器,随便下。

2.2 使用过程

对于第三方依赖包较多的项目(比如需要import torch,tensorflow,cv2,numpy,pandas,geopy等等)而言,这里最好打包的方式是只将属于自己的代码转成C++,不管这些大型的第三方包!

以下是我demo的一个目录结构(这里使用了pytq5框架写的界面):

├─utils//源码1文件夹├─src//源码2文件夹├─logo.ico//demo的图标└─demo.py//main文件

使用以下命令(调试)直接生成exe文件:

nuitka --standalone --show-memory --show-progress --nofollow-imports --plugin-enable=qt-plugins --follow-import-to=utils,src --output-dir=out --windows-icon-from-ico=./logo.ico demo.py

这里简单介绍下我上面的nuitka的命令:

  • --standalone:方便移植到其他机器,不用再安装python
  • --show-memory --show-progress:展示整个安装的进度过程
  • --nofollow-imports:不编译代码中所有的import,比如keras,numpy之类的。
  • --plugin-enable=qt-plugins:我这里用到pyqt5来做界面的,这里nuitka有其对应的插件。
  • --follow-import-to=utils,src:需要编译成C++代码的指定的2个包含源码的文件夹,这里用,来进行分隔。
  • --output-dir=out:指定输出的结果路径为out。
  • --windows-icon-from-ico=./logo.ico:指定生成的exe的图标为logo.ico这个图标,这里推荐一个将图片转成ico格式文件的网站(比特虫)。
  • --windows-disable-console:运行exe取消弹框。这里没有放上去是因为我们还需要调试,可能哪里还有问题之类的。

经过1min的编译之后,你就能在你的目录下看到:

├─utils//源码1文件夹├─src//源码2文件夹├─out//生成的exe文件夹
    ├─demo.build 
    └─demo.dist
		└─demo.exe//生成的exe文件├─logo.ico//demo的图标└─demo.py//main文件

当然这里你会发现真正运行exe的时候,会报错:no module named torch,cv2,tensorflow等等这些没有转成C++的第三方包。

这里需要找到这些包(我的是在software\python3.7\Lib\site-packages下)复制(比如numpy,cv2这个文件夹)到demo.dist路径下。

至此,exe能完美运行啦!

文章转载:Python编程学习圈(版权归原作者所有,侵删)

免费 “送” 芯片,Google为开源项目推出全新门户网站

自 2020 年 11 月起,Google 就与 SkyWater Technology 展开了合作,使用后者的开源工艺设计套件(PDK)来帮助小型开源项目进行芯片制造,在此过程中 Google 会承担芯片制造的费用。为了更好地帮助开发者,Google 在今天推出了一个新的芯片设计门户网站。

Google 的这项计划名为 Open MPW Shuttle Program,允许任何人利用开源 PDK 和其他开源 EDA 工具来提交开源集成电路设计,Google 会为他们免费制造,不会收取任何费用。虽然芯片制造是在 130 纳米工艺(SKY130)上完成的,但这一计划对资金有限的开源硬件项目具有巨大的推动作用(如:物联网的硬件原型设计等)。SKY130 成熟工艺节点为物联网应用原型提供了一种很好的方式,这些应用通常需要在成本、功耗与性能之间取得平衡。它提供比尖端工艺节点更快的周转率,而价格却只有几分之一。

新推出的芯片设计门户网站具备了详尽的教程,会根据初级、中级和高级制定了对应的学习路线,开发者或者学生群体可以按照自己的水平学习对应的技能。

网站还罗列出了芯片设计过程中需要使用的工具,里面的每一个工具都是开源工具。通过 Google 提供的教程和对应的工具,开发者可以快速完成芯片设计并提交,最终完成制造。

目前 Open MPW Shuttle Program 已经收到了诸如 Microwatt OpenPOWER 64 位芯片、RISC-V 芯片、数独加速器、各种游戏的硬件实现、SRAM/ReRAM 生成器以及其他小型 ASIC 的提交。

Google 与其合作伙伴正在为他们的下一轮制造接受开源项目,提交期限为 6 月 8 日,错过了也没关系,这是一项长期计划,开发者也可以等待下一个提交周期。

相关链接:https://developers.google.com/silicon

Ubuntu 22.04 LTS 测试版实时内核已可申请

在4月21日,Canonical宣布了Ubuntu 22.04 LTS的实时内核新特性,已可申请测试。

测试版实时内核基于上游 v5.15,22.04 LTS 内核集成了针对 x86_64 和 AArch64 架构的树外 PREEMPT_RT 补丁。一旦进入 GA (通用可用性),新的实时内核将为下一代机器人、物联网和电信创新提供确定性的响应时间,以满足其极低的延迟要求。

确定性的响应时间

实时 Ubuntu 测试版的调度程序可以抢占内核中的线程,包括关键部分、中断处理程序和中断禁用代码序列,保证有界的响应。通过最小化内核代码中不可抢占的关键部分,PREEMPT_RT 补丁(尚未完全上游)使测试内核比主线更具抢占性。

为生产做好准备

由于这是一个 beta 版本内核,它不提供任何支持,同时也建议不要将其用于生产工作负载。我们致力于将实时内核带入生产级别,而您的反馈将帮助我们实现此目标。请考虑通过此处报告您可能遇到的任何错误来测试并积极影响 Ubuntu 社区。

此外,请考虑加入我们的免费测试计划,与我们的团队建立一个开放的沟通渠道,提供反馈并分享建议。作为实时 Ubuntu beta 测试人员,一旦内核准备好用于生产,我们将首先通知您。

获得测试版实时内核

测试内核可通过Ubuntu订阅个人版(UA-I) 获得且免费供个人使用,这是最全面的 Linux 企业订阅,涵盖开放基础架构的所有方面。

要将您的个人计算机添加到 UA 订阅,请运行:

ua attach <免费的TOEKN>

确保你在使用至少27.8版本的ubuntu-advantage-tools软件包,可通过此命令查看当前版本:

ua version

要在Ubuntu 22.04(Jammy Jellyfish)中升级ubuntu-advantage-tools到27.8,请运行命令:

sudo apt install ubuntu-advantage-tools=27.8~22.04.1

要启用测试版实时内核,可运行:

ua enable realtime-kernel –beta

请注意,在启用实时内核后您需要手动配置 grub 以恢复到原始内核。更多内容请参考:

ua help realtime-kernel

来自:cn.ubuntu.com
作者:Edoardo Barbieri 

一条命令部署FreeRTOS for XR806交叉编译环境

之前,全志科技XR806主要是用来跑OpenHarmony(鸿蒙)的。

但由于鸿蒙这个操作系统还比较新,编译环境配置起来有些麻烦,于是我就做了一个基于Docker的交叉编译环境。

最近看到全志科技公布了XR806的FreeRTOS SDK,赶紧一探究竟。

其实全志之前出了几个版本,现在这个1.2.1版本经过多方测试,比较稳定。

先来看看这个版本的主要功能。

xr806_sdk-v1.2.1的主要功能描述如下:

1、支持WiFi STA/AP模式;
2、支持WiFi WPA3功能;
3、支持BLE扫描、广播、连接、配对;
4、支持BLE MESH;
5、支持SoundConfig、AirKiss、SmartConfig、APConfig配网;
6、支持MbedTLS、MQTT、WebSocket等多种网络协议;
7、支持PSRAM、DMA、GPIO、UART、PWM、CODEC播放与录音、ADC转换、硬件加解密、看门狗等多种外设;
8、支持MP3、M4A、AAC、AMR、TS、M3U8等音频的播放,支持Flash、HTTP、HTTPS、音频数据流播放。

FreeRTOS是国际上比较流行的一款MCU的嵌入式操作系统。

历史悠久,用户基础很大。

为了方便初学者调试,我这里顺便做了一个FreeRTOS交叉编译的Docker版本。

Docker官方仓库地址:

https://hub.docker.com/r/verdureorange/ubuntu_xr806

安装方式:

在已经安装Docker的情况下,执行以下命令:

docker run -it verdureorange/ubuntu_xr806:v2 /bin/bash

注:v1是OpenHarmony的环境,v2才是FreeRTOS的,请勿搞混。

全志XR806 FreeRTOS_BSP编译

1、构建工作文件夹
(1)cd ~
(2)mkdir work
(3)cd work
(4)mkdir xr806
(5)cd xr806
2、获取资源
(1)wget http://www.armsoc.cn/whycan/xr806/xr806_sdk_v1.2.1.tgz
(2)wget http://www.armsoc.cn/whycan/xr806/gcc-arm-none-eabi-8-2019-q3-update-linux.tar.bz2

如果获取失败,直接whycan下载(可能需要积分)
–>freeRTOS bsp
    xr806_sdk_v1.2.1.tgz
–>gcc工具链   
    gcc-arm-none-eabi-8-2019-q3-update-linux.tar.bz2
3、编译一个例程
(1)解压bsp
tar -xzvf xr806_sdk_v1.2.1.tgz
(2)选择一个例程进行编译
cd ~/work/xr806/xr806_sdk_v1.2.1/project/demo
ls
可以看到现在有一下几个例程

book@book-desktop:~/work/xr806/xr806_sdk_v1.2.1/project/demo$ ll
总用量 32
drwxrwxr-x  8 book book 4096 4月   2 16:50 ./
drwxrwxr-x 10 book book 4096 4月   2 16:50 ../
drwxrwxr-x  3 book book 4096 4月   2 17:26 at_demo/
drwxrwxr-x  4 book book 4096 4月   2 17:23 audio_demo/
drwxrwxr-x  8 book book 4096 4月   2 16:50 bluetooth/
drwxrwxr-x  3 book book 4096 4月   2 17:22 hello_demo/
drwxrwxr-x  4 book book 4096 4月   2 16:50 wlan_ble_demo/
drwxrwxr-x  3 book book 4096 4月   2 16:50 wlan_demo/

(3)选择hello_demo
    cd hello_demo
(4)进入gcc目录,进行编译
cd gcc
make
    结果,编译出错了,原因是我们没有安装交叉编译工具链。

...
/bin/sh: 1: /home/book/tools/gcc-arm-none-eabi-8-2019-q3-update/bin/arm-none-eabi-gcc: not found
../../../../project/project.mk:437: recipe for target 'hello_demo.elf' failed
make[1]: *** [hello_demo.elf] Error 127
make[1]: 离开目录“/home/book/work/xr806/xr806_sdk_v1.2.1/project/demo/hello_demo/gcc”
../../../../project/project.mk:426: recipe for target '__all' failed
make: *** [__all] Error 2

4、安装交叉编译工具链
(1)解压工具链
cd ~/work/xr806/
tar -xvf gcc-arm-none-eabi-8-2019-q3-update-linux.tar.bz2
(2)复制到项目例程指定的目录
根据上面的错误信息,我们可以知道交叉编译工具链,应该是存放在这个位置:
/home/book/tools/gcc-arm-none-eabi-8-2019-q3-update/

cd ~
mkdir tools
cd ~/work/xr806/
cp -r gcc-arm-none-eabi-8-2019-q3-update ~/tools/

5、回到例程目录,重新编译
cd ~/work/xr806/xr806_sdk_v1.2.1/project/demo/hello_demo/gcc/
make
编译结果,看起来像是成功了

~/tools/gcc-arm-none-eabi-8-2019-q3-update/bin/arm-none-eabi-objcopy -O binary -R .xip   hello_demo.elf hello_demo.bin
~/tools/gcc-arm-none-eabi-8-2019-q3-update/bin/arm-none-eabi-objcopy -O binary -j .xip hello_demo.elf hello_demo_xip.bin
~/tools/gcc-arm-none-eabi-8-2019-q3-update/bin/arm-none-eabi-size hello_demo.elf
   text    data     bss     dec     hex filename
  39768    1576    2248   43592    aa48 hello_demo.elf
make[1]: 离开目录“/home/book/work/xr806/xr806_sdk_v1.2.1/project/demo/hello_demo/gcc”
book@book-desktop:~/work/xr806/xr806_sdk_v1.2.1/project/demo/hello_demo/gcc$ 

我们得到了两个bin文件,一个elf文件
hello_demo.bin
hello_demo_xip.bin
hello_demo.elf

6、烧写程序到开发板

(1)生成烧写镜像
上述make只是生成了bin文件,我们需要进一步生成烧写镜像,才可以顺利下载。
make image

Flash Layout:
sec bin 0 boot_40M.bin      :   flash_offs: 0x00000000(   0K)   data_size: 0x00002F28(  12K)
sec bin 1 app.bin           :   flash_offs: 0x00004000(  16K)   data_size: 0x00004920(  19K)
sec bin 2 app_xip.bin       :   flash_offs: 0x00029800( 166K)   data_size: 0x000058E0(  23K)

generate image: xr_system.img
cp -t ../../../../out/ ../image/"xr806"/*.bin ../image/"xr806"/xr_system.img *.map
book@book-desktop:~/work/xr806/xr806_sdk_v1.2.1/project/demo/hello_demo/gcc$ 

(2)获取工具
工具存放在bsp包./tools目录里,程序文件为phoenixMC.exe。

(3)烧写镜像

作者:LinjieGuo

来自:WhyCan Forum

世界上第一只炒加密货币的小仓鼠,3个月赚了50%

世界之大,无奇不有。

你能想象仓鼠炒加密货币,还赚了不少钱吗?

最近国外有一只名叫Mr Goxx的仓鼠火了。

它是世界上第一只仓鼠加密货币交易员。

仓鼠Mr Goxx的业绩还真不错。

3个多月时间回报率达到19.41%。

在某段时间中,Mr Goxx的投资组合上涨了50%。

而同一时段,比特币也才上涨41%。

大家盘点一下自己今年的投资业绩。

和仓鼠Mr Goxx比一下,是不是有点拿不出手。

仓鼠怎么投资呢?

原理很简单,和预测足球胜负的章鱼保罗类似。

早些年,动物界出了个“神算子”章鱼保罗。

章鱼保罗以擅长预测足球比赛输赢闻名于世。

章鱼保罗是怎么预测的呢?

每次比赛前,在两支队伍的国旗下都摆上同样的食物。

章鱼保罗吃哪边的食物,就代表它猜哪支队伍赢。

简单说,全靠蒙成就了章鱼保罗的江湖地位。

当然你非要说章鱼保罗有什么超能力,我也没法反驳你。

仓鼠Mr Goxx用类似的方法交易加密货币。

仓鼠Mr Goxx居住的笼子是它的卧室。

卧室旁边有一个设计精巧的“办公室”。

办公室里有一个滚轮,随着仓鼠在上面奔跑,转动的滚轮会自动从30种加密货币中挑选出当天要买卖的加密货币。

选好之后,地上有两条管道,一条代表“买入”,一条代表“卖出”,

仓鼠钻哪条,就执行哪种交易命令。

Mr Goxx是在6月12日进入加密货币市场的,启动资金326欧元。

在刚开始的第一个月里,它交易了95次,最后亏了7.3%。

随后业绩慢慢好转,截止9月27日,Mr Goxx的从业回报率达到19.41%。

让仓鼠炒加密货币的主意,源于仓鼠主人和朋友的一个玩笑。

两人都来自德国,今年30多岁。

他们觉得现在什么都贵,年轻人太不容易了。

付完高昂的房租,几乎存不下什么钱。

对这代年轻人来说,好像除了把积蓄投入加密货币外,没有其他致富的机会了。

但对加密货币,其实很多人都一无所知。

仓鼠的主人就开了个玩笑,我家仓鼠会不会比人更会投资?

两人并不是嘴上说说,真的马上行动起来,给仓鼠打造了上面这个办公室。

两人作为出资方,投资给仓鼠交易员326欧元本金后,仓鼠就开始它的加密货币交易了。

仓鼠的名字Mr Goxx也大有来头。

这个名字源于曾经世界上最大的加密货币交易所——日本公司“Mt Gox”。

2014年Mt Gox遭黑客入侵,被盗走了价值约4.6亿美元的比特币,直接破产了。

Mr Goxx的交易策略就是没策略。

就这么随意的钻钻跑跑,居然也赚到了这么多。

真是应了那句话,风口来的时候,仓鼠都能飞上天。

两人把仓鼠交易员的日常通过自动化程序发到网上。

每当它跨进办公室,它在Twitch的直播会立即开启,推特也会发出一行文字:Mr Goxx已经开始交易。

它的每条投资动态下面,都专门备注了一句话:内容仅供娱乐,不作为投资建议。

真的有人会学着仓鼠做交易吗?

仓鼠都能炒加密货币的今天,好像也没什么不可能。

仓鼠Mr Goxx虽然业绩不俗,但因为本金太少,它赚的钱连笼子的钱都不够。

仓鼠Mr Goxx这个名字,也让人联想到破产交易所,暗含了对加密货币市场风险的担忧。

有趣的是,现实生活中许多人们眼中的投资明星,成功之道和仓鼠可能真的差不多。

巴菲特1984年在哥伦比亚大学商学院做了一次演讲。

演讲中他提到一个“全美抛硬币猜正反面大赛”的小故事。

假设全美国2.25亿人每天都参加一次抛硬币赌1美元的游戏。

输家被淘汰出局,赢家把输家手中的钱拿走,再全部投入作为第二天的赌注。

经过十个早上的比赛,将大约有22万名美国人连续获胜,他们每人可赢得略微超过1,000美元的钱。

这时他们就会吹嘘自己在抛硬币上如何技术高超,如何天才过人。

再过10天,将会有215位连续猜对20次硬币的正反面的赢家。

他们每个人用1美元赢得了100多万美元。

他们很可能会写一本书——“我如何每天只需工作30秒就在20天里用1美元赚到100万美元”。

他们还会在全国飞来飞去,参加各种抛硬币神奇技巧的研讨会。

这些用1美元本金,20天时间赚了100多万美元的幸运儿,本质上和仓鼠Mr Goxx差不多。

仓鼠Mr Goxx和人类相比,吃亏在不能发声表达。

否则它只要出几本书,上几次电视,同样能成为投资界一颗新星。

随机性和偶然性让投资世界充满了奇幻色彩。

仓鼠Mr Goxx的投资业绩告诉我们,选择很重要。

当你选择了风口行业,就像上了一部上行电梯。

你一定要对此心知肚明,别觉得自己多厉害。

下次再有人吹嘘自己高超的投资技能时,你应该清楚他可能只是另一只幸运的仓鼠而已。

python-crontab 设置定时任务

通过python-crontab 设置定时任务(创建设置定时任务的.py文件,并运行即可)
安装包: pip install python-crontab

创建新的py文件, 内容如下:

from crontab import CronTab
# 创建linux系统当前用户的crontab,当然也可以创建其他用户的,但得有足够权限,如:user='root'
cron_manager = CronTab(user=True)


# 创建任务 指明运行python脚本的命令(crontab的默认执行路径为:当前用户的根路径, 因此需要指定绝对路径)
job = cron_manager.new(command='python /root/hong/crontab_test/data_test.py >> /root/hong/crontab_test/data_result.log 2>&1 &')

# 设置任务执行周期,每两分钟执行一次

job.setall('*/2 * * * *')

# 将crontab写入linux系统配置文件
my_user_cron.write()

运行py文件,完成! 此时定时任务已经创建(可在linux终端 输入 contrab -l 查看), crontab 会按照设定的时间 定时调用指定路径下的data_test.py文件。

作者:酷酷的图图
链接:https://www.jianshu.com/p/925de5998e1d

Python实现二分查找法

基本思想:对于一个有序数组,从数组中间元素开始与target元素进行比较,target较大则到中间元素的右半部分继续二分查找,target较小则到中间元素的左半部分继续二分查找,相等则查找到了target缘故。

注意:
(1)必须是有序数组
(2)target元素可能找不到

两种实现方法:注意索引边界的不同。

def binarySearch(list, target):
	left = 0
	right = len(list) - 1  
	#在list[left...right]里查找target,注意是左闭右闭
	while left <= right:
		mid = (right + left) // 2    #取中间元素索引
		if list[mid] == target:
			return mid
		elif target > list[mid]
			left = mid + 1     #到list[mid + 1 ...right]里查找
		else:  #target < list[mid]
			right = mid - 1    #到list[left ...mid - 1]里查找
	return -1    #未找到target元素
def binarySearch(list, target):
	left = 0
	right = len(list)
	#在list[left...right)里查找target,注意是左闭右开
	while left < right:
		mid = (right - left) // 2 + left    #防止上面的写法整型溢出
		if list[mid] == target:
			return mid
		elif target > list[mid]
			left = mid + 1     #到list[mid + 1 ...right)里查找
		else:  #target < list[mid]
			right = mid        #到list[left ...mid)里查找
	return -1     #未找到target元素

二分查找法的时间复杂度:O(logn)

3、循环不变量:在循环中不改变的量,即在循环开始和在循环迭代过程中永远保持不变的条件。

比如二分查找的第一个写法里循环开始和在循环迭代过程中要一直保持在list[left…right]左闭右闭的范围里查找target,这个条件就是一个循环不变量。

其他数据结构基本算法的Python实现版本可从github:全python实现的数据结构与算法中获取