Canonical Voices

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 原文链接
阅读:305 评论: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 原文链接
阅读:277 评论: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 原文链接
阅读:1892 评论: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系统到开发板上.

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

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 原文链接
阅读:840 评论: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 原文链接
阅读:314 评论: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 原文链接
阅读:138 评论: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 原文链接
阅读:446 评论: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 原文链接
阅读:710 评论: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 原文链接
阅读:347 评论: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 原文链接
阅读:173 评论: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 原文链接
阅读:496 评论: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 原文链接
阅读:1294 评论: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 原文链接
阅读:494 评论:0 查看评论

Read more
UbuntuTouch

[原]如何打包nodejs snap应用

在snap应用开发中,我们可以把一个nodejs的应用打包为snap包.它的开发其实非常简单.在今天的这篇文章中,我们来介绍如何开发一个nodejs的snap应用.


1)在desktop上开发并测试


我们可以在我们的Ubuntu Destop上开发好我们的nodejs应用.这个应用可以不是snap包形式的.我们可以使用不同的framework来开发充分并测试我们的应用.虽然IoT的设备环境和我们的PC环境不同,但是我们还是可以测试我们的大部分功能.


2)打包我们的nodejs应用成为snap包


我们首先把我们的如下的项目:


首先,我们需要把我们的js文件的开头部分添加:

#!/usr/bin/env node

这样确保它是一个可以被执行的文件.这个步骤非常重要.否则我们的应用可能不会正常运行.具体的例程代码:

#!/usr/bin/env node
// Load the http module to create an http server.
var http = require('http');

// Configure our HTTP server to respond with Hello World to all requests.
var server = http.createServer(function (request, response) {
  response.writeHead(200, {"Content-Type": "text/plain"});
    response.end("Hello snapcrafter\n");
    });

// Listen on port 8000, IP defaults to 127.0.0.1
server.listen(8000);

// Put a friendly message on the terminal
console.log("Server running at http://127.0.0.1:8000/");

每个nodejs的项目有一个package.json的文件,我们通常可以把我们npm所需要安装的包放入到这个文件中,比如:

package.json

{
  "name": "lights",
  "version": "0.0.0",
  "private": true,
  "scripts": {
    "start": "sudo node ./bin/www"
  },
  "bin": {
    "lights": "./bin/www",
    "server": "./bin/server.js",
    "publish": "./bin/publish.js",
    "subscribe": "./bin/subscribe.js"
  },
  "dependencies": {
    "body-parser": "~1.15.1",
    "cookie-parser": "~1.4.3",
    "debug": "~2.2.0",
    "express": "~4.13.4",
    "fs": "0.0.1-security",
    "jade": "~1.11.0",
    "morgan": "~1.7.0",
    "mosca": "^2.2.0",
    "mqtt": "^2.0.1",
    "serialport": "^4.0.3",
    "serve-favicon": "~2.3.0"
  }
}

我们可以通过上面的方法,把我们所需要的包最终打入到我们的snap包中.另外我们也可以直接在我们的snapcraft.yam中定义所需要的安装包.开发者可以根据自己的需要进行选择.

snapcraft.yaml

name: shout
version: 0.52.0
summary: A self hosted web IRC client
description: This example is not really production quality
confinement: strict

apps:
  server:
    command: bin/shout --home $SNAP_DATA
    daemon: simple
    plugs: [network, network-bind]

parts:
  shout:
    plugin: nodejs
    node-packages:
      - shout

在上面,我们也定义了一个npm所需要安装的包shout.我们甚至可以运用node-engine来定义我们所需要的nodejs的版本:

  node:
    plugin: nodejs
    source: . 
    node-engine: 6.9.1

当然最重要的是指定我们所需要的执行文件.在上面的例程中,我们指定/bin/shout来运行我们的应用.更多关于nodejs plugin的介绍可以在我们的官方文档中介绍.

我们的nodejs应用可以在我们的Ubuntu Desktop 16.04上打包为snap应用,并测试.如果我们想把我们nodejs应用运用到我们的arm设备上,我们可以参阅我的文章"如何为树莓派安装Ubuntu Core并在Snap系统中进行编译".

好啦,打包一个nodejs为snap应用就是这么简单.你们会了吗?


作者:UbuntuTouch 发表于2016/11/11 9:31:10 原文链接
阅读:134 评论:0 查看评论

Read more
UbuntuTouch

