Canonical Voices

liam zheng

为了庆祝Ubuntu Core 16正式发布,我们在IoT领域高手云集的深圳,专为欲大展拳脚的各路开发高手,创客团队举办了主题为“Jamming with Ubuntu Core”的黑客松活动。

为了庆祝Ubuntu Core 16正式发布,我们在IoT领域高手云集的深圳,专为欲大展拳脚的各路开发高手,创客团队举办了主题为“Jamming with Ubuntu Core”的黑客松活动。本次活动也是第一次以Ubuntu Core为开发主题的开发活动。活动吸引了来自不同行业的软硬件开发者踊跃参与,他们也通过Ubuntu Core展示了他们独特且创意的作品。

目前,Ubuntu Core 在柜顶交换机、工业网关、家庭网关、无线接入网络、数字标牌机器人和无人机等领域得到了广泛应用。部分活动开发者也来自于上述行业,在36小时的hack时间内,创意和作品将是他们对物联网的完美诠释。

与以往Hackathon活动相比,这次Ubuntu Hackathon多了一些不同,因为不同从而产生不同创意之作。本次活动迎来了远从台北而来的QNAP开发者,致力于在Ubuntu Core上打造IoT与NAS存储器的应用解决方案,同时也有上一届Hackathon的参赛者,更重要的是赢了很多新的开发者参与。他们的精彩项目也为本次黑客松活动添加了特别的气氛。

作品及项目:短短36小时,开发者们为Ubuntu Core带来了8个佳作。他们分别是:

 

天台聚落

团队:Jarvis Chung,Lucas Lu

项目介绍:(snap:water-iot-service)

天台聚落是指在IoT 物联⽹环境下监控⽔质,在不同环境下实现远程监控对水质的监控,解决了因为环境问题而不能时刻掌握水质的困境。该项目利用Ubuntu Core稳定且时刻保持最新的优势将传感器收集的信息传输到NAS再通过web服务显示在前端,实现了数据的采集和分析。

项目的愿景:为水资源的监测和管理提供更加便捷、直观、科学的思路,可用水库、蓄水池、水塔等无人照看且检修、监测困难水资源管理领域。

团队介绍:

威联通科技股份有限公司 (QNAP Systems, Inc.) ,公司专注于提供专业级的网络附加存储(NAS)和网络视频录像机(NVR)解决方案, 威联通的集成技术和设计带来优质的产品,其文件共享,虚拟化应用程序,存储管理和商业环境检测有效地提高企业运行效率。官网:(www.qnap.com/zh-cn)

 

Cooltools

团队:郝建林

项目介绍:(snap:sensor-gw)

用蓝牙连接TI Sensor Tag传感器套件,收集光照传感器数据,并通过本地WebServer实时显示在网页上。结合照明控制系统可以实现用Sensor Tag的物理按键开关灯,以及在环境亮度过小时自动开灯,整个系统都是通过高通 Dragonboard 410c与Ubuntu Core16 连接实现。在现实生活中,本项目可用于自动化环境光照控制,无需派人控制,也可避免因固定设置产生的能源浪费。

团队介绍:参赛团队来自深圳市酷图软件开发有限公司,公司专注于物联网应用开发,目前主要业务是为硬件产品开发APP。正在实践将物联网技术应用于实际生产生活,欢迎各界朋友交流合作。邮箱:cooltools@qq.com

 

Crazyou

团队:张研

项目介绍:(snap:crazy-app)

Crazyou来着深圳,是一家致力于打造智能机器人及开发板的初创团队,本次活动展示的项目则是可远程获取机器人运行状态,可远程开发调试,远程控制机器人或获取机器人摄像头捕捉的图像内容,绘制3D地图等。

团队介绍:趣之科技通过互联网构建实时远控能力,为Robotic类物联产品提供实时远控云应用服务与开放式核心硬件模块,致力用远程技术消除感知的空间距离。官网:www.crazyou.com

 

Simcaffe

团队:老梁

项目介绍:(snap:simcaffe)

simcaffe采用了高通DragonBoard 410c硬件计算能力,整合Ubuntu Cor以及Caffe深度识别平台,用斯坦福的开源深度学习算法, 用Python调用Caffe得到的识别结果实现图片分析和识别。未来可用在视频监控领域,并且该项目也是基于高通 Dragonboard 410c。Github:github.com/curiousguy98

团队介绍:

ABI Hackerspace管理员,目前为多家创业公司合伙人。从事研发工作近20年,在各类型公司实现过量产产品,辅助创业公司十多家。多次获得各类创意比赛大奖。小米硬件黑客马拉松第一名, Global Urban Datafest全球第三名, Moser穿戴式设备大赛一等奖。

 

PCBA

团队:臧鹏,Batur

项目介绍:(snap:sutop/movieword)

sutop是一款系统使用snap应用,基于node.js编写,可进行系统任务、资源、性能监控,并且以图形化的方式展示,界面简洁直观。PCBA团队另外一个项目则是movie word,可对字幕文件进行处理,去除数字、标点、去重,从而从电影字幕学习英语单词。

团队介绍:

臧鹏,热爱科技、电子产品,热爱开源,热爱ubuntu等一些有趣的事;目前致力于嵌入式软件;期望自由,做一些可以改变自己生活、改变自己世界的事,然后影响更多人。

Batur, 一个梦想成为大神的菜鸟。喜欢新奇的技术,最近正在学函数式编程。

 

我的衣柜

团队:黎健成

项目介绍:

使用树莓派上的Ubuntu Core进行衣服图片的自动分类,并存储起来,方便以后进行浏览和搭配。图片暂时使用上传的方式,之后有摄像头可通过摄像头获取。