在我先前的一个例程webcam中,我们的snapcraft.yaml显示如下:

name: webcam-app
version: "1.0"
summary: Webcam app for snappy ubuntu core
description: Exposes your webcam and access using a Ubuntu phone app called "webcamapp"
confinement: strict

apps:
  webcam:
    command: bin/webcamserv
    daemon: simple
    plugs: [camera,network,network-bind]
  sh:
    command: bin/sh

parts:
  cam:
    plugin: go
    source: https://github.com/liu-xiao-guo/webcamserv
    source-type: git
    stage-packages:
      - fswebcam
    filesets:
      fswebcam:
        - usr/bin/fswebcam
        - lib
        - usr/lib
      go-server:
        - bin/webcam*
    snap:
        - $fswebcam
        - $go-server
  glue:
    plugin: copy
    files:
      webcam: bin/webcam
      capture: bin/capture
      ./bin/sh: bin/sh
      


我们使用了copy plugin来拷贝我们的文件.如果我们编译我们的项目的话,你就会发现:

liuxg@liuxg:~/temp/webcam$ snapcraft
"grade" property not specified: defaulting to "stable"
DEPRECATED: The 'copy' plugin's functionality has been replaced by the 'dump' plugin, and it will soon be removed.

它建议我们使用dump plugin来替换.关于plugin的更多的技术细节,我们可以在http://snapcraft.io/docs/reference/plugins/地址找到.我们可以找到dump plugin的技术细节http://snapcraft.io/docs/reference/plugins/dump

This plugin just dumps the content from a specified source.
In the cases where dumping the content needs some mangling or organizing one would take advantage of the core functionalities available to plugins such as: filesets, stage, snap and organize.

在上面的网址,我们可以找到很多例程来参考.针对我们的例子,我们可以有如下的方案:

方案一:

我们把我们项目中的webcam及capture两个执行文件移到我们的bin目录下,这样整个的项目文件如下:

liuxg@liuxg:~/snappy/desktop/webcam$ tree
.
├── bin
│   ├── capture
│   ├── sh
│   └── webcam
└── snapcraft.yaml

接下来,我们通过修改我们的snapcraft.yaml:

  glue:
    plugin: dump
    source: .

通过这样的改动,它将把我们当前目录中所有的文件打包到我们包中的相应的目录中.

liuxg@liuxg:~/snappy/desktop/webcam/prime$ tree -L 3
.
├── bin
│   ├── capture
│   ├── sh
│   ├── webcam
│   └── webcamserv
├── command-sh.wrapper
├── command-webcam.wrapper
├── lib
│   └── x86_64-linux-gnu
│       ├── libexpat.so.1 -> libexpat.so.1.6.0
│       ├── libexpat.so.1.6.0
│       ├── libpng12.so.0 -> libpng12.so.0.54.0
│       └── libpng12.so.0.54.0
├── meta
│   └── snap.yaml
└── usr
    ├── bin
    │   └── fswebcam
    └── lib
        ├── gcc
        └── x86_64-linux-gnu


方案二:

如果我们不想把我们的webcam和capture移动到我们的bin目录下,那么我们怎么办呢?我们可以通过利用organize的方法来做.具体实践,我们可以参阅一个例程:

我们把我们的snapcraft.yaml的文件修改为:

  glue:
    plugin: dump
    source: .
    organize:
      webcam: bin/webcam
      capture: bin/capture
    stage:
      - bin/webcam
      - bin/capture
      - bin/sh
    snap:
      - bin/webcam
      - bin/capture
      - bin/sh

编译完我们的项目后,我们可以重新看到我们的包里的内容:

  glue:
    plugin: dump
    source: .
    organize:
      webcam: bin/webcam
      capture: bin/capture
    stage:
      - bin/webcam
      - bin/capture
      - bin/sh
    snap:
      - bin/webcam
      - bin/capture
      - bin/sh

在这里我们通过organize的方法把我们的文件移动到我们相应的目录中.当然在我们的上面的设计中,我们可以更进一步把我们的glue part精简为:

  glue:
    plugin: dump
    source: .
    organize:
      webcam: bin/webcam
      capture: bin/capture      

在这里我们除去了stage及snap的部分.只是对于我们来说,在这个项目中,我们不必要对这些文件做更进一步的treak.如果需要的话,我们可以通过stage及snap的方法来做.

我们也可以把上面的代码更进一步修改为:

glue:
    plugin: dump
    source: .
    organize:
      '*': bin/
      
这样我么可以把我们当前目录下的所有的文件安装到我们的bin目录下.





作者:UbuntuTouch 发表于2016/10/8 11:04:14 原文链接
阅读:346 评论:0 查看评论

Read more
UbuntuTouch

在这篇文章中,我们将介绍如何在snap系统中进行交叉汇编来把我们的应用编译并安装到目标机器中.我们知道目前Snap支持ARM及x86芯片.在我们的Classic 16.04的系统中,我们很容易地编译出我们想要的在x86上的snap文件,但是我们如何生产为ARM板生产相应的armhf的snap文件呢?

下面我们以树莓派2板子为例来描述是如何实现的.但是这里的教程适合于任何其它的Ubuntu Core所支持的板子,比如高通的snapdragon 410c板子.


1)为树莓派2/3安装snap系统


我们可在地址下载最新的树莓派2的image,并存于系统的~/Downloads目录中.如果你是使用树莓派3的话,那么你可以在地址下载image.你也可以在如下的地址找到所有最新的Ubuntu Core image:

http://cdimage.ubuntu.com/ubuntu-snappy/16.04/current/

如果你希望使用最新的daily build 镜像的话,可以使用连接:

http://cdimage.ubuntu.com/ubuntu-core/xenial/daily-preinstalled/current/

正式的发布软件可以在地址http://releases.ubuntu.com/ubuntu-core/16/找到.

如果大家有beaglebone的板子的话,那么你可以在地址http://people.canonical.com/~ogra/snappy/all-snaps/stable/current/找到最新的Ubuntu Core的软件.


整个image的大小约为161M.我们把我们的SD卡插入到我们电脑的MMC卡槽中,或插入到一个USB的adapter中.在进行拷贝image前,我们必须unmount我们的卡.然后,我们使用如下的命令来拷贝我们的image到卡中:


# Note: replace /dev/sdX with the device name of your SD card (e.g. /dev/mmcblk0, /dev/sdg1 ...)

xzcat ~/Downloads/ubuntu-core-16-pi2.img.xz | sudo dd of=/dev/sdX bs=32M
sync

注意这里的"ubuntu-core-16-pi2.img.xz"是我们下载后的image的名称.目前对于p3设备来说,默认的输出是通过串口,可以连接到我们的电脑上并进行查看启动的信息.大家可以买一个像链接所示的串口线.在我们的terminal中打入如下的命令:

$ sudo screen /dev/ttyUSB0 115200

这样就可以看到我们启动时的信息了.

当然,如果大家没有这样的连接线的话,我们可以通过修改如下的文件,并最终使得显示的结果输出到HDMI的显示器中:



上面的cmdline.txt里面的原始的内容为:

dwc_otg.lpm_enable=0 console=ttyAMA0,115200 console=tty0 elevator=deadline

我们把cmdline.txt中的文件的内容,修改为:

dwc_otg.lpm_enable=0 console=tty1 elevator=deadline

这样,我们就可以在HDMI的显示器上看到输出的结果了.通过键盘的操作,我们第一次完成Network的设置后,就可以在电脑上通过刚ssh的方式来进行登陆了.记住,我们必须提供launchpad的账号信息来完成设置的动作.

等上面的操作完成后,拔出我们的SD卡,并插入到我们的树莓派的SD卡插槽中.然后启动我们的树莓派.第一次的启动的时间比较长,需要耐心等待.



注意:这里的image名字"all-snaps-pi2.img.xz"可能会跟着版本的变化而发生改变.请根据你下载的具体的文件来替换.这里的sdX需要换成我们卡的设备号,比如在我们的电脑的MMC插槽中就是mmcblk0:



在我们刷卡时,我们可以使用sudo fdisk -l,或lsblk来获取我们的设备的代码.注意在我们执行命令时,命令行中的"/dev/sdX"可以是/dev/sdb而不是/dev/sdb1,可能是 /dev/mmcblk0 而不是 /dev/mmcblk0p1.


2)连接我们的树莓派设备


如果大家有路由器的话,建议大家把树莓派和自己的电脑同时连接到同一个路由器上.我们可以参阅文章"如何在装上Snappy Ubuntu的树莓派上启动WiFi"来找到树莓派上的IP地址.