关于开发者:黎健成,在读研究生,目前从事计算机视觉与深度学习的研究。除了对算法与数据结构等感兴趣外,对嵌入式、IoT等方面的开发也有所关注。喜欢参加各种各样的比赛,与各路大牛交流。个人博客(http://lijiancheng0614.github.io/)

团队介绍:

黎健成,在读研究生,目前从事计算机视觉与深度学习的研究。除了对算法与数据结构等感兴趣外,对嵌入式、IoT等方面的开发也有所关注。喜欢参加各种各样的比赛,与各路大牛交流。

 

Cellboot

团队:沈建丰

项目介绍:

使用Ubuntu Core进行物计算,将多台Ubuntu Core设备建立连接,可计算共享,每台设备都是计算集群的一部分。

团队介绍:

关于开发者:沈建丰是一名Ubuntu的用户,同时也是传媒公司的负责人,运营“华强北那些事儿”微信平台,主要擅长web应用开发。官网(http://www.editrobot.com)

 

在开发者们的精彩demo中,本次Ubuntu Core 16深圳黑客松活动圆满落下了帷幕,在2天的时间里开发者们用自己的code表达、诠释了心中的IoT是什么以及自己会如何去做。没有再见,只有再一次相见,期待与你相遇在下一站活动中。

 

Read more
facundo

Incubadora de eventos


Una de los roles claves de la Asociación Civil de Python Argentina (en adelante "AC") debería ser que la gente se junte y comparta conocimiento. En consonancia con esto, estuve armando la siguiente idea para ayudar a que se generen eventos y reuniones.

Hay distintas formas en la cual la AC puede ayudar a los organizadores de un evento, entre ellas:

  • Ayuda logística: transmitir experiencia, ayudar a resolver inconvenientes que se produzcan en la operatoria del día a día
  • Ayuda financiera: como es normal que algunos sponsors se comprometan a aportar dinero, pero luego ese aporte se demora (por el sponsor en sí, o trámites de todo tipo, especialmente internacionales), la AC puede adelantarle dinero al organizador, el cual ingresará a la AC luego cuando el sponsor efectivice.
  • Ayuda económica: Partiendo de la idea base de que el evento salga hecho, o incluso genere dinero para la AC, hay dos puntos en que se puede ayudar económicamente: siendo sponsors de un evento muy chico (ej: pagando unas pizzas para un sprint), pero me parece más importante poder ser una red de contención, en el caso de que por fallos en la planificación conjunta se pierde algo de dinero: que la pérdida la cubra la AC y no la persona que organizó.
  • Ayuda institucional: Por un lado es útil tener una entidad legal para poder presentarse a más sponsors, o al estado, dando más seriedad al evento, y además es imprescindible que los sponsorships o donaciones para el evento se hagan a una entidad ya formada, y no a individuos; esto le saca un quilombo personal al organizador, y permite pagos internacionales.

Para poder ejecutar estas ayudas, los organizadores del evento y la AC tienen que colaborar, seguir ciertos pasos y reglas. ¿Quizás incluso firmar algún contrato?

Describo la metodología a grandes rasgos en los siguientes puntos. Pero esto hay que pensarlo, refinarlo, y escribirlo bien en detalle, para lograr dos cosas:

  • que el organizador u organizadores entienda bien como la AC va a jugar en esto
  • que la AC corra la menor cantidad de riesgos innecesarios posibles

Entonces, la idea es tener un presupuesto base, un template de lo que sería el presupuesto final del evento, con todo lo que podamos pensar y se nos pueda ocurrir de eventos anteriores. Se recorre el mismo con el organizador, en una primera instancia, y se elije lo que el organizador "quiere hacer"; luego el organizador mismo tiene que poner un estimado de costo a cada ítem, y separar los ítems en tres secciones (o quizás sólo dos para eventos chicos):

  • de mínima: sin esto el evento no sale
  • intermedio: con esto el evento está lindo
  • de máxima: si se logra esto es un golazo

En función de todo lo elegido, hay que planificar los sponsorships necesarios, en base a niveles: definirlos, incluyendo el costo y las retribuciones. Es imprescindible que la AC de "el visto bueno" sobre esta planificación, y que luego realice un "seguimiento en el tiempo" de la evolución de la ejecución del presupuesto. Acá la AC también puede jugar un rol centralizador, básicamente armando un folleto de "hay un nuevo evento, ¿querés ser sponsor?" y mandándolo a todos las empresas, instituciones, o lo que sea que tengamos en carpeta.

También en esta interacción AC/organizador se pueden pedir más cosas, o hacerlas obligatorias, ejemplo (¡hay que pensar más!):

  • que el evento tenga un código de conducta; incluso la AC puede proveerlo, junto con un pequeño texto de "qué hacer si se recibe una denuncia"
  • que el sitio web del evento sea "exportable a estático", así la AC lo guarda y sirve a futuro; también la AC podría dar un sitio web base, y hostearlo.

Por último, un detalle: estaría bueno que la AC también cumpla el rol de "paraguas legal" (básicamente, lo que arriba describo como "ayuda institucional") para ayudar a otros grupos relacionados con el software y/o cultura libre, para que puedan ellos hacer sus eventos.

Read more
Michael Hall

Below is a guest post written by Ryan Sipes, Community Manager at System76


Last week System76 engineers participated in a call with Martin Wimpress of the Ubuntu Desktop team to discuss HiDPI support in Ubuntu, specifically Unity 7. HiDPI support exists in Unity 7, but there are areas that could use improvement, and the call focused around those. The conversation was primarily focused around bugs that still remain in the out-of-the-box HiDPI experience; specifically around enabling automatic scaling and Ubuntu recognizing when a HiDPI display is present so that it can adjust accordingly.

This has become a focus of System76 as it has worked to provide a good experience for users purchasing their new 4K HiDPI displays now available on the Oryx Pro and BonoboWS laptops.

“With our HiDPI laptops, everything is twice as crisp; it's like a high-quality printed magazine instead of a traditional computer display. The user interface is clearer, text is sharper, photos are more detailed, games are higher res, and videos can be viewed in full lifelike 4K. This is great whether you're anyone from a casual computer user to a video editor producing high end content or a professional developer who wants a better display for your code editor.”, says Cassidy James Blaede, a developer at System76 and a co-founder of elementary OS, an Ubuntu-based distribution that has put a lot of work into HiDPI support. Cassidy recently wrote a blog post explaining HiDPI, diving into the specifics of how it works.

Some patches that improve HiDPI support are in review and they are expected to land in Ubuntu soon. In order to accelerate this process HiDPI bugs in Launchpad are being tagged accordingly and will make it easier for contributors to focus their efforts more easily. System76 will be contributing heavily to this process, but many other Ubuntu community members have expressed interest in contributing as well, so this will likely be a hot spot in the near future.

Read more
Alan Griffiths

Mircade

Mircade

I’ve been playing with the “kiosk” concept implemented by miral-kiosk. Kevin Gunn and Alberto Aguirre have been using it to demonstrate Mir snaps (kg’s blog) so I decided to join the fun.

Mircade is a very basic kiosk-launcher for whatever games are installed on a system. It tries to work out whether the game will run natively on Mir and, if not, will try running them on Xmir (if installed).

To play, you need the latest miral-examples and libmiral-dev installed. You can “apt install miral-examples” from Zesty archive/Xenial “stable phone overlay” PPA, or build it from source on Xenial or later.

$ sudo apt install miral-examples libmiral-dev mir-graphics-drivers-desktop xmir

Once you have that sorted, Mircade is available from github. It has a few dependencies (I’ve tried to list them, but have probably missed one).

$ git clone https://github.com/AlanGriffiths/mircade.git
$ sudo apt install libfreetype6-dev libboost-filesystem-dev libboost-system-dev cmake
$ cd mircade/
$ cmake .
$ make
$ miral-desktop -kiosk -launcher ./mircade

Navigation is by arrow keys (left/right) and selection by Space or Enter. When your game exits you return to the mircade launcher.

Not all games work perfectly on Mir (yet):

  • Most of the GTK based games (like gnome-chess) run, but sometimes fail to “fullscreen”;
  • SDL2 based games (like 7kaa) have a tendency to segfault on exit; and,
  • X11 based games using Xmir may or may not work.

Have fun!

Read more
facundo

PyCon Argentina 2016


El fin de semana pasado fue la octava edición de la conferencia nacional de Python en Argentina. Se realizó en Bahía Blanca, tres días de talleres y charlas.

Yo dí una charla, "Bindings, mutable default arguments, y otros quilom... detalles", y asistí a otras; las que más me gustaron fueron "Poniéndonos un poco más serios con Kivy" por Sofía Martin y alguien más que no recuerdo, "Compartiendo memoria eficientemente con proxies" por Claudio Freire, "Argentina en Python: comunidad, sueños, viajes y aprendizaje" por Humitos, "MicroPython en EDU-CIAA" por Martín Ribelotta, "Redes neuronales con Python utilizando Keras" por Fisa, "Deep learning: aprendiendo con la escafandra" por Javi Mansilla, e "Introducción a programación paralela con PyOpenCL" por Celia Cintas.

Mi charla, renovada

Las keynotes estuvieron muy bien, también. Fernando Schapachnik, de la Fundación Sadosky nos habló del problema de género en las comunidades informáticas (con datos, análisis, y una arenga política al final que estuvo bárbara). Ángel Medinilla nos dío una charla-show-standup sobre metodologías ágiles (excelente presentación). Y la última fue de Victoria Martínez de la Cruz, contando las ventajas y desventajas de trabajar de forma remota (algo que se está imponiendo más y más en las comunidades de software y que está lleno de mitos, así que era muy necesaria).

La organización del evento también estuvo impecable. Se nota que laburaron un montón y salió todo muy bien.

Los asistentes a punto de escuchar una plenaria

Más allá del costado técnico, y de lo que sucede en estos eventos de charlas que se generan, reencuentros, etc, tanto en pasillos como luego de la conferencia en bares o por ahí, quiero destacar el lado "humano"que tuvo esta conferencia.

No sólo las keynotes hablaron de las personas o sus grupos de trabajo, sino que también tuvimos charlas que hicieron lagrimear a varios, como la de Humitos que mencioné arriba o la de Roberto Alsina ("Cómo desarrollar software libre (o no) y no morir en el intento (o no)", que no pude ver pero me contaron). Pero había algo más en el ambiente. Gente comentando lo copada que son organizadores y asistentes en este evento, que cómo te ayudan con todo, que se preocupan, etc. Había muy buena onda por todos lados.

Relajando un poco, en el almuerzo del primer día

Trabajando en uno de los espacios abiertos que había

Hubo una anécdota interesante, también. Resulta que una señora vio en un kiosco a unos asistentes a la conferencia que tenían algo de Python encima. Entonces fue a la escuela de su hijo mayor, de 13 años, lo sacó antes de hora y volvieron a la zona del kiosco (que obviamente, era muy cerca del edificio de la conferencia). Justo pasábamos otros chicos y yo, vieron un pin de Python que llevo en la mochila, y nos preguntaron qué onda. Les contamos de la conferencia, Diego M. les regaló el librito del evento, y listo.

Nosotros pensábamos que terminaba ahí. Nada más lejos.

Al rato volvemos al edificio donde se desarrollaba el evento y vemos que sube a la zona de la conferencia la madre y los dos niños. El pibe de 13 se colgó todo el día yendo de charla en charla, mientras la mamá le hacía el aguante en una zona con sillones. No sólo eso, sino que fueron el sábado y el domingo a la conferencia, y se pasaron todo el finde allí. Notable.

Todas las manos todas

Para cerrar les dejo las fotos que saqué, más esta búsqueda de tuiter que está buena.

Read more
Alan Griffiths

MirAL 0.5

There’s a new MirAL release (0.5.0) available in ‘Zesty Zapus’ (Ubuntu 17.04) and the so-called “stable phone overlay” ppa for ‘Xenial Xerus’. MirAL is a project aimed at simplifying the development of Mir servers and particularly providing a stable ABI and sensible default behaviors.

Unsurprisingly, given the project’s original goal, the ABI is unchanged. The changes in 0.5.0 fall are:

  1. Some utility scripts to for common tasks;
  2. Improved “–window-manager tiling” mode of miral-shell;
  3. More configuration options for miral-kiosk;
  4. miral::DebugExtension; and,
  5. Some minor bug fixes.

Some utility scripts to for common tasks

There are two of these: miral-desktop and miral-screencast.

miral-desktop creates a pseudo-desktop session:

miral-desktop - Handy launch script for a miral "desktop session"
Usage: miral-desktop [options] [shell options]
Options are:
    -kiosk               use miral-kiosk instead of miral-shell
    -launcher <launcher> use <launcher> instead of 'gnome-terminal --app-id com.canonical.miral.Terminal'
    -vt       <termid>   set the virtual terminal [4]
    -socket   <socket>   set the mir socket [/run/user/1000/mir_socket]
    -bindir   <bindir>   path to the miral executable

For example, I use this to test the “tiling” window management with a UK keyboard layout:

$ miral-desktop -launcher qterminal --window-manager tiling --keymap gb

miral-screencast captures the Mir display (until you press enter) and then encodes it as an mp4:

miral-screencast - screencast capture script for use with Mir servers
Usage: /usr/bin/miral-screencast [options]
Options are:
    --width   set the capture width   [1920]
    --height  set the capture height  [1080]
    --output  set the output filename [screencast.mp4]
    --socket  set the mir socket      [/run/user/1000/mir_socket]

Improved “–window-manager tiling” mode of miral-shell

This has been updated to keep the focused window on the left half of the display (unless there’s only one window) and divide the right side vertically between the remaining windows. There’s also been a general refresh of the code that fixed a lot of minor issues.

More configuration options for miral-kiosk

The miral-kiosk now supports a few more options:

  • –keymap allows for non-US keyboard layout;
  • –kiosk-maximize-root-window kiosk has a new default behavior of maximizing root window, but this can be changed;
  • –kiosk-startup-apps-only prevents new connections after startup

miral::DebugExtension

This allows shells to enable (or disable) the client API “debug” extensions dynamically (AFAICS only useful for automated testing).

Some minor bug fixes

There was a race condition handling fullscreen surfaces when reconfiguring the display for hardware changes, the gmock version in zesty caused a FTBFS, and the clang version in zesty picked up some template instantiation issues.

Read more
UbuntuTouch


雷锋网(公众号:雷锋网)消息,Canonical 今日发布了  Ubuntu Core16,除安全方面的更新外,还公布了智能物联网设备应用商店。

Ubuntu Core 在工业网关、家庭网关,机器人无人机等领域得到了广泛应用。

Canonical 兼 Ubuntu 创始人 Mark Shuttleworth 在电话会议中表示,Ubuntu Core 可以为物联网提供安全保护,并为所有设备提供应用商店。

戴尔物联网战略及合作总监 Jason Shepherd 也参与了本次发布会,他表示,很多公司开始对物联网产生兴趣,因此,一个安全、快速和易于更新的系统就显得愈发重要。戴尔已经与 Ubuntu 有一年多的合作,目前其 Edge 网关已经全面支持 Ubuntu Core 16,这让戴尔能长期提供工业和建筑自动化急需的安全服务。

新的 Ubuntu Core 系统在安全、管理、操作和升级上都有很大提升,其体积小及开发者友好的特性则得益于 Snap 应用包。该应用架构对于软件发行商和设备制造商的最大益处在于,一旦更新失败,原有的系统会自动还原。

Ubuntu Core 的操作系统和 Kernel 内核同样采用的是 Snap 应用架构,此外所有 Ubuntu Core 设备都可以获得定期免费的系统安全更新。

通用或设备专用的 snap 应用商还能让开发者在任何开发阶段,直接销售物联网软件,与云、企业和移动软件的销售过程没有两样。白标应用商能让设备制造商构建品牌化、差异化的设备和软件体验。

在电话会议中,Mark 还提到了与 AT&T 等公司的合作,他们认为这种合作可以继续延伸,从而提高自己系统的普及。

对于中国市场,他认为 Ubuntu 在国内开发者中有很多受众,而开发者在使用该系统的过程中,势必会加快各类设备的物联网进程。与此同时,Mark 也对中国市场给予了充分的肯定与期待:“中国如果不能引领 IoT 大潮,于我而言是不可想象的。”

基于此次发布会,雷锋网整理了部分行业人士的观点,援引如下:

IBM 新兴技术与高级创新部门副总裁兼 CTO Mac Devine:“认知时代会诞生更多的智能设备,这需要从根本上改变处理大量数据的方法。Snap让开发者能够易于在多个IoT设备上移植和升级的格式构建和部署应用程序,从而可以建立云与网络边缘之间的认知关系。”

开源机器人基金会(OSRF)首席执行官Brian Gerkey:“远程管理和升级机器人软件是目前面临的一个亟需解决的问题,而Ubuntu的Snap能够帮助开发者及组织机器人,让软件管理的过程变得更加安全和简单。”

英特尔制造商与创新集团总经理James Jackson:“从健康管理到太空探索,机器人技术几乎能对每一个行业产生深远影响。而这就需要像 Ubuntu 一样安全可靠的平台。”

原文择自:http://m.leiphone.com/news/201611/IM3a6rsxpAjuBEzJ.html

更多阅读:The #1 Linux distro is more popular than ever — and on an even wider range of applications than you might imagine

作者:UbuntuTouch 发表于2016/11/4 7:47:18 原文链接
阅读:358 评论:0 查看评论

Read more
UbuntuTouch

在一个Ubuntu Core的系统中,我们可以利用snapweb来进行安装,删除或查看我们已经安装过的应用.那么我们该如何操作呢?



1)首先我们找到我们设备的IP地址


对于还没有安装好Ubuntu Core的板子来说,我们可以参考文章"如何为树莓派安装Ubuntu Core并在Snap系统中进行交叉汇编"来安装我们的系统.同样的方法也使用于对高通的snapdragon及其它的板子.我们必须按照该文章中介绍的方法检查snapweb是否正在运行(尽管一般情况下是这样的).

a) 我们可以在Ubuntu Core系统中,打入如下的命令:

liu-xiao-guo@localhost:~$ ifconfig
enxb827ebcd46fa Link encap:Ethernet  HWaddr b8:27:eb:cd:46:fa  
          inet addr:192.168.1.105  Bcast:192.168.1.255  Mask:255.255.255.0
          inet6 addr: fe80::ba27:ebff:fecd:46fa/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:1533 errors:0 dropped:0 overruns:0 frame:0
          TX packets:724 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:204190 (204.1 KB)  TX bytes:452766 (452.7 KB)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:327 errors:0 dropped:0 overruns:0 frame:0
          TX packets:327 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1 
          RX bytes:26013 (26.0 KB)  TX bytes:26013 (26.0 KB)

wlan0     Link encap:Ethernet  HWaddr b8:27:eb:98:13:af  
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:53 errors:0 dropped:19 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:23502 (23.5 KB)  TX bytes:0 (0.0 B)

通过这样的方法,我们可以找到我们的运行Ubuntu Core系统的IP地址.当然这个方法适合我们已经登陆系统的设备.对于还没有登陆过系统的设备来说,我们可以通过如下的方法来找到我们设备的IP地址.

b) 通过路由器的设置来找到板子的IP地址


我们也可以参照我之前的文章"如何在装上Snappy Ubuntu的树莓派上启动WiFi"来通过网关的方法来找到我们板子的IP地址.


c) 使用nmap命令来找到我们的设备的IP地址


如果我们的desktop电脑和我们的Ubuntu Core设备同处于一个局域网中,我们也可以通过如下的方法来找到我们板子的IP地址.我们在我们的桌面电脑的terminal中打入如下的命令:

liuxg@liuxg:~$ nmap -sn 192.168.1.1/24

Starting Nmap 7.01 ( https://nmap.org ) at 2016-10-31 10:27 CST
Nmap scan report for 192.168.1.1
Host is up (0.0021s latency).
Nmap scan report for 192.168.1.100
Host is up (0.0032s latency).
Nmap scan report for 192.168.1.101
Host is up (0.015s latency).
Nmap scan report for 192.168.1.103
Host is up (0.00011s latency).
Nmap scan report for 192.168.1.104
Host is up (0.032s latency).
Nmap scan report for 192.168.1.105
Host is up (0.0069s latency).
Nmap done: 256 IP addresses (6 hosts up) scanned in 2.72 seconds

注意这里的"192.168.1.1"是我们路由器的地址.它显示了所有目前正在运行的连接到该网关的设备地址.我们的Ubuntu Core的IP地址肯定是其中的一个.我们可以通过如下的命令:

$ ssh liu-xiao-guo@192.168.1.100

来逐一试上面的每个地址.如果成功的话,我们会进入到ubuntu core的登陆环境.这里注意的是"liu-xiao-guo"是我在launchpad上的用户名.开发者必须根据自己的账号进行修改.


d) 通过snapweb.local来查看我们的Ubuntu Core设备地址


只要我们的设备和我们的桌面电脑处于一个局域网中,我们可以通过如下的方法来得到Ubuntu Core设备的地址.在我们的桌面电脑中,打入如下的命令:

$ ping snapweb.local

liuxg@liuxg:~$ ping snapweb.local
PING snapweb.local (192.168.1.105) 56(84) bytes of data.
64 bytes from 192.168.1.105: icmp_seq=1 ttl=64 time=2.46 ms
64 bytes from 192.168.1.105: icmp_seq=2 ttl=64 time=1.19 ms
64 bytes from 192.168.1.105: icmp_seq=3 ttl=64 time=1.71 ms
64 bytes from 192.168.1.105: icmp_seq=4 ttl=64 time=1.97 ms

它将自动显示我们的Ubuntu Core设备的IP 地址.

一旦得到我们的Ubuntu Core设备的IP地址,我们可以通过在桌面的terminal来进行登陆:



我们可以安装文章" 如何为树莓派安装Ubuntu Core并在Snap系统中进行编译"中介绍的方法来确保snapweb运行正常.


2)在桌面电脑浏览器中查看我们已经安装的应用


我们可以在我们的桌面电脑中的浏览器中的地址中键入:

ip_address_of_ubuntu_core_device:4200

虽然下面的图片章展示的是4201口地址.当我们键入上述的地址后:




它要求我们在我们的Ubuntu Core设备上键入命令:



我们可以拷贝上面生产的token,并输入到上面的浏览器中的输入框中.这样我们就可以看见:



在这个页面中,我们可以看到已经安装的所有的snap应用.这和我们在Ubuntu Core系统中的如下的命令类似:

liu-xiao-guo@localhost:~$ snap list
Name         Version       Rev  Developer  Notes
bluez        5.37-1        7    canonical  -
classic      16.04         14   canonical  devmode
lights-app   0.1           x1              devmode
livevideo    0.1           x1              devmode
pi2-kernel   4.4.0-1030-3  22   canonical  -
pi3          16.04-0.5     6    canonical  -
piglow-app   1.0           x2              devmode
sensortag    1.0           x3              devmode
snapweb      0.21.2        25   canonical  -
ubuntu-core  16.04.1       760  canonical  -

有了这个snapweb界面,我们可以对我们的应用进行管理,比如删除.当然我们也可以对我们的系统进行安装其它的已经在商店中的应用,就像我们文章开始介绍的画面一下.

对于Ubuntu 16.04的桌面snap开发者来说,你们也可以安装snapweb(如果还没有安装的话)来管理自己在桌面环境中的所有snap应用.

细心的读者可能已经看到,我们的许多的应用没有自己的icon.我们只能看到一个默认的Ubuntu的icon.在我们的实际设计中,我们可以在我们项目的根目录下创建一个如下的目录及文件:

setup/gui/icon.png

这样整个项目的文件如:

liuxg@liuxg:~/snappy/desktop/livevideo_snap$ tree -L 3
.
├── setup
│   └── gui
│       └── icon.png
└── snapcraft.yaml


当我们build完我们的应用并安装后,我们可以在我们的Ubuntu Store里看见这个应用的icon:




作者:UbuntuTouch 发表于2016/10/31 10:50:07 原文链接
阅读:304 评论:0 查看评论

Read more
UbuntuTouch

在今天的文章中,我们来介绍如何snap Shadowsocks应用,并发布到Ubuntu商店.


1)创建snapcraft.yaml文件


我们可以在github的地址https://github.com/shadowsocks/shadowsocks-qt5找到这个项目的源码.这是一个Qt的项目.为此,我们创建了一个如下的snapcraft.yaml文件:

snapcraft.yaml

name: ss-qt # you probably want to 'snapcraft register <name>'
version: '0.1' # just for humans, typically '1.2+git' or '1.3.2'
summary: Shadowsocks
description: |
  This is shadowsocks snap app

grade: stable # must be 'stable' to release into candidate/stable channels
confinement: strict # use 'strict' once you have the right plugs and slots

apps:
  ss-qt:
    command: desktop-launch $SNAP/usr/bin/ss-qt5
    plugs: [home,opengl,network,unity7,browser-support,network-bind]

parts:
  ss:
    plugin: qmake
    source: https://github.com/shadowsocks/shadowsocks-qt5
    source-type: git
    qt-version: qt5
    stage-packages:
      - libzbar-dev
      - libappindicator-dev
      - libbotan1.10-dev
      - libqrencode-dev
      - libqtshadowsocks-dev
      - libqtshadowsocks
    after: [desktop/qt5]  

在我们创建这个snapcraft.yaml的文件时,我们可以使用:

$ snapcraft init

命令来创建这个template. 关于这个项目所需要的stage-packages,我们可以参照项目所在的debian包的依赖:

Source: shadowsocks-qt5
Section: net
Priority: extra
Maintainer: Symeon Huang <hzwhuang@gmail.com>
Build-Depends: debhelper (>= 9),
               pkg-config,
               qt5-qmake,
               qtbase5-dev,
               libqrencode-dev,
               libqtshadowsocks-dev (>= 1.9.0),
               libzbar-dev,
               libappindicator-dev,
               libbotan1.10-dev
Standards-Version: 3.9.6
Homepage: https://github.com/librehat/shadowsocks-qt5
Vcs-Git: https://github.com/librehat/shadowsocks-qt5.git
Vcs-Browser: https://github.com/librehat/shadowsocks-qt5

Package: shadowsocks-qt5
Architecture: any
Depends: ${shlibs:Depends},
         libqtshadowsocks (>= 1.9.0)
Description: A cross-platform shadowsocks GUI client
 Shadowsocks-Qt5 is a native and cross-platform shadowsocks GUI client
 with advanced features.

在这个项目中,我们也使用了一个叫做"desktop/qt5"的remote part.这个remote part是由别人已经做好的.我们直接来使用.这是因为这个项目是一个Qt项目,所以我们需要desktop-launch来启动该应用.关于所有的remote part我们可以参阅连接remote part.当然,我们也可以直接通过如下的命令来查看:

$ snapcraft update
$ snapcraft search

liuxg@liuxg:~/snappy/desktop/ss$ snapcraft search
PART NAME                          DESCRIPTION
checkbox                           Part that supplies the latest stable version of the Checkbox t...
checkbox-dev                       Part that supplies the latest stable version of the Checkbox t...
checkbox-ng-dev                    Part that supplies the latest stable version of the Checkbox t...
checkbox-support-dev               Part that supplies the latest stable version of the Checkbox t...
curl                               A tool and a library (usable from many languages) for client s...
desktop-glib-only                  Helpers for glib minimal launchers.
desktop-gtk2                       Helpers for gtk2 minimal launchers.
desktop-gtk3                       Helpers for gtk3 minimal launchers.
desktop-qt4                        Helpers for qt4 minimal launchers.
desktop-qt5                        Helpers for qt5 minimal launchers.
desktop/glib-only                  Helpers for gtk2, gtk3, qt4 and qt5 or glib minimal launchers.
desktop/gtk2                       Helpers for gtk2, gtk3, qt4 and qt5 or glib minimal launchers.
desktop/gtk3                       Helpers for gtk2, gtk3, qt4 and qt5 or glib minimal launchers.
desktop/qt4                        Helpers for gtk2, gtk3, qt4 and qt5 or glib minimal launchers.
desktop/qt5                        Helpers for gtk2, gtk3, qt4 and qt5 or glib minimal launchers.
dnsmasq                            Network infrastructure swiss-army knife
ffmpeg                             This sets up ffmpeg for projects.
gtkconf                            This sets up the GTK environment for GTK-based projects
modemmanager                       Part providing access to the ModemManager client utilities nam...
mongodb                            A document-oriented database
mqtt-paho-python2                  mqtt-paho for python.
mqtt-paho-python3                  mqtt-paho for python.
mqtt-paho/python2                  mqtt-paho for python.
mqtt-paho/python3                  mqtt-paho for python.
networkmanager                     Part providing access to the NetworkManager client utilities n...
openssh                            OpenSSH is the premier connectivity tool for remote login with...
plainbox-dev                       Part that supplies the latest stable version of the Checkbox t...
plainbox-provider-docker           Tests to certify the correct functioning of Docker containers ...
plainbox-provider-ipdt             Tests to certify the correct functioning of devices running re...
plainbox-provider-snappy           Tests to certify the correct functioning of devices running re...
plainbox-provider-snappy-resource  Resource jobs are that are used to gather information about a ...
plainbox-provider-tpm2             Tests to certify the correct functioning of TPM2 devices
qt4conf                            This sets up qt4.conf for projects using qml and other qt4 com...
qt57                               Qt 5.7 part. Lets you use newer Qt than what is available in U...
qt5conf                            This sets up qt5.conf for projects using qml and other qt5 com...
simple-make-filesets               The filesets test from the integration test suite.
tpm-tools                          Part containing utilities to interact with a TPM chip being pa...
tpm2-tss                           Implementation of the TPM 2.0 Software Stack (TSS). See https:...
wafdemo                            Waf c Demo