如果我们的树莓派中已经安装了snapweb应用,我们可以通过如下的方式看到:

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
pi2-kernel   4.4.0-1021-3  14   canonical  -
pi3          16.04-0.4     5    canonical  -
piglow-app   1.0           x2              devmode
sensortag    1.0           x3              devmode
snapweb      0.21.1        21   canonical  -
ubuntu-core  16.04.1       760  canonical  -
webcam-app   1.0           x1              devmode

如果在你的系统还没有发现snapweb已经安装,我们可以使用如下的命令来安装我们的snapweb:

$ sudo snap install snapweb

我们可以通过如下的方式找到它是否运行正常:

liu-xiao-guo@localhost:~$ systemctl status -l snap.snapweb.snapweb
● snap.snapweb.snapweb.service - Service for snap application snapweb.snapweb
   Loaded: loaded (/etc/systemd/system/snap.snapweb.snapweb.service; enabled; vendor preset: enabled
   Active: active (running) since Mon 2016-09-12 07:49:32 UTC; 1 months 5 days ago
 Main PID: 1793 (snapweb)
   CGroup: /system.slice/snap.snapweb.snapweb.service
           └─1793 /snap/snapweb/21/bin/arm-linux-gnueabihf/snapweb

我们可以看到它在正常运行.如果是这样的话,我们可以通过如下的方式来在我们的host电脑上打入如下的指令:

liuxg@liuxg:~$ ping snapweb.local
PING snapweb.local (10.42.0.140) 56(84) bytes of data.
64 bytes from 10.42.0.140: icmp_seq=1 ttl=64 time=0.539 ms
64 bytes from 10.42.0.140: icmp_seq=2 ttl=64 time=0.534 ms
64 bytes from 10.42.0.140: icmp_seq=3 ttl=64 time=0.580 ms
^C
--- snapweb.local ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2001ms
rtt min/avg/max/mdev = 0.534/0.551/0.580/0.020 ms

我们可以从上面看到我们所连的设备的IP地址.

一旦得到树莓派的IP地址,我们就可以通过如下的命令来完成和树莓派的ssh连接.在电脑上打入如下的命令:

$ ssh <your-launchpad-account-name>@your_raspberry_pi_ip_address

特别值得注意的是,如果是使用最新的Ubuntu Core的软件的话,这里的ubuntu应改为自己的launchpad的用户名.对于我的情况是liu-xiao-guo@your_raspberry_pi_ip_address.



一旦我们连接上我们的树莓派,我们可以参照文章"安装snap应用到Ubuntu 16.4桌面系统"来安装和检查我们的snap系统,比如:





3)交叉编译我们的应用



在这一节中,我们来展示如何把我们的应用进行交叉编译,并最终形成可以在我们的树莓派上可以运行的snap包.

首先我们在树莓派中安装如下的叫做"classic"的应用:

$ sudo snap install classic --devmode --edge

然后,我们打入如下的命令:

$ sudo classic.create 
$ sudo classic.shell (or "sudo classic" depending on your version)



我们再打入如下的命令来更新我们的系统:

$ sudo apt-get update



我们可以把git安装到系统中:

$ sudo apt install snapcraft git-core build-essential

这样我们就安装好了我们的系统,我们可以用这里的环境来交叉编译我们的任何一个snap应用.编译后的snap包就可以直接在我们的树莓派上直接运行:




编译完我们的应以后,我们可以直接在我们的shell环境中安装我们的应用:




我们通过如下的方法来安装我们的应用:

$ sudo snap install webcam-webui_1_armhf.snap --devmode --dangerous

这里我们采用了--devmode,也就是说我们让我们的应不受任何的安全机制的限制,就像我们以前的Ubuntu桌面上的应用一样.在以后的章节中,我们必须通过interface来连接我们的plug及slot.camera的plug目前还没有在树莓派的image中.





至此,我们已经把我们的项目webcam-webui编译为我们树莓派可以使用的snap了.

作者:UbuntuTouch 发表于2016/8/25 11:45:03 原文链接
阅读:902 评论:2 查看评论

Read more
UbuntuTouch

[原]ubuntu core 开发介绍 (视频)

在这个视频里介绍了Ubuntu Core的基本知识.同时也介绍了Ubuntu Core上的应用开发基本流程.


视频地址:http://v.youku.com/v_show/id_XMTgyMjkwNzIwNA==.html

视频:Ubuntu Core introduction in English

作者:UbuntuTouch 发表于2016/11/17 16:54:05 原文链接
阅读:187 评论:0 查看评论

Read more