由于我们需要"desktop/qt5",然后才能编译我们的"ss"part,所有我们使用了关键词after.关于snapcraft的更多syntax的介绍,我们可以参阅文章.最终,我们的源码可以在如下的地址找到:


我们在我们的snapcraft.yaml文件所在的目录中,打入如下的命令:

$ snapcraft

如果顺利的话,我们就可以在我们的当前的目录中找到最终生产的.snap包文件:

liuxg@liuxg:~/snappy/desktop/ss$ tree -L 1
.
├── parts
├── prime
├── setup
├── snapcraft.yaml
├── ss-qt_0.1_amd64.snap
└── stage

这里的parts,stage及prime都是在编译过程中所生产的中间文件目录.其中prime目录中的所有文件就是我们最终安装到电脑系统中所有的文件:

liuxg@liuxg:~/snappy/desktop/ss/prime$ tree -L 2
.
├── bin
│   └── desktop-launch
├── command-ss-qt.wrapper
├── etc
│   ├── drirc
│   ├── fonts
│   ├── gss
│   ├── gtk-2.0
│   ├── gtk-3.0
│   ├── init.d
│   ├── profile.d
│   ├── ucf.conf
│   ├── X11
│   └── xdg
├── flavor-select
├── lib
│   └── x86_64-linux-gnu
├── meta
│   ├── gui
│   └── snap.yaml
├── usr
│   ├── bin
│   ├── include
│   ├── lib
│   ├── sbin
│   └── share
└── var
    └── lib

从上面可以看出来,在prime目录中,它包含了一个snap运行所需要的所有的文件(包括运行库).一个snap包被称作为self-contained,也即它不依赖于OS所提供的任何库.如果需要OS的资源的话,它必须是通过interfaces来完成的.

为了能够使得我们的应用在dash中可以被启动,我们在我们的根目录下创建一个setup/gui的目录,并把我们所需要的图标放入到该目录中.这样在最终的snap包中,就含有desktop所需要的信息.这个信息可以在上面所示的meta/gui中找到.

我们的.snap文件在本地,所以我们可以通过如下的命令:

$ sudo snap install *.snap --dangerous

如果我们的应用是从商店里下载并安装的的话,我们不必要使用--dangerous这个选项.来完成我们的安装.等安装完后,我们可以在我们的Desktop的dash中看到:



点击上面的图标,我们就可以启动我们的Shadowsocks应用了.这个snap应用可以使用所有支持snapd的Linux的发行版.用户一旦安装,不需要再安装任何其它的依赖库.




在本应用中,我们有意识地把我们的snap包的名称和应用的名称都叫做为"ss-qt".这样,我们可以直接在我们的terminal中打入如下的命令来启动我们的应用:

$ ss-qt

这是一种快捷的启动应用的方法.如果我们的包的名称和我们的应用名称不同的话,我们需要使用<package_name>.<app_name>的方法来启动我们的应用.


2)发布我们的应用



在这一节中,我们来介绍如何发布一个应用到我们的应用商店.

为了能够在Ubuntu商店中发布我们的应用,我们必须在地址 myapps.developer.ubuntu.com注册我们的账号.在创建的过程中,我们必须选一个我们自己独有的"developer namespace".这个namespace将成为我们发布应用名称的一部分.比如针对我的情况,我的namespace是"xiaoguo".

首先在我们的项目的根目录中(.snap文件所在的目录),打入如下的命令:



我们通过snapcraft login命令来登陆我们的商店.我们使用如下的snap register命令来为我们的应用注册一个名字:




在这里,我们选择"ss-qt"来作为我们的应用名称.对于有些开发者,我们也可以使用链接来注册一个应用名称.如果我们注册的名字已经被注册或是reserved(预留)的,那么我们可以选择其它的名字来注册.如果先前你自己已经注册一个该应用的名称,并且这个名称没有被其它的应用,那么我们可以跳过这个snapcraft register步骤,直接进入到snapcraft push.





当然,我们也可以把push和release用一个命令来完成:

$ snapcraft push *.snap --release=stable
$ snapcraft push *.snap --release=stable,edge

这里,我们来介绍一下我们到底应该把我们的应用发布到哪个channel.到目前为止,有四个channel可以供我们发布:
  • stable is what most users will consume and as the name suggests, should be your most polished, stable and tested versions. Snaps in this channel appear in user searches.
  • candidate is used to vet releases that should require no further code changes before moving to stable.
  • beta is used to provide preview releases of semi-stable changes. Snaps requiring the devmode flag to work are allowed in this channel.
  • edge is for your most recent changes, probably untested and with no guarantees attached. Snaps requiring the devmode flag to work are allowed in this channel.
我们的同一个应用可以发布到上面的多个channel中.

在发布一个应用之前,我们还得仔细再看一下我们的snapcraft.yaml文件.grade及confinement两个设置将直接影响到我们可以把我们的应用放到哪个channel之中.


更多关于channel的介绍,可以阅读文章.另外值得指出的是,如果我们在snapcraft.yaml中定义confinement: devmode,那么我们在安装时一定要加上--devmode的选项.针对我们的情况(如果我们在snapcraft.yam中定义confinement: devmode):

$ sudo snap install ss-qt --devmode

我们使用snapcraft push命令来把我们的应用上传到商店.最后,我们使用snapcraft release命令来发布我们的应用.
等我们发布完我们的应用后,我们可以通过如下的命令来进行安装我们的应用.

$ sudo snap find ss-qt
$ sudo snap install ss-qt

这里特别注意的一点是:snap find只供查询在stable channel里发布的应用.如果你的应用发布在beta或edge channel里,那么你的应用将注定无法通过snap find找到.这里面的原因是我们想推最好的高质量的应用给最终的用户.注意在上面的安装命令中,我们已经去掉了先前的--dangerous选项,这是因为我们的应用是从商店里下载进行安装的而不是从本地进行安装的.





从上面可以看出来,我的namespace "xiaoguo"在上面作为Developer列出来了.至此,我们的应用已经发布到我们的商店了.可以供其它的使用者进行使用了.从商店上面安装的应用的Rev通常是一个数字,相反,在本地安装的snap应用的Rev是x1/x2之类的版本号.

发布过的应用,我们也可以通过https://uappexplorer.com/apps来查看:



如果我们想关闭我们已经发布的一个应用,我们可以通过如下的方法来做:

$ snapcraft close ss-qt stable

这样我们已经发布过的应用ss-qt将不再在stable channel上提供给用户下载使用.

当然对于喜欢使用图形界面的开发者来说,我们也可以在链接上传并发布我们的应用.



这个应用可以在其它许多的Linux发行版中安装并运行.我们可以参照链接来安装到其它的Linux发行版中.

更多关于snap应用开发的知识,可以参阅网站snapcraft.io.如果你有更多的问题,请参加我们的community以得到更多的支持.

作者:UbuntuTouch 发表于2016/11/2 14:48:57 原文链接
阅读:1928 评论:0 查看评论

Read more
UbuntuTouch

[原]安装Ubuntu Core系统

今天很高兴看到Ubuntu Core 16终于发布了.Ubuntu Core 16系统是一个完全基于snap的系统.它包括foundation, applications,kernel,core操作系统及gadget等.所有的这些都被一个叫做为snapd的后台运行的工具进行安装及更新.最新的Ubuntu Core Image可以在如下的地址:

http://releases.ubuntu.com/ubuntu-core/16/

你也可以发现最新的beaglebone image在:

http://people.canonical.com/~ogra/snappy/all-snaps/stable/current/

他目前包括PC (amd64,i386)的发行版,同时它也对raspberry Pi2/3及QualComm的dragonboard 410c进行了支持.镜像一旦被解压缩,它就是可以直接启动的.PC版本可以直接运行于qemu-kvm,virtualbox或真正的x86机器上(比如Intel的NUC).


创建Ubuntu One账号


在做任何的安装之前,我们必须创建一个Ubuntu One账号.具体的步骤可以参考文章"创建Ubuntu Core账号并为Ubuntu Core设备添加新的账号".这个账号将被用于下面的设置console-conf之中.在创建账号的同时,我们必须记得把自己电脑上的ssh所生产的key考入到launchpad的账号之中.


在Ubuntu Desktop上进行测试Ubuntu Core


为了能够方便在PC上进行测试,我们可以在我们的Ubuntu Desktop系统上进行如下的操作:

1)安装qemu-kvm


$ sudo apt-get install qemu-kvm  
...say yes and install the packages...  

我们来检查一下我们的PC是否支持硬件虚拟化:

$ kvm-ok  
INFO: /dev/kvm exists  
KVM acceleration can be used  

如果你看见上面的结果,那么我恭喜你啦!这是最好的结局 - 这意味着Snappy将在你的系统运行速度快,并充分利用硬件加速。如果你没有看到上面的结果,你可以尝试在你的电脑的BIOS中去启动硬件虚拟化功能.如果KVM不支持您的系统上,我们建议您尝试Ubuntu的系统在云上运行

2)下载Ubutu Core Image


我们通过下面的命令来下载我们所需要的镜像(这里以64bit为例)

$ wget http://releases.ubuntu.com/ubuntu-core/16/ubuntu-core-16-amd64.img.xz

等下载完后,我们使用如下的命令来进行解压缩:

$ unxz ubuntu-core-16-amd64.img.xz 

3)启动KVM


现在,您可以在image所在的目录中从terminal中启动虚拟机KVM:

$ kvm -smp 2 -m 1500 -redir tcp:10022::22 ubuntu-core-16-amd64.img

在这里虚拟机的口地址我们已经做了重定向:

-10022 本地端口将指向虚拟机中的22口 (ssh)

在启动的过程中,console-conf所展示出来的信息"ssh USER@10.0.2.15"有点让人误解.事实上,我们可以运用如下的命令来登陆我们的kvm:



$ ssh -p 10022 USER@localhost

特别值得注意的是:我们必须把上面的USER换成我们自己的Ubuntu One上面的用户名.针对我的情况:

$ ssh -p 10022 liu-xiao-guo@localhost 



如果你在你的Desktop的目录~/.ssh/config中添加如下的内容,而且它的内容是:

Host kvm.snappy
     Hostname localhost
     Port 10022
     User USER
     UserKnownHostsFile /dev/null
     StrictHostKeyChecking no

同样,我们需要把上面的USER换成自己的Ubuntu One用户名.那么你就直接使用如下的命令来启动:

$ ssh kvm.snappy

一旦进入到Ubuntu Core系统中,我们可以参阅文章"Ubuntu Core介绍及其使用"来熟悉snap的各种命令,从而对Ubuntu Core系统更加了解.

如果大家想把Ubuntu Core 16安装到Virtualbox的话,那么你可以参考我的另外一篇文章"在Virtualbox里安装Ubuntu Core 16".


在Raspberry Pi2/3 dragonboard上进行安装



大家可以参照我先前的文章"如何为树莓派安装Ubuntu Core并在Snap系统中进行编译"来安装Ubuntu Core到我们的所支持的开发板.对于英文比较好的开发者来说,可以参阅链接来安装我们的Ubuntu Core系统到开发板上.热心的Ubuntu Core开发者郝建林也创建了一篇自己的关于如何安装Ubuntu Core到QualComm的dragonboard上.请大家参阅链接

在这里,我们介绍另外一种方法供大家使用:

1)安装snapd


如果大家还没有在Ubuntu Desktop的桌面(16.04)上安装snapd的话,就使用如下的命令来安装.这样我的系统就可以支持snap应用的安装了:

$ sudo apt update  
$ sudo apt install snapd  


2)把image刷入到Ubuntu Core硬件中


我们可以通过如下的命令来把image写到我们所希望的SD卡中:

$ sudo snap install --devmode --beta godd
$ sudo /snap/bin/godd ubuntu-core-16-pi2.img.xz
[this will print a message showing what devices are removable]
$ xzcat ubuntu-core-16-pi2-rc2.img.xz | sudo /snap/bin/godd - /dev/sdXX

记得在实际的操作中,我们需要把上面的sdXX换成我们自己的SD卡的设备



比如针对我的情况,我需要换成mmcblk0.



我们把拷好image的SD卡插入到我们的树莓派板子中,然后启动.我们需要一个带有HDMI的显示器和一个键盘.对于树莓派来说,我们也可以在默认的情况下使用一个串口线.具体操作请参考我的文章"如何为树莓派安装Ubuntu Core并在Snap系统中进行编译".

在启动的时候,你需要输入你的Ubuntu One账号的电子邮件地址,那么它将自动为你生产相应的和你账号匹配的ssh keys.如果你还没有Ubuntu SSO (Single Sign On)账号的话,请在如下的地址进行申请:


当然我们在创建完自己的账号后,千万不要忘记把自己的public ssh keys添加到你自己的账号中.这个申请的账号将被用于我们第一次启动我们的Ubuntu Core系统设置之用.如果大家还不知道如果创建自己的Ubuntu One账号,请参阅我的文章"创建Ubuntu Core账号并为Ubuntu Core设备添加新的账号".

关于Ubuntu Core开发的更多知识可以在地址"ubuntu core 开发介绍 (视频)"找到.
作者:UbuntuTouch 发表于2016/11/4 16:45:46 原文链接
阅读:941 评论:0 查看评论

Read more
UbuntuTouch

大家如果使用snap的话,你可以发现如下的命令:

liuxg@liuxg:~$ snap --help
Usage:
  snap [OPTIONS] <command>

The snap tool interacts with the snapd daemon to control the snappy software platform.


Application Options:
      --version  Print the version and exit

Help Options:
  -h, --help     Show this help message

Available commands:
  abort        Abort a pending change
  ack          Adds an assertion to the system
  buy          Buys a snap
  change       List a change's tasks
  changes      List system changes
  connect      Connects a plug to a slot
  create-user  Creates a local system user
  disable      Disables a snap in the system
  disconnect   Disconnects a plug from a slot
  download     Download a given snap
  enable       Enables a snap in the system
  find         Finds packages to install
  get          Get snap configuration
  help         Help
  install      Installs a snap to the system
  interfaces   Lists interfaces in the system
  known        Shows known assertions of the provided type
  list         List installed snaps
  login        Authenticates on snapd and the store
  logout       Log out of the store
  refresh      Refreshes a snap in the system
  remove       Removes a snap from the system
  revert       Reverts the given snap to the previous state
  run          Run the given snap command
  set          Set snap configuration
  try          Tests a snap in the system

大家可以发现一个叫做"run"的命令.在大多数的情况下,我们并不需要运行这个命令.它在我们运行应用的时候被自动调用.但是,它有一个选项"--shell"非常有用,可以帮助我们调试我们的应用.比如,我们可以通过如下的方式:

$ snap try prime --devmode
$ cp /usr/bin/strace prime
$ sudo snap run --shell <snap.app>
$ (sudo) ./strace

这样我们就可以在一个shell中来调试我们的应用.我们以https://github.com/liu-xiao-guo/helloworld-snap例子为例.在安装完我们的snap应用后.我们可以使用如下的命令查看我们的环境:

liuxg@liuxg:~$ env | grep SNAP
liuxg@liuxg:~$ sudo -S snap run --shell hello-xiaoguo.hello-world
[sudo] password for liuxg: 
root@liuxg:/home/liuxg# env | grep SNAP
SNAP_USER_COMMON=/root/snap/hello-xiaoguo/common
SNAP_REEXEC=
SNAP_LIBRARY_PATH=/var/lib/snapd/lib/gl:
SNAP_COMMON=/var/snap/hello-xiaoguo/common
SNAP_USER_DATA=/root/snap/hello-xiaoguo/x1
SNAP_DATA=/var/snap/hello-xiaoguo/x1
SNAP_REVISION=x1
SNAP_NAME=hello-xiaoguo
SNAP_ARCH=amd64
SNAP_VERSION=1.0
SNAP=/snap/hello-xiaoguo/x1

从上面我们可以看出来,在shell中已经有我们的snap的环境变量等信息.





作者:UbuntuTouch 发表于2016/10/26 9:57:28 原文链接
阅读:339 评论:0 查看评论

Read more
UbuntuTouch

不知道大家是否先前试过我的一个Qt的应用"如何把一个qmake的Ubuntu手机应用打包为一个snap应用".在那个教程中,我们尝试把所有的Ubuntu SDK库包ubuntu-sdk-libs 都打入到我们的应用中,结果是我们的snap包的文件非常大.几乎达到800M-900M.显然这样的应用不具有实用性.我也尝试只把我们最需要的Qt库打入到我们的snap包中.你们可以发现我更新后的代码.即使是这样的,我们最终形成的包的大小也达到120M左右.显然,这也不是一个小的文件.那么我们有什么办法可以使得我们的Qt应用的包变得更小呢?

答案是我们使用canonical公司所提供的ubuntu-app-platform snap应用.这个应用把我们最需要的Qt库打入到我们的snap应用中,并通过content sharing的方法把ubuntu-app-platform中的Qt库文件mount到我们的应用中,从而使得我们的Qt应用能够使用ubuntu-app-platform所提供的所有Qt库.这样我们的所有的在一个Ubuntu Core系统的所有的snap应用都可以共享同一份Qt库,从而达到减少我们snap应用大小的目的.

在下面,我们来详细介绍如何利用content interface来实现这个目的.


1)安装


首先,对于英文比较好的开发者来说,我们可以在如下的地址找到我们所需要的信息:

就像在那篇文章中介绍的那样,我们在我们的Ubuntu 16.04 Desktop中,必须安装stabe-phone-overlay以确保我们的Qt版本是Qt 5.6.1的.否则我们有些Qt应用的打包会有文件.我们可以通过如下的方式来检查我们的Qt版本:

liuxg@liuxg:~$ qmake --version
QMake version 3.0
Using Qt version 5.6.1 in /usr/lib/x86_64-linux-gnu

为什么需要把我们的Qt版本安装为5.6.1版本呢?细心的开发者,可以发现在ubuntu-app-platform的链接中,它表明该snap是基于Qt 5.6.1的版本的.先前在我的电脑上安装的Qt 版本为Qt 5.5.1.当我用该版本打包我的Qt应用时,在运行时会出现一个错误

我们按照如下的步骤来安装我们的Qt 5.6.1版本:

$ sudo add-apt-repository ppa:ci-train-ppa-service/stable-phone-overlay
$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get dist-upgrade

在执行完上面的命令后,我们再次确认我们的Qt版本信息是否为5.6.1.这一步的安装非常中,不正确的Qt版本可能使得有些Qt应用运行正常,但有些可能会出错.


2)利用ubuntu-app-platform来重构Qt应用


我们先前的rssreader Ubuntu Phone应用的源码可以在地址找到:

snapcraft.yaml

name: rssreader-app
version: "1.0"
summary: A snap app from Ubuntu phone app
description: This is an exmaple showing how to convert a Ubuntu phone app to a desktop snap app
confinement: strict # devmode

apps:
  rssreader:
    command: desktop-launch $SNAP/lib/x86_64-linux-gnu/bin/rssreader
    plugs: [network,network-bind,network-manager,home,unity7,opengl]

parts:
  rssreader:
    source: src/
    plugin: qmake
    qt-version: qt5
    build-packages:
      - cmake
      - gettext
      - intltool
      - ubuntu-touch-sounds
      - suru-icon-theme
      - qml-module-qttest
      - qml-module-qtsysteminfo
      - qml-module-qt-labs-settings
      - qtdeclarative5-u1db1.0
      - qtdeclarative5-qtmultimedia-plugin
      - qtdeclarative5-qtpositioning-plugin
      - qtdeclarative5-ubuntu-content1
      - qt5-default
      - qtbase5-dev
      - qtdeclarative5-dev
      - qtdeclarative5-dev-tools
      - qtdeclarative5-folderlistmodel-plugin
      - qtdeclarative5-ubuntu-ui-toolkit-plugin
      - xvfb
    stage-packages:
      - libsdl2-2.0-0
      - libqt5gui5
      - libqt5qml5
      - libqt5quick5
      - libqt5widgets5
      - libqt5network5
      - libqt5multimedia5
      - libqt5declarative5
      - qml-module-qtquick2
      - qml-module-qtquick-window2
      - qml-module-qtquick-layouts
      - qml-module-qtquick-controls
      - qml-module-qt-labs-settings
      - qml-module-ubuntu-components
      - qml-module-qtquick-xmllistmodel
      - ubuntu-ui-toolkit-theme
      - qml-module-ubuntu-connectivity
      - qml-module-ubuntu-layouts
      - qml-module-ubuntu-performancemetrics
      - fonts-wqy-zenhei
      - fcitx-frontend-qt5
    snap:
      - -usr/share/doc
      - -usr/include
    after: [desktop/qt5]

显然在上面的snapcraft.yaml中,我们把太多的Qt库打入到我们的snap包中.其结果就是大大增加了我们的snap包的大小.为了能够利用ubuntu-app-platform所提供的platform interface,我们把我们的应用的snapcraft.yaml修改为:

snapcraft.yaml

name: rssreader-app
version: "1.0"
summary: A snap app from Ubuntu phone app
description: This is an exmaple showing how to convert a Ubuntu phone app to a desktop snap app
confinement: strict # devmode

apps:
  rssreader:
    command: desktop-launch $SNAP/lib/x86_64-linux-gnu/bin/rssreader
    plugs: [network,network-bind,network-manager,home,unity7,opengl,platform]

parts:
  rssreader:
    source: src/
    plugin: qmake
    qt-version: qt5
    snap:
      - -usr/share/doc
      - -usr/include
    after: [desktop-ubuntu-app-platform]
  
  plat:
    plugin: dump
    source: .
    snap: [ubuntu-app-platform]
    
plugs:
  platform: # plug name, to be used later
    interface: content
    content: ubuntu-app-platform1 # content being mounted and the version, currently 1
    target: ubuntu-app-platform # the mount directory created
    default-provider: ubuntu-app-platform # default content source snap, currently the only provider too

从上面的新的snapcraft.yaml文件中,我们可以看出来:我们把stage-packages里所有的相关的debian包都已经删除了,取而代之的是在我们的应用中加入了platform这个plug.在我们的应用中,我们也定义了我们的platform plug interface.另外,我们值得指出的是,我们在我们的应用的根目录下创建了一个空的ubuntu-app-platform目录.这个目录的作用是被platform interface作为mount点从而把Qt库分享给我们的应用.如果没有这个空的文件目录,在运行我们的Qt应用时会出错.整个项目的文件结果如下:

liuxg@liuxg:~/snappy/desktop/rssreader_platform$ tree -L 2
.
├── setup
│   └── gui
├── snapcraft.yaml
├── src
│   ├── manifest.json.in
│   ├── po
│   ├── rssreader
│   └── rssreader.pro
└── ubuntu-app-platform

在确保我们的项目完成后,我们在项目的根目录下打入如下的命令:

$ snapcraft

这样就会在当前的目录下生产我们想要的.snap文件包.我们来重新查看一下我们所生产的snap包的大小:



显然我们的snap包的文件大小只有18M,比我们先前的120M要小好多.细心的开发者可能已经发现所有的Qt库文件.它包含了我们运行一个Qt应用最基本的库:

liuxg@liuxg:~/snappy/desktop/rssreader_platform/prime/usr/lib/x86_64-linux-gnu$ l
libdouble-conversion.so.1  libpcre16.so.3      libX11-xcb.so.1      libXdamage.so.1
libdrm.so.2                libproxy.so.1       libXau.so.6          libXdmcp.so.6
libglapi.so.0              libQt5Core.so.5     libxcb-dri2.so.0     libXext.so.6
libgraphite2.so.3          libQt5Gui.so.5      libxcb-dri3.so.0     libXfixes.so.3
libharfbuzz.so.0           libQt5Network.so.5  libxcb-glx.so.0      libxshmfence.so.1
libicudata.so.55           libQt5Qml.so.5      libxcb-present.so.0  libXxf86vm.so.1
libicui18n.so.55           libQt5Quick.so.5    libxcb.so.1          mesa/
libicuuc.so.55             libX11.so.6         libxcb-sync.so.1

我们可以按照如下的方式进行安装:

liuxg@liuxg:~/snappy/desktop/rssreader_platform$ sudo snap install rssreader-app_1.0_amd64.snap --dangerous
rssreader-app 1.0 installed

当我们尝试第一次运行我们的应用时,我们可以看到如下的信息:

liuxg@liuxg:~/snappy/desktop/rssreader_platform$ rssreader-app.rssreader 
You need to connect the ubuntu-app-platform package with your application 
to reuse shared assets, please run:
snap install ubuntu-app-platform
snap connect rssreader-app:platform ubuntu-app-platform:platform

显然,它是提示我们需要安装相应的ubuntu-app-platform snap应用:

liuxg@liuxg:~$ sudo snap install ubuntu-app-platform
ubuntu-app-platform (stable) 1 from 'canonical' installed
liuxg@liuxg:~$ sudo snap connect rssreader-app:platform ubuntu-app-platform:platform

至此,我们已经把我们的应用的platform plug和ubuntu-app-platform的platform slot进行了手动连接.我们可以通过如下的命令来查看:



在我们的命令行中执行如下的命令:

liuxg@liuxg:~/snappy/desktop/rssreader_platform$ rssreader-app.rssreader 
You need to connect the ubuntu-app-platform package with your application 
to reuse shared assets, please run:
snap install ubuntu-app-platform
snap connect rssreader-app:platform ubuntu-app-platform:platform

显然我们的应用在执行时遇到了问题.它并没有启动我们的应用,而是显示和我们上面同样的信息.这是由于一个我们在目前snapd版本中设计的bug所致.我们目前可以通过如下的方法来消除这个问题.

$ sudo /usr/lib/snapd/snap-discard-ns rssreader-app

我们可以再重新安装我们的应用.在没有connect之前,不要运行我们的应用!如果你已经运行了,那么请执行上面的命令来删除name space,然后再重新安装,connect,再最后运行我们的应用:

$ rssreader-app.rssreader



整个应用的源码可以在地址找到:https://github.com/liu-xiao-guo/rssreader_platform













作者:UbuntuTouch 发表于2016/11/24 10:07:01 原文链接
阅读:181 评论:0 查看评论

Read more
UbuntuTouch

[原]在Virtualbox里安装Ubuntu Core 16

在先前的文章"安装Ubuntu Core系统",我们介绍了如何在KVM及ARM设备中如何安装Ubuntu Core 16.在今天的教程中,我们来展示如何利用Virtualbox来安装Ubuntu Core.在某些情况下,这也许是比KVM更加方便的方法.


1)下载virtualbox并安装


我们可以在如下的地址:


下载最新的Virtualbox debian包.等下载完成后,我们双击下载后的.deb文件,就可以让我们的Ubuntu Store应用帮我们进行安装:





2)下载Ubuntu Core image


我们在如下的地址下载最新的Ubuntu Core 16 image:


我们可以在该页面直接下载Ubuntu Core的文件.我们也可以在我们的terminal中打入如下的命令:

$ wget http://releases.ubuntu.com/ubuntu-core/16/ubuntu-core-16-amd64.img.xz
$ unxz ubuntu-core-16-amd64.img.xz

注意我们上面下载的是64位的版本.开发者可以根据自己的CPU的位数下载相应的版本.
我们下载的是一个raw的disk image,为了能够使得virtualbox能够使用,我们必须使用如下的命令来进行转换成为一个VDI:

$ VBoxManage convertdd ubuntu-core-16-amd64.img ubuntu-core-16-amd64.vdi --format VDI

这样在我们的文件目录中会出现如下的文件:

liuxg@liuxg:~/snappy/desktop/images1$ ls -alh
total 775M
drwxrwxr-x   2 liuxg liuxg 4.0K 11月 22 13:34 .
drwxrwxr-x 115 liuxg liuxg 4.0K 11月 22 13:32 ..
-rw-rw-r--   1 liuxg liuxg 3.7G 11月  3 23:16 ubuntu-core-16-amd64.img
-rw-------   1 liuxg liuxg 402M 11月 22 14:04 ubuntu-core-16-amd64.vdi
我们看见一个新的文件ubuntu-core-16-amd64.vdi已经生产了.


3)在virtualbox中创建一个Ubuntu Core实例


我们在Desktop的dash中启动我们的virtualbox:



等virtualbox启动后,我们开始我们的配置:

    



当我们点击create按钮时,它可能会出现如下的错误信息:



这是因为我们没有运行如下的命令的缘故:

$ sudo /sbin/vboxconfig

如果在运行上面的命令出现如下的错误:


根据在AskUbuntu上的提示,我们需要在我们的BIOS中先disable我们的secure boot.具体如何操作,我们得根据自己的BIOS来进行设置.等设置完后,再执行上面的命令即可直到成功为止.



接下来我们来configure我们的Ubuntu Core 16:

     

  

至此,我们已经把我们的Ubuntu Core设置完毕.


4)登陆Ubuntu Core 16


在上面我们已经设置好我们的Ubuntu Core 16.接下来,我们来配置我们的virtualbox并使得我们能够登陆这个Ubuntu Core.我们首先打开我们的virtualbox

   



经过上面的配置后,我们把virtualbox里的Ubuntu Core的22口地址重新定向到10022口地址.我们接下来启动我们的Ubuntu Core:



这样我们可以看到我们的Ubuntu Core已经启动.

\
我们可以在我们的terminal中打入如下的命令来登陆我们的Ubuntu Core:




至此,我们已经完成了对virtualbox的配置.


作者:UbuntuTouch 发表于2016/11/22 14:41:57 原文链接
阅读:494 评论:0 查看评论

Read more
UbuntuTouch

我们知道snapcraft的plugin框架是可以扩展的.我们可以为我们的snapcraft根据新的需求定义一个新的custom plugin来build我们的项目.在今天的这篇文章中,我们将介绍如何为我们的snapcraft创建一个新的plugin.关于snapcraft的plugin的更多的知识,请参阅我们的文档.更多关于snapcraft的知识,可以参阅我们的网站snapcraft.io.我们也可以在地址找到许多的plugin的例程供我们参考.


1)创建一个最基本的custom plugin



目前,我们能够在网上找到的最相近的文档在:


按照要求,我们创建一个最基本的custom plugin的模版.我们可以通过如下的方法把我们的代码下载下来:

$ git clone https://github.com/liu-xiao-guo/plugin_template

我们的项目的文件架构:

liuxg@liuxg:~/release/plugin_template$ tree -L 3
.
├── parts
│   └── plugins
│       └── myplugin.py
└── snapcraft.yaml

在上面的文件架构中,我们可以看出来,我们在我们的项目的根目录下创建了一个叫做parts的目录.在它的下面,我们也创建了一个叫做plugins的子目录.里面我们创建了一个最基本的文件myplugin.py.它的内容如下:

myplugin.py


# -*- Mode:Python; indent-tabs-mode:nil; tab-width:4 -*-

import logging
import os
import glob
from pprint import pprint

import snapcraft

logger = logging.getLogger(__name__)

def _dump(name, obj):
    for attr in dir(obj):
        # logger.warning("obj.%s = %s", attr, getattr(obj, attr))
        func = getattr(obj, attr, None)
        if func:
            logger.warning("%s.%s = %s",name, attr, func)
            
    logger.warning("===================================")

class MyPlugin(snapcraft.BasePlugin):

    @classmethod
    def schema(cls):
        schema = super().schema()

        schema['properties']['myprop'] = {
            'type': 'string',
            'default': ''
        }

        # Inform Snapcraft of the properties associated with building. If these
        # change in the YAML Snapcraft will consider the build step dirty.
        schema['build-properties'].append('myprop')

        return schema
                        
    def __init__(self, name, options, project):
        super().__init__(name, options, project)
        logger.warning("__init__ begins name: %s", name)
        logger.warning("options.source: %s", options.source)
        logger.warning("options.myprop: %s", options.myprop) 
        logger.warning("self.builddir: %s", self.builddir)
        logger.warning("self.installdir: %s", self.installdir)
        # logger.warning("self.project.parallel_build_count: %d", self.project.parallel_build_count)
        # logger.warning("self.project.arch_triplet: %s", self.project.arch_triplet)
        # logger.warning("self.project.stage_dir: %s", self.project.stage_dir)
       
        logger.warning("Going to add the needed build packages...")
        # self.build_packages.append('golang-go')
        # _dump("options", options)
        # _dump("project", project)
        
        logger.warning("build-packages:")
        for pkg in options.build_packages:
            logger.warning("build package: %s", pkg)

    def build(self):
        # setup build directory
        super().build()
        logger.warning("build begins ... ")
               
    def pull(self):
        super().pull()
        logger.warning("pull begins ... ")                
       
    def clean_pull(self):
        super().clean_pull()       
        logger.warning("clean pull begins ... ")      

在这里,我们可以看出来一个最基本的最简单的一个plugin的模版.我们的MyPlugin继承于snapcraft.BasePlugin.其实里面没有做任何实质性的东西.这里值得指出的是,我们使用了logger.warning(...)来帮我们输出调试信息.在真正的release时,我们需要删除这些输出.我们知道,在snapcraft build一个项目时,它经历如下的过程:




一个plugin在上面的5个过程中,它有经历pullbuild.我们也可以参考在snapcraft项目中的许多plugin的实例来如何实现上面的method.
在上面的代码中:

        schema['properties']['myprop'] = {
            'type': 'string',
            'default': ''
        }

我们也定义了一个我们自己的被叫做myprop的property.为了展示我们对这个定制的snapcraft的plugin的调用,我们设计了如下的snapcraft.yaml文件:

snapcraft.yaml

name: plugin # you probably want to 'snapcraft register <name>'
version: '0.1' # just for humans, typically '1.2+git' or '1.3.2'
summary: This is a sample plugin for snapcraft # 79 char long summary
description: |
  This is a plugin example

grade: stable # must be 'stable' to release into candidate/stable channels
confinement: strict # use 'strict' once you have the right plugs and slots

parts:
  my-part:
    # This is a custom plugin defined in "parts" dir
    plugin: myplugin
    # This is the property defined in the plugin. It is a file name
    # to be used for the congfigure hook
    myprop: configure
    source: .    

在这里,我们运用了myplugin,同时我们也使用了在我们plugin中所定义的myprop属性为configure.source通常是一个plugin必不可少的一个属性.在我们的例程中,我们定义它为".",也即当前的目录.

至此,我们最基本的一个plugin的框架已经搭好了,那么我们来对我们的项目进行build.在项目的根目录中打入:

$ snapcraft



从上面我们可以看出来它已经成功利用我们自己设计的plugin来build我们的项目,并且我们可以看出来"pull begins ..."及"build begins ..."字样.这些都是在我们的上面的myplugin.py中的logger.warning(...)所输出的.同时,我们也打印出来一些我们可能需要的Object属性,比如self.builddir等.我们也可以看出我们的options.myprop的值为"configure".同样,我们也可以来clean我们的项目:

$ snapcraft clean



从上面可以看出来,在myplugin.py中所定义的"clean_pull(self)"也被调用.我们可以通过这个method来删除我们在pull中下载的任何东西.

到目前为止,我们的最基本的template plugin没有做任何实质性的东西,它只是展示了继承于snapcraft.BasePlugin类里最基本的method(比如build(self))的调用.在下面的章节中,我们将展示如何利用这些方法来做我们需要做的事.


2)创建一个简单的运用snapcraft plugin的应用



在这一章节中,我们来展示如何使用我们上面的plugin来做一些有意义的事.在今天的例程中,我们想把在我们项目最终的snap包中打入如下的configure文件:

liuxg@liuxg:~/snappy/desktop/plugin/prime$ tree -L 3
.
├── bin
│   └── config
├── command-config.wrapper
└── meta
    ├── hooks
    │   └── configure
    └── snap.yaml

一旦我们在meta/hooks目录下生产这个configure(可执行文件)文件,其内容如下:

configure


#!/bin/sh

if ! username=$(snapctl get username); then
    echo "Username is required"
    exit 1
fi

if ! password=$(snapctl get password); then
    echo "Password is required"
    exit 1
fi

# Handle username and password, perhaps write to a credential file of some sort.
echo "user=$username" > $SNAP_DATA/credentials
echo "password=$password" >> $SNAP_DATA/credentials
chmod 600 $SNAP_DATA/credentials

一旦在我们的snap安装中有上面的configure文件,那么我们可以在我们的Ubuntu Core系统中,使用如下的命令:

$ sudo snap set plugin username=foo password=bar

来生产在$SNAP_DATA目录下的credentials文件.其内容如下:



由于一些原因,目前只能在Ubuntu Core的系统中进行测试(比如树莓派,dragon board, KVM等上进行测试).在Ubuntu Desktop的桌面环境中还是有一点问题.
基于这样的思路,我们重新改写我们的myplugin.py文件:

myplugin.py


# -*- Mode:Python; indent-tabs-mode:nil; tab-width:4 -*-

import logging
import os
import glob
from pprint import pprint

import snapcraft

logger = logging.getLogger(__name__)

def _dump(name, obj):
    for attr in dir(obj):
        # logger.warning("obj.%s = %s", attr, getattr(obj, attr))
        func = getattr(obj, attr, None)
        if func:
            logger.warning("%s.%s = %s",name, attr, func)
            
    logger.warning("===================================")

class MyPlugin(snapcraft.BasePlugin):

    @classmethod
    def schema(cls):
        schema = super().schema()

        schema['properties']['myprop'] = {
            'type': 'string',
            'default': ''
        }

        # Inform Snapcraft of the properties associated with building. If these
        # change in the YAML Snapcraft will consider the build step dirty.
        schema['build-properties'].append('myprop')

        return schema
        
    def _copy(self, path_copyto):
        path = os.path.join(path_copyto, "meta/hooks/")
        logger.warning("path: %s", path);
        os.makedirs(os.path.dirname(path), exist_ok=True)
        source = self.builddir + "/" + self.options.myprop
        logger.warning("source: %s", source)
        destination = path + self.options.myprop
        logger.warning("destination: %s", destination)
        snapcraft.common.link_or_copy(source, destination, False)
                
    def __init__(self, name, options, project):
        super().__init__(name, options, project)
        logger.warning("__init__ begins name: %s", name)
        logger.warning("options.source: %s", options.source)
        logger.warning("options.myprop: %s", options.myprop) 
        logger.warning("self.builddir: %s", self.builddir)
        logger.warning("self.installdir: %s", self.installdir)
        # logger.warning("self.project.parallel_build_count: %d", self.project.parallel_build_count)
        # logger.warning("self.project.arch_triplet: %s", self.project.arch_triplet)
        # logger.warning("self.project.stage_dir: %s", self.project.stage_dir)
       
        logger.warning("Going to add the needed build packages...")
        # self.build_packages.append('golang-go')
        #_dump("options", options)
        #_dump("project", project)
        
        logger.warning("build-packages:")
        for pkg in options.build_packages:
            logger.warning("build package: %s", pkg)

    def build(self):
        # setup build directory
        super().build()
        logger.warning("build begins ... ")
        
        # copy congfigure file to parts/<part>/build/meta/hooks
        self._copy(self.builddir)
        
        # copy configure file to parts/<part>/install/meta/hooks
        self._copy(self.installdir)
       
    def pull(self):
        super().pull()
        logger.warning("pull begins ... ")                
       
    def clean_pull(self):
        super().clean_pull()       
        logger.warning("clean pull begins ... ")

在这里,我们把我们的configure文件考入到我们相应part的build及install目录里.这样我们的任务就完成了.我们主要修改的部分在"build(self)".同样地,我们也对我们的snapcraft.yaml做了如下的修改:

snapcraft.yaml


name: plugin # you probably want to 'snapcraft register <name>'
version: '0.1' # just for humans, typically '1.2+git' or '1.3.2'
summary: This is a sample plugin for snapcraft # 79 char long summary
description: |
  This is a plugin example

grade: stable # must be 'stable' to release into candidate/stable channels
confinement: strict # use 'strict' once you have the right plugs and slots

apps:
  config:
   command: bin/config

parts:
  my-part:
    # This is a custom plugin defined in "parts" dir
    plugin: myplugin
    # This is the property defined in the plugin. It is a file name
    # to be used for the congfigure hook
    myprop: configure
    source: .
    
  config:
    plugin: dump
    source: ./bin
    organize:
      "*": bin/

在这里,我们加入了一个叫做config的app.它可以被用来展示我们的设置的结果:

config


#!/bin/bash

echo "Reading config file at: $SNAP_DATA"

config_file="$SNAP_DATA/credentials"

if [ -f "$config_file" ]
then
	cat $config_file
else
	echo "$config_file not found."
	echo "Please run the following commmand to generate the file:"
	echo "sudo snap set plugin username=foo password=bar"
fi

重新build我们的项目:



从上面可以看出来我们中间输出的一些调试的信息.当然我们可以做任何我们需要做的事情,比如根据build-packages的定义来分别安装对应的debian包等.

我们也可以来测试我们的应用:


事实上我们也可以直接使用由我们的snapcraft所提供的dump plugin来完成这个.有兴趣的开发者可以参阅我的文章"如何为我们的Ubuntu Core应用进行设置".我们从这个例子中展示如何创建一个我们自己的snapcraft的custom plugin.

更多关于如何设计自己的custom plugin:

作者:UbuntuTouch 发表于2016/11/14 14:50:05 原文链接
阅读:742 评论:0 查看评论

Read more
UbuntuTouch

当我们完成一个Ubuntu Core应用的时候,可能需要我们的Ubuntu Core应用根据我们的设置需要来配置我们的运行所需要的一些参数,比如,我想确消我们Ubuntu Core系统的自动更新功能,或对我们的Ubuntu Core应用进行分别的设置从而改变该应用的运行.在今天的教程中,我们来展示如何在Ubuntu Core应用中进行配置.


为了展示,我们已经开发一个例程.在如下的地址可以找到我的例程:

https://github.com/liu-xiao-guo/helloworld-configure

我们的snapcraft.yaml文件如下:

name: hello
version: "1.0"
summary: The 'hello-world' of snaps
description: |
    This is a simple snap example that includes a few interesting binaries
    to demonstrate snaps and their confinement.
    * hello-world.env  - dump the env of commands run inside app sandbox
    * hello-world.evil - show how snappy sandboxes binaries
    * hello-world.sh   - enter interactive shell that runs in app sandbox
    * hello-world      - simply output text
confinement: strict
type: app  #it can be gadget or framework

apps:
 env:
   command: bin/env
 evil:
   command: bin/evil
 sh:
   command: bin/sh
 hello-world:
   command: bin/echo
   plugs: [home,unity7,opengl]
 createfile:
   command: bin/createfile
 createfiletohome:
   command: bin/createfiletohome

parts:
 hello:
  plugin: copy
  files:
    ./bin: bin
 config:
  plugin: dump
  source: .
  organize:
    configure: meta/hooks/configure
    


在未来,也许我们的snapcraft工具做得更好,以更方便地支持configure.这样我们可能不必要使用dump来安装这个文件.在这里最关键的是:我们需要把一个叫做configure的可以执行的文件打包于meta/hooks/目录下.这样就可以了.我们的configure的内容如下:

configure

#!/bin/sh

if ! username=$(snapctl get username); then
    echo "Username is required"
    exit 1
fi

if ! password=$(snapctl get password); then
    echo "Password is required"
    exit 1
fi

# Handle username and password, perhaps write to a credential file of some sort.
echo "user=$username" > $SNAP_DATA/credentials
echo "password=$password" >> $SNAP_DATA/credentials
chmod 600 $SNAP_DATA/credentials
在这个脚本中,我们读取username及password,并把它们存于到$SNAP_DATA/credentials的文件中.

等我们打包成功后,再安装好我们的hello snap应用.

liu-xiao-guo@localhost:~$ snap list
Name         Version       Rev  Developer  Notes
bluez        5.37-1        7    canonical  -
classic      16.04         14   canonical  devmode
hello        1.0           x1              -
lights-app   0.1           x1              devmode
livevideo    0.1           x1              devmode
pi2-kernel   4.4.0-1030-3  22   canonical  -
pi3          16.04-0.5     6    canonical  -
piglow-app   1.0           x2              devmode
sensortag    1.0           x3              devmode
snapweb      0.21.2        25   canonical  -
ubuntu-core  16.04.1       760  canonical  -

我们可以运行我们的hello.env应用:

liu-xiao-guo@localhost:~$ sudo hello.env | grep SNAP
SNAP_USER_COMMON=/root/snap/hello/common
SNAP_REEXEC=
SNAP_LIBRARY_PATH=/var/lib/snapd/lib/gl:
SNAP_COMMON=/var/snap/hello/common
SNAP_USER_DATA=/root/snap/hello/x1
SNAP_DATA=/var/snap/hello/x1
SNAP_REVISION=x1
SNAP_NAME=hello
SNAP_ARCH=armhf
SNAP_VERSION=1.0
SNAP=/snap/hello/x1

从上面我们可以看出来我们的SNAP_DATA目录位于/var/snap/hello/current目录中.

我们再打入如下的命令:

liu-xiao-guo@localhost:~$ sudo snap set hello username=foo1 password=bar1

如果没有任何的错误,我们可以看出来我们的设置已经成功运行.在上面的命令执行后,我们的项目中的configure脚本会自动被调用,并把我们所需要的设置置于我们所需要的文件中.我们可以通过如下的命令来检查我们给应用所做的设置:

liu-xiao-guo@localhost:~$ sudo snap set hello username=foo1 password=bar1
liu-xiao-guo@localhost:~$ cd /var/snap/hello/current
liu-xiao-guo@localhost:/var/snap/hello/current$ cat credentials 
cat: credentials: Permission denied
liu-xiao-guo@localhost:/var/snap/hello/current$ sudo cat credentials 
user="foo1"
password="bar1"

通过上面的测试,我们可以看出来,我们已经把我们想要的设置放入到我们所需要的目录中.在我们运行我们的应用时,我们可以根据这些设置来做不同的事情.

由于一些原因,目前我在ubuntu的设备上测试成功,在16.04的桌面上snapd的支持还有一点问题.







作者:UbuntuTouch 发表于2016/10/31 13:52:00 原文链接
阅读:389 评论:0 查看评论

Read more
UbuntuTouch

Chrome浏览器是一个非常重要的应用.它甚至成为我们平时工作而不可以缺失的工具.在今天的教程中,我们来展示如何把Chrome浏览器打包为一个snap应用.


我们知道,每当我们在电脑上安装我们的Chrome浏览器时,我们可以在如下的地址来下载我们的Chrome deb安装包:

https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb

当然这是针对64位的机器来说的.我们如何在我们的snapcraft如何安装这个debian包呢?答案是使用dump plugin.为此,我们的snapcraft.yaml的内容如下:

snapcraft.yaml


name: mychrome # you probably want to 'snapcraft register <name>'
version: '0.2' # just for humans, typically '1.2+git' or '1.3.2'
summary: Chrome for snap # 79 char long summary
description: |
  This is chrome app in snap format

grade: stable # must be 'stable' to release into candidate/stable channels
confinement: strict # use 'strict' once you have the right plugs and slots

apps: 
  mychrome:
    command: desktop-launch $SNAP/opt/google/chrome/chrome
    plugs: [unity7,home,x11,opengl,network,network-bind,browser-support,process-control,fuse-support]

parts:
  chrome:
    plugin: dump
    source: https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
    stage-packages:
      - overlay-scrollbar-gtk2
      - libatk-adaptor
      - libgail-common
      - libcanberra-gtk-module
      - libnss3-tools
      - libglu1-mesa

      # language support
      - fonts-freefont-ttf
      - ttf-freefont
      - ttf-wqy-microhei
      - fonts-wqy-microhei

      # input method
      - fcitx
      - fcitx-frontend-gtk2 

    after: [desktop-gtk2]

在上面可以看出来,我们使用dump plugin来安装我们的google-chrome-stable_current_amd64.deb文件.
为了能够让我们的chrome正确运行,我们也同时把它所需要的其它的debian包一并打入到我们的snap包中.

    stage-packages:
      - overlay-scrollbar-gtk2
      - libatk-adaptor
      - libgail-common
      - libcanberra-gtk-module
      - libnss3-tools
      - libglu1-mesa

      # language support
      - fonts-freefont-ttf
      - ttf-freefont
      - ttf-wqy-microhei
      - fonts-wqy-microhei

      # input method
      - fcitx
      - fcitx-frontend-gtk2 

这些都是从Ubuntu Archive来的debian安装包,它们将最终被打入到我们的snap包中.也许有人问:为什么我们不可以用同样的方法(stage-packages)来打包我们的google-chrome-stable_current_amd64.deb?这里的原因就是它不来自于Ubuntu Archive,所以stage-packages不可以帮我们安装.在这里,我们由于在应用中需要中文的显示,所以我也把相应的语言字体包打入到我们的应用之中.对于其它语言的支持,开发者可以自己添加到语言的列表中.另外为了配合我们的输入法的输入,我也把相应的输入法的包打入到我们的最终的snap包中.

另外由于这个应用是一个gtk的应用,所有我们必须使用由desktop-gtk2所提供的desktop-launch来启动我们的应用.由于这个remote part必须是先于我们的chrome part,所有我们使用了after来调整在build过程中的先后顺序.

在这里值得注意的是我们使用两个非自动连接的plug/slot接口(interfaces):process-control及fuse-support.将来如果该应用发布到stable channel的话,并且我们不以--devmode的选项来安装,我们可以使用如下的命令来安装并需要做相应的手动连接:

$ sudo snap install mychrome
$ sudo snap connect mychrome:fuse-support ubuntu-core:fuse-support
$ sudo snap connect mychrome:fuse-support ubuntu-core:process-control

由于目前我的mychrom应用是发布到beta的channel里,并且还有个别的安全问题没有完全得到解决.我们可以使用--devmode来安装:

$ sudo snap install mychrome --beta --devmode

等安装完我们的chrome应用后,我们可以在我们的dash中找到相应的Chrome图标.我们可以直接使用这个图标来启动我们的应用:






我们项目的源码在:https://github.com/liu-xiao-guo/mychrome

在调试我们的应用时,我们可以在一个terminal中打入如下的命令:

$ sudo snap install snappy-debug
$ sudo snap connect snappy-debug:log-observe ubuntu-core:log-observe
$ sudo /snap/bin/snappy-debug.security scanlog mychrome

在另外一个terminal或在dash中直接启动我们的应用mychome,我们可以在上面的terminal中查看我们缺失的plugs或错误信息.通过这种方法可以帮助我们来调试我们的应用.

作者:UbuntuTouch 发表于2016/11/8 9:50:32 原文链接
阅读:209 评论:0 查看评论

Read more
UbuntuTouch

[原]LeMaker Guitar Snappy Ubuntu安装体验

我们知道LeMaker的版子是支持Ubuntu Core的.具体的信息可以在地址找到.在这篇文章中,我们介绍如何安装Ubuntu Core到LeMaker的板子中去.


1.准备工作


LeMaker Guitar + LeMaker Guitar Baseboard Rev.B 一套

电源适配器一套
PC主机一套
Snappy Ubuntu SD卡镜像(http://mirror.lemaker.org/Snappy_Ubuntu_16_For_Guitar_SD_Beta2.7z


2.更新升级EMMC里面的系统


虽然我们用的是SD卡的镜像,但是由于LeMaker Guitar的早期板子的出厂emmc系统使用的旧版本固件,新旧固件在显示框架上面有很大的改动,不能混用,所以建议首先将板子emmc里面系统镜像升级到最新目前网站上面提供的任意系统的最新版本。

系统下载:http://www.lemaker.org/product-guitar-resource.html , 任意选择一个系统的最新emmc版本的下载。
EMMC系统安装方法见说明,很容易:http://wiki.lemaker.org/LeMaker_Guitar:Quick_Start#Installing_OS_image_into_eMMC_NAND_Flash


EMMC里面的系统升级安装完成后,先插上电源,不要插SD卡,确认EMMC里面的系统是跑起来了,然后断开电源。如果EMMC系统运行没问题,才能开始下面一步。


3. 将下载的SD卡的系统镜像烧录到SD卡中


我使用的windows电脑。下载一个SDFormatter软件和win32 Disk Imager。

(1)将SD卡通过USB读卡器插入到电脑上面,建议一定要USB读卡器,否则会导致烧录不成功。
(2)使用SDFormatter软件格式化SD卡。
(3)使用win32 disk imager软件载入下载的系统镜像,并且烧录到SD卡中。
烧录成功后拔下SD卡。


当然你也可以用Linux的电脑来完成上面步骤,可以先通过fdisk和mkfs等命令格式化SD卡,然后通过dd命令烧录系统镜像即可。我相信,玩Linux的人应该这几个命令是比较熟悉的。


4.将SD卡插入到Guitar板子中上电启动。由于Snappy Ubuntu Core不带桌面,所以HDMI输出显示的是命令行模式。

作者:UbuntuTouch 发表于2016/9/12 7:21:00 原文链接
阅读:524 评论:0 查看评论

Read more
UbuntuTouch

[原]如何把魅族Pro 5刷成Ubuntu手机

对于一下Ubuntu的粉丝来说,能够把魅族的手机刷成Ubuntu手机是一件非常幸运的事.我找到了一篇这样的文章.不过大家需要小心.我对下面这个链接的内容没有做任何的验证.希望大家本着自己对自己负责的原则.我们对里面的内容,不做任何的负责.


How to flash Meizu Pro 5 to Ubuntu Touch


中文教程:http://weibo.com/ttarticle/p/show?id=2309404019204142568347

作者:UbuntuTouch 发表于2016/9/12 14:02:55 原文链接
阅读:1379 评论:0 查看评论

Read more
UbuntuTouch

在这篇文章中,我们将介绍一个崭新的工具snapcraft-gui来帮我们开发snap应用.对于一些刚开始开发snap应用的开发者来说,很多的命令及格式对它们来说非常不熟悉.我们可以利用现有的一个含有GUI的Qt应用来帮助我们来创建一个崭新的应用或用来管理我们已经创建好的一个应用.我们再也不需要那些繁琐的命令来帮我们了.我们只需要做的就是按下工具里面的按钮或在文本输入框中直接编辑我们的snapcraft.yaml项目文件即可.


1)下载及安装


我们可以在如下的地址:


找到这个项目的开源地址.我们可以在地址下载它的最新的发布.它目前有deb包.当我们下载完后,只需要双击就可以安装这个debian包了.请注意,由于目前开发snap的应用只限于在Ubuntu 16.04及以上的版本上,我们需要将我们的Ubuntu桌面升级到相应的版本.

等安装完我们的应用后,我们直接在dash中找到这个应用:






在上面我们可以看到应用启动后的界面.


2)使用snapcraft-gui来创建及管理我们的snap项目


首先,我们可以利用snapcraft-gui项目来管理我们已经创建的一个项目.比如我们可以在地址:


下载我之前做过的一个项目:

$ git clone https://github.com/liu-xiao-guo/helloworld-demo

我们可以选择"Open (yaml)"这个按钮导入我们已经创建的项目:


我们可以通过这个界面来管理我们的snapcraft.yaml文件(比如修改并保存).当然我们也可以按照我们build一个snap包的顺序点击按钮进行打包我们的snap.


我们可以在工具的右上角发现这些build的步骤.当然我们也可以选择针对我们项目中的某个part进行单独操作.这特别适合于有些part的编译及下载需要很长的时间.如果这个part没有改动,我们不需要在重新build时clean它,进而节省我们的时间.

我们也可以关掉当前的项目,并点击"New (init)"来创建一个崭新的项目(snapcraft.yaml),比如:




我们可以在上面的工具中,编辑我们的snapcraft.yaml,并调试我们的最终的项目.

如果你想对snap有更多的了解,请参阅我的文章:安装snap应用到Ubuntu 16.4桌面系统

作者:UbuntuTouch 发表于2016/9/19 10:15:54 原文链接
阅读:520 评论:0 查看评论

Read more