Canonical Voices

facundo

Muchas películas nuevas


Se nota que le dediqué tiempo a la series, porque no vi tantas películas estos meses.

  • 10 Rules for Sleeping Around: -0. Una comedia de elaboradísimo enredos, bastante divertidas por partes, pero muy, muy mala.
  • And So It Goes: -0. Comedia sencilla, medio touchy, pero nada que termine de valer la pena.
  • Jupiter Ascending: +0. Mucha acción, tiros y persecuciones, más una chica y un chico, mucho lugar común, bah... pero estuvo interesante, especialmente por la mezcla de iconografías y explicaciones pseudocientíficas que daban :). Notable colección de actores conocidos, también.
  • Kingsman: The Secret Service: +0. Como una de James Bond pero en joda. Divertida, pasatista.
  • Kon-Tiki: +0. El hombre y sus obsesiones. Gran historia, maravilloso que sea verdad :) Muy bien filmada, aunque un toque lenta en algunos momentos.
  • Only You: +0. Comedia romanticona de mitad de los 90, deberían saber de lo que hablo. Así y todo está linda: Marisa Tomei y Robert Downey Jr. en Italia :)
  • Perfect Sense: +0. Me encanta como muestra lo que pasaría en la situación hipotética que describe, más allá que no trata de explicarla, me encanta como está filmada, actuada.
  • Radio Free Albemuth: -1. Con una trama rara, muy lenta, poco creíble, no me llevaba a nada, a duras penas terminé de verla.
  • Reservoir Dogs: +1. Un clásico absoluto, un Tarantino de pura cepa. Impecable.
  • Salmon Fishing in the Yemen: +1. Una hermosa historia, con el tipo de humor que me gusta, con unos paisajes increibles y buenas actuaciones.
  • Sleeping with Other People: +0. Una comedia romanticona divertida.
  • Star Wars: Episode VII - The Force Awakens: +1. Bien hecha, bien contada, con mil guiños, y con un detalle interesante (teniendo en cuenta que es una película, y que es de ciencia ficción): creible.
  • The Intern: +0. Es una comedia simpática, bien llevada, buenas actuaciones y con ritmo.
  • The Signal: -0. A nivel argumento con algo de sentido en una parte, pero demasiado volado todo alrededor, y el resto de la peli que simplemente no suma.
  • Transcendence: +0. Con muchas partes demasiado fantasiosas, pero el núcleo del asunto da para pensar bastante; muy interesante para disparar puntos de vista.


Por otro lado, aparecieron toneladas de nuevas para ver. Me hice un scriptcito que va a una página en YouTube de FilmTrailerZone, donde hay una lista de muchos trailers, y te los empieza a listar hasta que llega a lo que había visto en la última corrida. Te da unos datos del trailer, y vos le indicás si querés que lo baje, o no, o pare de ofrecer trailers. Luego los baja. Todo por linea de comandos, claro.

Bueno, decía, encima que me hice ese script y estoy viendo más trailers (lo que redunda en más pelis anotadas), en esta lista hay algunas recomendaciones que me hicieron, más un par de títulos que saqué de alguna nota en un diario o revista.

  • 10 Cloverfield Lane (2016; Drama, Horror, Mystery, Sci-Fi, Thriller) Soon after leaving her fiancé Michelle is involved in a car accident. She awakens to find herself sharing an underground bunker with Howard and Emmett. Has she been saved from an apocalyptical event as Howard & Emmett tell her or are there other motives for her being held against her will? [D: Dan Trachtenberg; A: John Goodman, Mary Elizabeth Winstead, John Gallagher Jr.]
  • 400 Days (2015; Mystery, Sci-Fi, Thriller) "400 Days" centers on four astronauts sent on a simulated mission to a distant planet to test the psychological effects of deep space travel. Locked away for 400 days, the crew's mental state begins to deteriorate when they lose all communication with the outside world. Forced to exit the ship, they discover that this mission may not have been a simulation after all. [D: Matt Osterman; A: Brandon Routh, Dane Cook, Caity Lotz]
  • Approaching the Unknown (2016; Drama, Sci-Fi, Thriller) Captain William Stanaforth is on a one-way solo mission to take the first steps in colonizing Mars. Like all pioneers throughout history, Stanaforth will face insurmountable odds and life and death decisions as he rockets bravely through space. [D: Mark Elijah Rosenberg; A: Mark Strong, Luke Wilson, Sanaa Lathan]
  • Boyhood (2014; Drama) Filmed over 12 years with the same cast, [D: Richard Linklater; A: Ellar Coltrane, Patricia Arquette, Elijah Smith]
  • Captain America: Civil War (2016; Action, Adventure, Sci-Fi, Thriller) With many people fearing the actions of super heroes, the government decides to push for the Anti-Hero Registration Act, a law that limits a heroes actions. This results in a division in The Avengers. Iron Man stands with this Act, claiming that their actions must be kept in check otherwise cities will continue to be destroyed, but Captain America feels that saving the world is daring enough and that they cannot rely on the government to protect the world. This escalates into an all-out war between Team Iron Man (Iron Man, Black Panther, Vision, Black Widow, War Machine, and Spiderman) and Team Captain America (Captain America, Bucky Barnes, Falcon, Sharon Carter, Scarlett Witch, Hawkeye, and Ant Man) while a new villain emerges [D: Anthony Russo, Joe Russo; A: Chris Evans, Robert Downey Jr., Scarlett Johansson]
  • Captain Fantastic (2016; Drama) In the forests of the Pacific Northwest, a father devoted to raising his six kids with a rigorous physical and intellectual education is forced to leave his paradise and enter the world, challenging his idea of what it means to be a parent. [D: Matt Ross; A: Viggo Mortensen, George MacKay, Samantha Isler]
  • Creative Control (2015; Drama, Sci-Fi) In near future Brooklyn, an ad executive uses a new Augmented Reality technology to conduct an affair with his best friend's girlfriend...sort of. [D: Benjamin Dickinson; A: Benjamin Dickinson, Nora Zehetner, Dan Gill]
  • Criminal (2016; Action, Crime, Drama, Mystery, Sci-Fi, Thriller) Bill Pope (Ryan Reynolds) is a CIA agent on a mission in London tracking down a shadowy hacker nicknamed "The Dutchman." When he gets mysteriously ambushed and killed, an experimental procedure is used to transfer his memories into dangerous ex-convict Jericho Stewart (Kevin Costner). When he wakes up with the CIA agent's memories, his mission is to find The Dutchman and eliminate him before the hacker launches ICBM's and starts World War III. But complications soon arise and the mission turns personal. [D: Ariel Vromen; A: Kevin Costner, Gary Oldman, Tommy Lee Jones]
  • Al final del túnel (2016; Crime, Thriller) A paraplegic computer engineer that moves in a wheelchair and works in his basement starts hearing noises and voices of bank-robbers. [D: Rodrigo Grande; A: Leonardo Sbaraglia, Pablo Echarri, Clara Lago]
  • High-Rise (2015; Drama) Life for the residents of a tower block begins to run out of control. [D: Ben Wheatley; A: Tom Hiddleston, Jeremy Irons, Sienna Miller]
  • Jason Bourne (2016; Action, Thriller) Jason Bourne, now remembering who he truly is, tries to uncover hidden truths about his past. [D: Paul Greengrass; A: Alicia Vikander, Matt Damon, Julia Stiles]
  • Kill Command (2016; Action, Horror, Sci-Fi) Kill Command is a sci-fi action thriller set in a near future, technology-reliant society that pits man against killing machines. Against this backdrop an elite army unit is helicoptered to a remote, off-the-grid island training facility. What starts out as a simple training exercise for Captain Bukes and his tight-knit unit, descends into a terrifying battle to the death, as the marines discover the island is overrun by an enemy that transcends the human concept of evil. [D: Steven Gomez; A: Vanessa Kirby, Thure Lindhardt, David Ajala]
  • Koblic (2016; Drama, Thriller) 1977, during the days of the Argentinian Dictatorship. A former pilot and captain of the Argentinian Navy disobeys an order and becomes a fugitive in order to survive. He chooses to hide in a small town in the south of the country, where his presence will catch the attention of the unscrupulous and violent local marshal. [D: Sebastián Borensztein; A: Ricardo Darín, Oscar Martínez, Inma Cuesta]
  • Manhattan Nocturne (2016; Crime, Drama, Mystery, Thriller) Based on Colin Harrison's acclaimed novel Manhattan Nocturne (a New York Times Notable Book of the Year), MANHATTAN NIGHT tells the story of Porter Wren (Adrien Brody), a New York City tabloid writer with an appetite for scandal. On the beat he sells murder, tragedy and anything that passes for the truth. At home he is a model family man, devoted to his loving wife (Jennifer Beals). But when a seductive stranger (Yvonne Strahovski) asks him to dig into the unsolved murder of her filmmaker husband Simon (Campbell Scott), he can't resist. In this modern version of a classic film noir, we follow Porter as he is drawn into a very nasty case of sexual obsession and blackmail - one that threatens his job, his marriage, and his life. MANHATTAN NIGHT will be released by Lionsgate Premiere in theaters and On Demand May 20, 2016. Lionsgate Premiere, Grindstone Entertainment Group and 13 Films present in association with Sparkle Roll Media Corporation and Big Indie Pictures a production of Fable House, Untravelled Worlds and DeCubellis Films. [D: Brian DeCubellis; A: Yvonne Strahovski, Adrien Brody, Jennifer Beals]
  • Miss Peregrine's Home for Peculiar Children (2016; Adventure, Fantasy) When Jacob discovers clues to a mystery that spans different worlds and times, he finds a magical place known as Miss Peregrine's Home for Peculiar Children. But the mystery and danger deepen as he gets to know the residents and learns about their special powers... and their powerful enemies. Ultimately, Jacob discovers that only his own special "peculiarity" can save his new friends. [D: Tim Burton; A: Eva Green, Samuel L. Jackson, Kim Dickens]
  • Nina (2016; Biography, Drama, Music) The story of the late jazz musician and classical pianist Nina Simone including her rise to fame and relationship with her manager Clifton Henderson. [D: Cynthia Mort; A: Zoe Saldana, David Oyelowo, Kevin Mambo]
  • Precious Cargo (2016; Action, Crime, Drama, Thriller) After a botched heist, Eddie (Bruce Willis), a murderous crime boss, hunts down the seductive thief Karen (Claire Forlani) who failed him. In order to win back Eddie's trust, Karen recruits her ex-lover and premier thief Jack (Mark-Paul Gosselaar) to steal a cargo of rare precious gems. But when the job goes down, allegiances are betrayed and lines are crossed as Jack, Karen, and Eddie face off in a fateful showdown. Lionsgate Premiere will release the action thriller in theaters and on demand on April 22, 2016. [D: Max Adams; A: Mark-Paul Gosselaar, Bruce Willis, Claire Forlani]
  • Suicide Squad (2016; Action, Adventure, Fantasy, Sci-Fi, Thriller) A secret government agency run by Amanda Waller, named A.R.G.U.S creates a task force comprising super villains, the "Suicide Squad". They are assigned to execute dangerous tasks in exchange for shorter prison sentences. [D: David Ayer; A: Margot Robbie, Cara Delevingne, Scott Eastwood]
  • The Lobster (2015; Comedy, Drama, Romance, Sci-Fi) A love story set in a dystopian near future where single people are arrested and transferred to a creepy hotel. There they are obliged to find a matching mate in 45 days. If they fail, they are transformed into an animal and released into the woods. [D: Yorgos Lanthimos; A: Jacqueline Abrahams, Roger Ashton-Griffiths, Jessica Barden]
  • The Driftless Area (2015; Comedy, Drama, Mystery, Romance) Pierre Hunter (Anton Yelchin), a bartender with unyielding optimism, returns to his tiny hometown after his parents' death. When he falls for the enigmatic Stella (Zooey Deschanel), Pierre is unknowingly pulled into a cat-and-mouse game that involves a duffel bag full of cash, a haphazard yet determined criminal (John Hawkes), and a mystery that will determine all of their fates. With Alia Shawkat, Frank Langella, Aubrey Plaza, and Ciarán Hinds. Zachary Sluser's film, based on the novel by Tom Drury, is a contemporary fable about the ways we struggle to control time and fate in a possibly predetermined universe. [D: Zachary Sluser; A: Anton Yelchin, Zooey Deschanel, John Hawkes]
  • The Huntsman: Winter's War (2016; Action, Adventure, Drama, Fantasy) Eric and fellow warrior Sara, raised as members of ice Queen Freya's army, try to conceal their forbidden love as they fight to survive the wicked intentions of both Freya and her sister Ravenna. [D: Cedric Nicolas-Troyan; A: Chris Hemsworth, Charlize Theron, Jessica Chastain]
  • The Man Who Knew Infinity (2015; Biography, Drama) Growing up poor in Madras, India, Srinivasa Ramanujan Iyengar earns admittance to Cambridge University during WWI, where he becomes a pioneer in mathematical theories with the guidance of his professor, G.H. Hardy. [D: Matt Brown; A: Jeremy Irons, Dev Patel, Malcolm Sinclair]
  • La belle saison (2015; Drama, Romance) There was little chance, in the year 1971, that Carole, a Paris Spanish teacher and feminist militant, would ever meet Delphine, the daughter of a couple of Limousin farmers. But they did meet and not only did they come across each other but they fell passionately in love as well. Unfortunately, Delphine's father fell victim to a stroke, and the young woman had no other choice but to go back home to help her mother run the family farm. Carole, who was so smitten by Delphine, couldn't stand the estrangement and decided to join her lover at the farm. But could feminism and lesbianism easily be transferred to the countryside and its standards of the time...? [D: Catherine Corsini; A: Cécile De France, Izïa Higelin, Noémie Lvovsky]
  • Doctor Strange (2016; Action, Adventure, Fantasy) After his career is destroyed, a brilliant but arrogant and conceited surgeon gets a new lease on life when a sorcerer takes him under her wing and trains him to defend the world against evil. [D: Scott Derrickson; A: Rachel McAdams, Tilda Swinton, Benedict Cumberbatch]
  • Hush (2016; Horror, Thriller) A deaf writer who retreated into the woods to live a solitary life must fight for her life in silence when a masked killer appears at her window. [D: Mike Flanagan; A: John Gallagher Jr., Kate Siegel, Michael Trucco]
  • The Girl on the Train (2016; Mystery, Thriller) The Girl on the Train is the story of Rachel Watson's life post-divorce. Every day, she takes the train in to work in London, and every day the train passes by her old house. The house she lived in with her husband, who still lives there, with his new wife and child. As she attempts to not focus on her pain, she starts watching a couple who live a few houses down -- Megan and Scott Hipwell. She creates a wonderful dream life for them in her head, about how they are a perfect happy family. And then one day, as the train passes, she sees something shocking, filling her with rage. The next day, she wakes up with a horrible hangover, various wounds and bruises, and no memory of the night before. She has only a feeling: something bad happened. Then come the TV reports: Megan Hipwell is missing. Rachel becomes invested in the case and trying to find out what happened to Megan, where she is, and what exactly she herself was up to that same night Megan went missing. [D: Tate Taylor; A: Emily Blunt, Haley Bennett, Luke Evans]


Finalmente, el conteo de pendientes por fecha:

(Sep-2010)    2   1
(Dic-2010)    5   1
(Abr-2011)   22  17   4
(Ago-2011)   11  11  11   4
(Ene-2012)   17  17  17  11   3
(Jul-2012)   15  15  15  14  11
(Nov-2012)   11  11  11  11  11   6
(Feb-2013)   19  16  15  14  14   8   2
(Jun-2013)   19  18  16  15  15  15  11   2
(Sep-2013)       18  18  18  18  17  16   8
(Dic-2013)           14  14  12  12  12  12   4
(Abr-2014)                9   9   8   8   8   3
(Jul-2014)                   10  10  10  10  10   5
(Nov-2014)                       24  22  22  22  22
(Feb-2015)                           13  13  13  13
(Jun-2015)                               16  16  15
(Dic-2015)                                   21  19
(May-2016)                                       26
Total:      121 125 121 110 103 100  94  91  89 100

Read more
Nicholas Skaggs

Getting your daily dose of juju

One of the first pain points I've been attempting to help smooth out was how Juju is packaged and consumed. The Juju QA Team have put together a new daily ppa you can use, dubbed the Juju Daily ppa. It contains the latest blessed builds from CI testing. Installing this ppa and upgrading regularly allows you to stay in sync with the absolute latest version of Juju that passes our CI testing.

Naturally, this ppa is intended for those who like living on the edge, so it's not recommended for production use. If you find bugs, we'd love to hear about them!

To add the ppa, you will need to add ppa:juju/daily to your software sources.

sudo add-apt-repository ppa:juju/daily

Do be aware that adding this ppa will upgrade any version of Juju you may have installed. Also note this ppa contains builds without published streams, so you will need to generate or acquire streams on your own. For most users, this means you should pass --upload-tools during the bootstrap process. However you may also pass the agent-metadata-url and agent-stream as config options. See the ppa description and simplestreams documentation for more details.

Finally, should you wish to revert to a stable version of Juju, you can use the ppa-purge tool to remove the daily ppa and the installed version of Juju.

I'd love to hear your feedback, and encourage you to give it a try.

Read more
Steph Wilson

In the coming months we will be rolling out the new app design guidelines, which will give you the latest toolkit best practices and patterns so you can make your own convergent app for Ubuntu.

Why do we need design guidelines?

The guidelines are a big part of communicating design practices and philosophy to the community and the wider audience. Without it, we wouldn’t have consistency in our design language and people who want to develop or design on Ubuntu wouldn’t be able to maintain the identity we so love.

Throughout the guide you will see the rationale behind our design values through the development our Suru visual language and philosophy.

What’s to come?

We are going to start releasing parts of the Building Blocks section first, which contains all the components you need to start building your application.

Back in November last year we took a look at defining styles for the guide e.g. how to illustrate examples of best practice. The guide will feature UI examples of how the component will look inside an app across screen sizes, as well as breaking them apart so you can see what goes where and how.

Here’s a sneak peak…

Screen Shot 2016-05-03 at 09.50.13

Screen Shot 2016-05-11 at 14.35.25

After user testing on the current design guide, users said it was hard to find content as it was lost in the large amounts of text, so we have given the guide a bit of a nip and tuck by balancing visuals and text accordingly.

All new sections

As well as ‘Get Started’, ‘Patterns’ and ‘Building blocks’ we will now introduce: ‘System integration’ and ‘Resources’ to the list, as well as an overview page for each section highlighting key areas.

System integration will feature the number of a touchpoints your app can plug into inside the Ubuntu operating system shell, such as the launcher, notifications and indicators. For example, you can add a count emblem over your app icon inside the Launcher to show unread messages or available updates.

The ‘Resources’ section will feature downloads such as grid layout templates, the new colour palette and our icon set.

Over to you…

We can’t wait to see your app designs and hope that our design practices will help you achieve a great user experience on Ubuntu.

Read more
liam zheng

5月7日,Ubuntu黑客松北京站在微软亚太研发总部正式开启,北京也出现了难见的晴天。北京站黑客松活动也如晴天一样,吸引了很多想挑战自己并富有创意的开发者到场一起hack。去年Ubuntu黑客松北京站是Ubuntu黑客松在中国的第一站,超高人气的参与度也为2016年黑客松活动打下了坚实基础。

5月7日,Ubuntu黑客松北京站在微软亚太研发总部正式开启,北京也出现了难见的晴天。北京站黑客松活动也如晴天一样,吸引了很多想挑战自己并富有创意的开发者到场一起hack。去年Ubuntu黑客松北京站是Ubuntu黑客松在中国的第一站,超高人气的参与度也为2016年黑客松活动打下了坚实基础。

开发创意的小船不翻,Ubuntu黑客松北京站的魔力不仅吸引了北京本地开发者、高校在校生还吸引了远从其他省市甚至是美国回来的开发者。他们在36个小时里,用创意、团队、超强的开发实力展现了凌晨四点的坚持和神奇。并且,现场还有特意赶来正在学开发的初中生,一探Ubuntu手机开发平台的魅力。

Ubuntu黑客松并不是单纯码代码的活动,而是一场充满学习交流、笑声的聚会。初次接触的开发者在得到现场工程师的指导后能快速解决碰到的问题,熟悉的开发者也会给与其他开发者帮助和支持。更重要的是,Ubuntu的工程师不止会帮助开发者解决码代码问题,还能与大家交流更多生活的经验,开发和谈笑风生两不误,硕果累累的开发成果就是有力的证明。

 

与往期黑客松活动不同的是,本次黑客松除了手机应用开发,特意加入了Convergence应用开发内容。现场共有8个小组参赛,码出了9个作品。游戏、创意原生应用一应俱全,还能在最新的BQ M10 Ubuntu版平板上运行。下面进入应用介绍环节:

Demo 1:死生忍者和疯狂赛车,基于HTML5的游戏,可玩性非常强,界面设计精美,可在Ubuntu手机、平板上流畅运行。

 

Demo 2:Amap,基于Scope的地图应用,使用高德地图API,可实现搜索地理位置,选择公交、步行的导航方式。

Demo 3:汤姆猫,最为熟悉和非常有趣的语音互动游戏。

Demo 4:水果侦探,由团队设计、开发的独立游戏,拥有排名机制,拥有很好的交互性和游戏性。

Demo 5:Ubuner,基于Scope的打车服务应用,可通过搜索地理位置,呼叫Uber司机使用打车服务。

Demo 6:Tuner ,原生应用,配合Ubuntu手机可为尤克里里、吉他调音,实用价值非常大。

Demo 7:Ubuntu 2048,数字游戏,界面上加入操作特效,并拥有排名机制。

Demo 8:Redheart,拥有AI功能的红心大战游戏,在平板上可流畅运行,游戏难度可调。

 

Ubuntu黑客松北京站在硕果累累的颁奖中落下帷幕,这也是2016年最为精彩的一次Hack,而北京站只是一个开始。下一次精彩的Hack还将在不久后与大家再度相见。

Read more
Robie Basak

Meeting information

Agenda

Minutes

Review ACTION points from previous meeting

The discussion about “Review ACTION points from previous meeting” started at 16:00.

  • No actions from previous meeting.

Development Release

The discussion about “Development Release” started at 16:00.

Assigned merges/bugwork (rbasak)

The discussion about “Assigned merges/bugwork (rbasak)” started at 16:02.

  • rbasak has triaged some bugs, tagging some “bitesize”, and advised prospective Ubuntu developers to take a look at these.

Server & Cloud Bugs (caribou)

The discussion about “Server & Cloud Bugs (caribou)” started at 16:05.

  • Squid, Samba and MySQL bugs noted; all are in progress. Nothing else in particular to bring up.

Weekly Updates & Questions for the QA Team

The discussion about “Weekly Updates & Questions for the QA Team” started at 16:06.

  • No questions to or from the QA team
  • jgrimm noted that the Canonical Server Team currently have an open QA position and invited applications and recommendations.

Weekly Updates & Questions for the Kernel Team (smb, sforshee, arges)

The discussion about “Weekly Updates & Questions for the Kernel Team (smb, sforshee, arges)” started at 16:07.

  • No questions to/from the kernel team

Upcoming Call For Papers

The discussion about “Upcoming Call For Papers” started at 16:10.

  • No upcoming CfPs of note

Ubuntu Server Team Events

The discussion about “Ubuntu Server Team Events” started at 16:11.

  • No upcoming events of note

Open Discussion

The discussion about “Open Discussion” started at 16:11.

Announce next meeting date, time and chair

The discussion about “Announce next meeting date, time and chair” started at 16:18.

  • The next meeting will be at Tue 17 May 16:00:00 UTC 2016. jamespage will chair.

Generated by MeetBot 0.1.5 (http://wiki.ubuntu.com/meetingology)

Read more
Michael Hall

screenshot20160506_103257823During the Ubuntu Online Summit last week, my colleague Daniel Holbach came up with what he called a “10 day challenge” to some of the engineering manager directing the convergence work in Ubuntu. The idea is simple, try and use only the Unity 8 desktop for 10 working days (two weeks). I thought this was a great way to really identify how close it is to being usable by most Ubuntu users, as well as finding the bugs that cause the most pain in making the switch. So on Friday of last week, with UOS over, I took up the challenge.

Below I will discuss all of the steps that I went through to get it working to my needs. They are not the “official” way of doing it (there isn’t an official way to do all this yet) and they won’t cover every usage scenario, just the ones I faced. If you want to try this challenge yourself they will help you get started. If at any time you get stuck, you can find help in the #ubuntu-unity channel on Freenode, where the developers behind all of these components are very friendly and helpful.

Getting Unity 8

To get started you first need to be on the latest release of Ubuntu. I am using Ubuntu 16.04 (Xenial Xerus), which is the best release for testing Unity 8. You will also need the stable-phone-overlay PPA. Don’t let the name fool you, it’s not just for phones, but it is where you will find the very latest packages for Mir, Unity 8, Libertine and other components you will need. You can install is with this command:

sudo add-apt-repository ppa:ci-train-ppa-service/stable-phone-overlay

Then you will need to install the Unity 8 session package, so that you can select it from the login screen:

sudo apt install unity8-desktop-session-mir

When I did this there was a bug in the libhybris package that was causing Mir to try and use some Android stuff, which clearly isn’t available on my laptop. The fix wasn’t yet in the PPA, so I had to take the additional step of installing a fix from our continuous integration system (Note: originally the command below used silo 53, but I’ve been told it is now in silo 31). If you get a black screen when trying to start your Unity 8 session, you probably need this too.

sudo apt-get install phablet-tools phablet-tools-citrain
citrain host-upgrade 031

This was enough to get Unity 8 to load for me, but all my apps would crash within a half second of being launched. It turned out to be a problem with the cgroups manager, specifically the cgmanager service was disabled for me (I suspect this was leftover configurations from previous attempts at using Unity 8). After re-enabling it, I was able to log back into Unity 8 and start using apps!

sudo systemctl enable cgmanager

Essential Core Apps

The first thing you’ll notice is that you don’t have many apps available in Unity 8. I had probably more than most, having installed some Ubuntu SDK apps natively on my laptop already. If you haven’t installed the webbrowser-app already, you should. It’s in the Xenial archive and the PPA you added above, so just

sudo apt install webbrowser-app

But that will only get you so far. What you really need are a terminal and file manager. Fortunately those have been created as part of the Core Apps project, you just need to install them. Because the Ubuntu Store wasn’t working for me (see bottom of this post) I had to manually download and install them:

sudo click install --user mhall com.ubuntu.filemanager_0.4.525_multi.click
sudo click install --user mhall com.ubuntu.terminal_0.7.170_multi.click

If you want to use these apps in Unity 7 as well, you have to modify their .desktop files located in ~/.local/share/applications/ and add the -x flag after aa-exec-click, this is because by default it prevents running these apps under X11 where they won’t have the safety of confinement that they get under Mir.

The file manager needed a bit of extra effort to get working. It contains many Samba libraries that allow it to access windows network shares, but for some reason the app was looking for them in the wrong place. As a quick and dirty hack, I ended up copying whatever libraries it needed from /opt/click.ubuntu.com/com.ubuntu.filemanager/current/lib/i386-linux-gnu/ to /usr/lib/i386-linux-gnu/samba/. It’s worth the effort, though, because you need the file manager if you want do things like upload files through the webbrowser.

Using SSH

IRC is a vital communication tool for my job, we all use it every day. In fact, I find it so important that I have a remote client that stays connected 24/7, which I connect to via ssh. Thanks to the Terminal core app, I have quick and easy access to that. But when I first tried to connect to my server, which uses public-key authentication (as they all should), my connection was refused. That is because the Unity 8 session doesn’t run the ssh-agent service on startup. You can start it manually from the terminal:

ssh-agent

This will output some shell commands to setup environment variables, copy those and paste them right back into your terminal to set them. Then you should be able to ssh like normal, and if your key needs a passphrase you will be prompted for it in the terminal rather than in a dialog like you get in Unity 7.

Getting traditional apps

Now that you’ve got some apps running natively on Mir, you probably want to try out support for all of your traditional desktop apps, as you’ve heard advertised. This is done by a project called Libertine, which creates an LXC container and XMir to keep those unconfined apps safely away from your new properly confined setup. The first thing you will need to do is install the libertine packages:

apt-get install libertine libertine-scope

screenshot20160506_105035760Once you have those, you will see a Libertine app in your Apps scope. This is the app that lets you manage your Libertine containers (yes, you can have more than one), and install apps into them. Creating a new container is simply a matter of pressing the “Install” button. You can give it a name of leave it blank to get the default “Xenial”.

screenshot20160506_105618896Once your container is setup, you can install as many apps into it as you want, again using the Libertine container manager. You can even use it to search the archives if you don’t know the exact package name. It will also install any dependencies that package needs into your Libertine container.

screenshot20160506_105942480Now that you have your container setup and apps installed into it, you are ready to start trying them out. For now you have to access them from a separate scope, since the default Apps scope doesn’t look into Libertine containers. That is why you had to install the libertine-scope package above. You can find this scope by clicking on the Dash’s bottom edge indicator to open the Scopes manger, and selecting the Legacy Applications Scope. There you will see launchers for the apps you have installed.

Libertine uses a special container manager to launch apps. If it isn’t running, as was the case for me, your legacy app windows will remain black. To fix that, open up the terminal and manually start the manager:

initctl --session start libertine-lxc-manager

Theming traditional apps

screenshot20160506_122713187By default the legacy apps don’t look very nice. They default to the most basic of themes that look like you’ve time-traveled back to the mid-1990s, and nobody wants to do that. The reason for this is because these apps (or rather, the toolkit they use) expect certain system settings to tell them what theme to use, but those settings aren’t actually a dependency of the application’s package. They are part of a default desktop install, but not part of the default Libertine image.

screenshot20160506_112259969I found a way to fix this, at least for some apps, by installing the light-themes and ubuntu-settings packages into the Libertine container. Specifically it should work for any Gtk3 based application, such as GEdit. It does not, however, work for apps that still use the Gtk2 toolkit, such as Geany. I have not dug deeper to try and figure out how to fix Gtk2 themes, if anybody has a suggestion please leave it in the comments.

What works

It has been a couple of months since I last tried the Unity 8 session, back before I upgraded to Xenial, and at that time there wasn’t much working. I went into this challenge expecting it to be better, but not by much. I honestly didn’t expect to spend even a full day using it. So I was really quite surprised to find that, once I found the workarounds above, I was not only able to spend the full day in it, but I was able to do so quite easily.

screenshot20160509_121832656Whenever you have a new DE (which Unity 8 effectively is) and the latest UI toolkit (Qt 5) you have to be concerned about performance and resource use, and given the bleeding-edge nature of Unity 8 on the desktop, I was expecting to sacrifice some CPU cycles, battery life and RAM. If anything, the opposite was the case. I get at least as many hours on my battery as I do with Unity 7, and I was using less than half the RAM I typically do.

screenshot20160509_103139434Moreover, things that I was expecting to cause me problems surprisingly didn’t. I was able to use Google Hangouts for my video conferences, which I knew had just been enabled in the browser. But I fully expected suspend/resume to have trouble with Mir, given the years I spent fighting it in X11 in the past, but it worked nearly flawlessly (see below). The network indicator had all of my VPN configurations waiting to be used, and they worked perfectly. Even pulse audio was working as well as it did in Unity 7, though this did introduce some problems (again, see below). It even has settings to adjust the mouse speed and disable the trackpad when I’m typing. Most imporantly, nearly all of the keyboard shortcuts that have become subconcious to me in Unity 7 are working in Unity 8.

Most importantly, I was able to write this blog post from Unity 8. That includes taking all of the screenshots and uploading them to WordPress. Switching back and forth between my browser and my notes document to see what I had done over the last few days, or going to the terminal to verify the commands I mentioned above.

What doesn’t

Of course, it wasn’t all unicorns and rainbows, Unity 8 is still very bleeding edge as a desktop shell, and if you want to use it you need to be prepared for some pain. None of it has so far been bad enough to stop me, but your mileage may vary.

One of the first minor pain-points is the fact that middle-click doesn’t paste the active text highlight. I hadn’t realized how much I have become dependent on that until I didn’t have it. You also can’t copy/paste between a Mir and an XMir window, which makes legacy apps somewhat less useful, but that’s on the roadmap to be fixed.

Speaking of windows, Unity 8 is still limited to one per app. This is going to change, but it is the current state of things. This doesn’t matter so much for native apps, which were build under this restriciton, and the terminal app having tabs was a saving grace here. But for legacy apps it presents a bigger issue, especially apps like GTG (Getting Things Gnome) where multi-window is a requirement.

Some power-management is missing too, such as dimming the screen after some amount of inactivity, or turning it off altogether. The session also will not lock when you suspend it, so don’t depend on this in a security-critical way (but really, if you’re running bleeding-edge desktops in security-critical environments, you have bigger problems).

I also had a minor problem with my USB headset. It’s actually a problem I have in Unity 7 too, since upgrading to Xenial the volume and mute controls don’t automatically switch to the headset, even though the audio output and input do. I had a workaround for that in Unity 7, I could open the sound settings and manually change it to the headset, at which point the controls work on it. But in Unity 8’s sound settings there is no such option, so my workaround isn’t available.

The biggest hurdle, from my perspective, was not being able to install apps from the store. This is due to something in the store scope, online accounts, or Ubuntu One, I haven’t figured out which yet. So to install anything, I had to get the .click package and do it manually. But asking around I seem to be the only one having this problem, so those of you who want to try this yourself may not have to worry about that.

The end?

No, not for me. I’m on day 3 of this 10 day challenge, and so far things are going well enough for me to continue. I have been posting regular small updates on Google+, and will keep doing so. If I have enough for a new blog post, I may write another one here, but for the most part keep an eye on my G+ feed. Add your own experiences there, and again join #ubuntu-unity if you get stuck or need help.

Read more
Christian Dywan

With OTA-11 on the horizon, rc-proposed now has a new framework. If you want to use the latest UI Toolkit API, that is part of Ubuntu.Components 1.3, you should bump your framework to 15.04.5 - in QtCreator you can find your manifest.json.in under Other Files and simply select the new version. Now you can use the new subtitle property with PageHeader which complements the existing title and shows a smaller label at the bottom of the header. PageHeaderStyle gains subtitleColor which can be used via StyleHints to customize the looks of the new subtitle. disabledForegroundColor further more now allows changing the color of the actions when the header is disabled. For example


Page {
    header: PageHeader {
        id: pageHeader
        title: i18n.tr("Hello World")
        subtitle: i18n.tr('Lorem ipsum dolor sit amet')
        StyleHints {
            backgroundColor: UbuntuColors.inkstone
            foregroundColor: UbuntuColors.blue
            // The color of disabled actions
            disabledForegroundColor: UbuntuColors.red
            // The divider at the bottom
            dividerColor: UbuntuColors.red
            // The new subtitle
            subtitleColor: UbuntuColors.green
        }
        trailingActionBar.actions: [
            Action {
                iconName: 'list-add'
                onTriggered: console.log('Hello world')
            },
           Action {
              iconName: 'list-remove'
              enabled: false
           }
        ]
    }
}


"enabled: false" in the Action turns it red as it no longer responds to touch, mouse or keyboard input (the same can be done for all actions by disabling PageHeader).

Remember OTA-10 and framework 15.04.4?

Already shipping on most if not everyone’s Ubuntu devices now is OTA-10 which brought with it new API for the BottomEdge component: preloadContent. This new boolean property when set to true causes all contents to preload in the background even before the hint is being used to reveal it - the default is false, which means contents are loaded on demand like before. This can speed things up a great deal in some cases.

BottomEdge {
    id: bottomEdge
    height: parent.height - units.gu(20)
    hint.text: “My bottom edge”
    preloadContent: true
    contentComponent: Rectangle {
        color: UbuntuColors.green
        width: page.width
        height: page.height
    }
}

 

Read more
Dustin Kirkland


Below you can find the audio/video recording of my OpenStack Austin presentation, where I demonstrated Ubuntu OpenStack Mitaka, running on top of Ubuntu 16.04 LTS, entirely within LXD machine containers.  You can also download the PDF of the slides here.  And there are a number of other excellent talks here!



Cheers,
Dustin

Read more
Magdalena Mirowicz

How we introduced Scrum to the Web Team

At the beginning of the year our team – who look after the core websites in the Ubuntu ecosystem – decided to adjust our project delivery process and go full-on Scrum. This is hardly shocking news these days. Actually, you can find way more people writing about how they decided to ditch Scrum and what a terrible idea it was to begin with. But for us, it seemed like a good thing to try and so far the results are promising.

Happy Web Team sprinting Happy Web Team sprinting on the 16.04 release day

What is Scrum?

Scrum was born as a framework to manage the development of complex products where the traditional project methodologies failed. It has a very simple set of rules that are best explained by its founding fathers Ken Schwaber and Jeff Sutherland in the Scrum Guide. Unfortunately, over the years the simple framework has been – on the one hand – contaminated with various additional concepts and on the other, diluted by assumption that Scrum can work in any context or on a pick-and-choose basis.

When you think Scrum do you think user stories, burndown charts and planning poker?

Well, that is what I thought before I realised that all these things are NOT part of Scrum but the optional additions, which sometimes can help but sometimes can be detrimental.

Life before Scrum

I joined the Canonical Web Team at the end of last year in a project manager’s role. At that point, the team was experimenting with introducing some of the Scrum artifacts, like sprint planning and retrospective, into an already familiar Kanban method.

What worked

Standups were a daily bread for the team and kept everyone in the loop. Retrospectives made us reflect on the ways we work and how we can improve. Team members were skilled at planning their tasks and progressing through their work. The fact that we are a relatively small team based in the same space also helped with communication and collaboration.

What didn’t work

It felt like the partial adoption of Scrum was not really allowing us to reap all positive effects. We operated on a one week sprint basis. We had planning sessions at the start of the sprint but they were mostly focused on tasks for individual team members rather than team working out what we can complete each sprint and how to make it happen. We also didn’t involve the stakeholders in our meetings, so often team members didn’t have a good understanding of the business context behind the projects.

Our log of current and incoming work was massive, recorded in few different places, and often not very well defined. We work with multiple stakeholders from different functions and product lines. We also have a handful of internal projects aimed at improving our ways of working (for example a great Vanilla framework initiative you can read about here). It was a challenge for us to understand our short and long term priorities. It also felt that we can benefit if we make the stakeholders a part of the prioritisation and planning exercise.

Life after Scrum

Our team was one leg in the Scrum already and it intuitively felt that pushing it further could help us resolve at least some of the above mentioned problems.

Sprint changes

We extended the duration of our sprints to two weeks in order to have enough time to complete usable product increments. Bonus – it reduced the overhead of weekly planning and review sessions.

We shifted our thinking about what we take on each sprint from the task level items to the backlog level items which ideally, should be demonstrable at the end of the sprint. The goal is also to get better at understanding our velocity, improve estimation and therefore be more accurate in planning what we can accomplish in two week’s timeframe.

This change created a more sustainable work pace while at the same time added a sense of urgency  around most important work. Sprint clock is ticking, we know what we planned to complete and from day one we do our best to succeed. As mentioned by one of our developers, “Team now has bi-weekly rhythm and greater visibility of overall team goals in any given sprint. There is a constant march of progress”.

Introducing a backlog

Product backlog is one of the Scrum artifacts and our team didn’t really have one before. We decided to replace all docs and tools where we captured upcoming projects with one simple spreadsheet, hosting all briefs and other relevant project info. This allowed us to surface all the work that team had in the pipeline, including the internal improvements that didn’t have any owners outside of the Web Team. This new format supports us in defining and building the consensus about our priorities.

One additional shift related to our estimation process. We decided to discard task estimating altogether for the simplicity and focus only on the backlog items. The principle is that the higher the project is in the backlog, the more we break it down into small increments so our estimates are more accurate. We started with a big backlog refining session to get a better understanding of what we have in the pipeline. We now use the burnup chart which I update at the end of the sprint and it helps us to predict when, roughly, we may get to the projects that are further down the pipeline.

Meetings, meetings and few more meetings

We decided to introduce new meetings and slightly alter the existing ones. Every two weeks our Tuesday schedule is pretty hectic but it feels like it actually saves us time in the long run.

We start with a sprint review meeting for all team members and stakeholders. That’s where we look at what was planned for the sprint, demo what we completed and – if needed – explain what we didn’t manage to finish and why. We then move to the backlog planning session with the same group, agreeing what should make its way to the next sprint, clarifying outstanding questions and talking through new briefs that came in the meantime.

The second set of meetings involves only the Web Team. We first run our usual retrospective and after that, we plan the next sprint in details. We discuss all backlog items planned for the sprint, identify tasks needed to complete them and team members pick what they will be working on. After this exercise, even without estimating, we get a pretty good idea whether we’re overloaded or we need to add more work.

So far the review and planning meeting with the business turned out well and helped to improve the communication, understanding of everyone’s work, and consensus about the priorities. As one of team members pointed out, “stakeholders now have to agree to work beforehand and any ad-hoc work inserted into the iteration visibly impacts on our initial commitment”.

Scrum isn’t always a walk in the park

The beauty of Scrum is that it’s lightweight and in principle, simple to understand. It doesn’t mean however that running projects with Scrum is not difficult. Below I outlined what I see currently as our key challenges.

Launch deadlines vs. sprint schedule

Some of our web projects have strict launch dates as they are tied to specific events, such as a launch of new device. More often than not, these fall somewhere within the sprint duration so we can’t simply finish them at the end of the sprint. One way of addressing it would be to schedule them in the preceding sprint however we are rarely able to gather all necessary bits of information beforehand. For now, we just accept the fact that some items in our sprint have a higher priority and need to be released before the sprint ends.

Sprint planning and estimates

More often than not, by the end of the sprint we realise that we won’t complete all scheduled backlog items. We try not to make a big drama out of it – apparently it happens roughly half of the time even for mature Scrum teams – but at times, it deflates a sense of accomplishment. We can definitely improve how we break our backlog items, and our estimates are still sometimes based on a wishful thinking. There is also too much temptation to add more to a backlog than our velocity predicts – we try to resist it, with mixed effects.

Getting stakeholders on board

Introducing stakeholders to our planning and review process was seen by the whole team as a huge improvement, yet working with clients – either internal or external – is not always a piece of cake. We sometimes struggle to get good briefs and all necessary information before the sprint starts, and every now and then we get a cheeky request to fit something new in. It’s a long process to get everyone follow the rules and we are only at the beginning!

Bugs and business as usual

This seems to be quite a common problem for many Scrum teams – how should we deal with bugs and small requests (like copy changes) that come during the duration of the sprint? We considered postponing them until the next planning meeting where we would determine which ones we add into a sprint. Eventually, we decided we would spend more time discussing and planning these things than it actually takes to resolve them. Therefore, we assume that a small percentage of team’s velocity (about 10%) will be spent on dealing with these. That’s not quite in line with Scrum principles and we don’t have a good way to measure yet what’s the actual impact of such work.

Happy Scrum, everyone!

Scrum doesn’t work everywhere and for everyone but our team is happy with the direction we moved to, which often comes back in our retrospectives. Empowerment, openness, collaboration, and better structure have been mentioned by several team members. It’s really remarkable how easily everyone adjusted to the new process and team’s commitment to make the whole thing work has been invaluable.

We are only in our seventh sprint now and are still on the steep learning curve, making adjustments as needed. Like anything in this world, Scrum is not perfect but maybe the greatest thing about it is that it keeps continuous adaptation at its core so within each cycle, we can look back and change what we don’t like.

Want to learn how to be a Scrummaster or Product Owner yourself?

Before we started our transition to Scrum I completed the Scrum Master and Product Owner training classes with Martine Davos at Skills Matter in London, UK, which I highly recommend for any Scrum newbies.

Read more
Dustin Kirkland

I'm delighted to share the slides from our joint IBM and Canonical webinar about Ubuntu on IBM POWER8 and LinuxOne servers.  You can download the PDF here, watch the recording here, or tab through the slides or watch the video embedded below.  Enjoy!




Cheers,
:-Dustin

Read more
Colin Ian King

Recently I've been adding a few more features into stress-ng to get improve kernel code coverage.   I'm currently using a kernel built with gcov enabled and using the most excellent lcov tool to collate the coverage data and produce some rather useful coverage charts.

With a gcov enabled kernel, gathering coverage stats is a trivial process with lcov:

 sudo apt-get install lcov  
sudo lcov --zerocounters
stress-ng --seq 0 -t 60
sudo lcov -c -o kernel.info
sudo genhtml -o html kernel.info

..and the html output appears in the html directory.

In the latest 0.06.00 release of stress-ng, the following new features have been introduced:

  • af-alg stressor, added skciphers and rngs
  • new Translation Lookaside Buffer (TLB) shootdown stressor
  • new /dev/full stressor
  • hdd stressor now works through all the different hdd options if --maximize is used
  • wider procfs stressing
  • added more keyctl commands to the key stressor
  • new msync stressor, exercise msync of mmap'd memory back to file and from file back to memory.
  • Real Time Clock (RTC) stressor (via /dev/rtc and /proc/driver/rtc)
  • taskset option, allowing one to run stressors on specific CPUs (affinity setting)
  • inotify stressor now also exercises the FIONREAD ioctl()
  • and some bug fixes found when testing stress-ng on various architectures.
The --taskset option allows one to keep stress-ng stressors bound to specific CPUs, for example, to run 5 CPU stressors tied to CPUs 1, 3, 5, 6 and 7:

 stress-ng --taskset 1,3,5-7 --cpu 5  

..thanks to Jim Rowan (Intel) for the CPU affinity ideas.

stress-ng 0.06.00 will be landing in Ubunty Yakkety soon, and also in my power utilities PPA ppa:colin-king/white

Read more
Prakash

I started blogging on 3rd March 2003 — that makes it 13 years of blogging today. Makes me feel older, when there are people who are not even 13 and have started blogging!

Thanks you to all those readers and followers for all your encouragements, comments and feedback.

For those interested in the History, you can read it here.

Read more
Daniel Holbach

Ubuntu 16.04 LTS is out of the door, we started work on the Yakkety Yak already, now it’s time for the Ubuntu Online Summit. It’s all happening 3-5 May 14-20 UTC. This is where we discuss upcoming features, get feedback and demo all the good work which happened recently.

If you want to join the event, just head to the registration page and check out the UOS 16.05 schedule afterwards. You can star (☆) sessions and mark them as important to you and thus plan your attendance for the event.

Now let’s take a look on the bits which are in one way or another related to Ubuntu Core at UOS:

  • Snappy Ubuntu 16 – what’s new
    16.04 has landed and with it came big changes in the world of snapd and friends. Some of them are still in the process of landing, so you’re in for more goodness coming down the pipe for Ubuntu 16.04 LTS.
  • The Snapcraft roadmap
    Publishing software through snaps is super easy and snapcraft is the tool to use for this. Let’s take a look at the roadmap together and see which exciting features are going to come up next.
  • Snappy interfaces
    Interfaces in Ubuntu Core allow snaps to communicate or share resources, so it’s important we figure out how interfaces work, which ones we’d like to implement next and which open questions there are.
  • Playpen – Snapping software together
    Some weeks ago the Community team set up a small branch in which we collaborated on snapping software. It was good fun, we worked on things together, learnt from each other and quickly worked out common issues. We’d like to extend the project and get more people involved. Let’s discuss the project and workflow together.
  • How to snap your software
    If you wanted to start snapping software (yours or somebody else’s) and wanted to see a presentation of snapcraft and a few demos, this is exactly the session you’ve been looking for.
  • Snappy docs – next steps
    Snappy and snapcraft docs are luckily being written by the developers as part of the development process, but we should take a look at the docs together again and see what we’re missing, no matter if it’s updates, more coherence, more examples or whatever else.
  • Demo: Snaps on the desktop
    Here’s the demo on how to get yourself set up as a user or developer of snaps on your regular Ubuntu desktop.

I’m looking forward to see you in all these sessions!

Read more
Prakash

Tripping valuations of unicorns might have set a dull tone for startups this year, but many industry experts believe that companies that are doing things “the right way” will continue to secure funding. Companies like Big Basket, Practo, Car Dekho, MSwipe and Urban Ladder have continued to show progress in their respective business models in spite of a weak environment.

Prakash AdvaniCanonical’s Regional Director, Sales & Alliances – India & South East Asia said that companies should raise capital as the last resort. If they can quickly convert their ideas into a profitable business then they don’t need to give up on equity.

Read More: https://www.entrepreneur.com/article/274986

Read more
UbuntuTouch

在最新的Scope Widget中,有一个新的Content Sharing Widget.我们可以利用这个Widget来分享我们的图片到信息,Facebook,Twitter等渠道.比如,在我们的Scope Preview中,点击图片上的分享按钮,就可以把我们的内容分享出去.


  


 

它的设计也非常简单明了.

我们还是从我们已经做过的练习中下载代码:

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

1)添加新的图片资源

query.cpp

void Query::pushResult(sc::SearchReplyProxy const& reply,
                       const string renderer, int i) {
    stringstream ss;
    ss << i;
    string str = ss.str();

    auto cat = reply->register_category( "id" + str, "Template " + str ,
                                         "", sc::CategoryRenderer(renderer) );
    sc::CategorisedResult r(cat);
    r.set_uri( URI.toStdString() );
    r.set_art( images_[0].toStdString() );
//    r.set_art("http://api.map.baidu.com/images/weather/night/leizhenyu.png");
    r["subtitle"] = "Subtitle " + str;
    r.set_title("Title " + str);
    r["summary"] = "Summary: " + str;
    r["fulldesc"] = "fulldesc: " + str;
    r["mascot"] = icons_[0].toStdString();
    r["emblem"] = icons_[1].toStdString();
    r["background"] = background_.toStdString();
    r["overlay-color"] = "#FF0000";

    r["comment_icon"] = icons_[3].toStdString();
    r["share_icon"] = icons_[4].toStdString();
    r["share_pic"] = icons_[5].toStdString();

    QString likes = QString("%1 %2").arg(qstr(u8"\u261d "), "100");
    QString views = QString("%1 %2").arg(qstr(u8"   \u261f "), "99");
    std::string both = qstr("%1 %2").arg(likes,views).toStdString();
    sc::VariantBuilder builder;
    builder.add_tuple({
        {"value", Variant(both)}
    });
    builder.add_tuple({
        {"value", Variant("")}
    });
    r["attributes"] = builder.end();

    r["musicSource"] = "http://qqmp3.djwma.com/mp3/魔音神据极品私货这锯子拉的耳膜都要碎了.mp3";
    r["videoSource"] = "http://techslides.com/demos/sample-videos/small.mp4";
    r["screenshot"] = icons_[2].toStdString();

    // add an array to show the gallary of it
    sc::VariantArray arr;

    for(const auto &datum : icons_) {
        arr.push_back(Variant(datum.toStdString()));
    }

    r["array"] = sc::Variant(arr);

    if (!reply->push(r))
        return;
}

void Query::pushResult(sc::SearchReplyProxy const& reply,
                       const std::shared_ptr<const Category> *cat, int i) {

    stringstream ss;
    ss << i;
    string str = ss.str();

    sc::CategorisedResult r(*cat);
    r.set_uri( URI.toStdString() );
    r.set_art( images_[i].toStdString() );
    r["subtitle"] = "Subtitle " + str;
    r.set_title("Title " + str);
    r["summary"] = "Summary: " + str;
    r["fulldesc"] = "fulldesc: " + str;
    r["mascot"] = icons_[0].toStdString();
    r["emblem"] = icons_[1].toStdString();

    r["comment_icon"] = icons_[3].toStdString();
    r["share_icon"] = icons_[4].toStdString();
    r["share_pic"] = icons_[5].toStdString();

    QString likes = QString("%1 %2").arg(qstr(u8"\u261d "), "100");
    QString views = QString("%1 %2").arg(qstr(u8"   \u261f "), "99");
    std::string both = qstr("%1 %2").arg(likes,views).toStdString();
    sc::VariantBuilder builder;
    builder.add_tuple({
        {"value", Variant(both)}
    });
    builder.add_tuple({
        {"value", Variant("")}
    });
    r["attributes"] = builder.end();

    r["musicSource"] = "";
    r["videoSource"] = "";
    r["screenshot"] = "";
    // This is to ensure that the preview can well for the grid/carousel/lists...
    VariantArray arr;
    r["array"] = sc::Variant(arr);;

    if (!reply->push(r))
        return;
}

在上面我们添加了两个新的图片:

    r["share_icon"] = icons_[4].toStdString();
    r["share_pic"] = icons_[5].toStdString();

注意这里的"share_icon"是在Preview窗口中显示的图片.它可以和我们实际分享的照片是不一样的.在"share_pic"中真正定义的是我们想要分享的图片.在实际的应用中,被分享的图片也可以是一个数组.请开发者自己参考我们的文档来实践.


2)在Preview中添加我们的Widget

preview.cpp

void Preview::run(sc::PreviewReplyProxy const& reply) {
    Result result = PreviewQueryBase::result();

    ColumnLayout layout1col(1);
    std::vector<std::string> ids = { "image", "header", "summary", "tracks",
                                    "videos", "gallery_header", "gallerys", "reviews", "exp",
                                     "review_input", "rating_input", "inputId", "img" };
//    std::vector<std::string> ids = { "inputId", "img" };

    PreviewWidgetList widgets;

    ColumnLayout layout2col(2);
    layout2col.add_column(ids);
    layout2col.add_column({});

    ColumnLayout layout3col(3);
    layout3col.add_column(ids);
    layout3col.add_column({});
    layout3col.add_column({});

    // Define the header section
    sc::PreviewWidget header("header", "header");
    // It has title and a subtitle properties
    header.add_attribute_mapping("title", "title");
    header.add_attribute_mapping("subtitle", "subtitle");
    widgets.emplace_back(header);

    // Define the image section
    sc::PreviewWidget image("image", "image");
    // It has a single source property, mapped to the result's art property
    image.add_attribute_mapping("source", "art");
    widgets.emplace_back(image);

    // Define the summary section
    sc::PreviewWidget description("summary", "text");
    // It has a text property, mapped to the result's description property
    description.add_attribute_mapping("text", "description");
    widgets.emplace_back(description);

    PreviewWidget listen("tracks", "audio");
    {
        VariantBuilder builder;
        builder.add_tuple({
            {"title", Variant("This is the song title")},
            {"source", Variant(result["musicSource"].get_string().c_str())}
        });
        listen.add_attribute_value("tracks", builder.end());
    }

    PreviewWidget video("videos", "video");
    video.add_attribute_value("source", Variant(result["videoSource"].get_string().c_str()));
    video.add_attribute_value("screenshot", Variant(result["screenshot"].get_string().c_str()));

    PreviewWidget header_gal("gallery_header", "header");
    header_gal.add_attribute_value("title", Variant("Gallery files are:"));

    PreviewWidget gallery("gallerys", "gallery");
    gallery.add_attribute_mapping("sources", "array");

    if ( result["musicSource"].get_string().length() != 0 ) {
        widgets.emplace_back(listen);
    }

    if( result["videoSource"].get_string().length() != 0 ) {
        widgets.emplace_back(video);
    }

    if( result["array"].get_array().size() != 0 ) {
        widgets.emplace_back(header_gal);
        widgets.emplace_back(gallery);
    }

    // The following shows the review
    PreviewWidget review("reviews", "reviews");
    VariantBuilder builder;
    builder.add_tuple({
                          {"author", Variant("John Doe")},
                          {"review", Variant("very good")},
                          {"rating", Variant(3.5)}
                      });
    builder.add_tuple({
                          {"author", Variant("Mr. Smith")},
                          {"review", Variant("very poor")},
                          {"rating", Variant(5)}
                      });
    review.add_attribute_value("reviews", builder.end());
    widgets.emplace_back(review);

    // The following shows the expandable
    PreviewWidget expandable("exp", "expandable");
    expandable.add_attribute_value("title", Variant("This is an expandable widget"));
    expandable.add_attribute_value("collapsed-widgets", Variant(1));
    PreviewWidget w1("w1", "text");
    w1.add_attribute_value("title", Variant("Subwidget 1"));
    w1.add_attribute_value("text", Variant("A text"));
    PreviewWidget w2("w2", "text");
    w2.add_attribute_value("title", Variant("Subwidget 2"));
    w2.add_attribute_value("text", Variant("A text"));
    expandable.add_widget(w1);
    expandable.add_widget(w2);
    widgets.emplace_back(expandable);

    // The following shows a review rating-input
    PreviewWidget w_review("review_input", "rating-input");
    w_review.add_attribute_value("submit-label", Variant("Send"));
    w_review.add_attribute_value("visible", Variant("review"));
    w_review.add_attribute_value("required", Variant("review"));
    std::string reply_label = "Reply";
    std::string max_chars_label = "140 characters max";
    w_review.add_attribute_value("review-label", Variant(reply_label + ": " + max_chars_label));
    widgets.emplace_back(w_review);

    // The follwing shows a rating rating-input
    PreviewWidget w_rating("rating_input", "rating-input");
    w_rating.add_attribute_value("visible", Variant("rating"));
    w_rating.add_attribute_value("required", Variant("rating"));
    w_rating.add_attribute_value("rating-label", Variant("Please rate this"));
    widgets.emplace_back(w_rating);

    PreviewWidget w_image("img", "image");
    w_image.add_attribute_value("source", Variant(result["share_icon"].get_string().c_str()));
    VariantMap share_data;
//    share_data["uri"] = Variant("http://img2.imgtn.bdimg.com/it/u=442803940,143587648&fm=21&gp=0.jpg");
    share_data["uri"] = Variant(result["share_pic"].get_string().c_str());
    share_data["content-type"] = Variant("pictures");
    w_image.add_attribute_value("share-data",  sc::Variant(share_data));
    widgets.emplace_back(w_image);

    PreviewWidget w_commentInput("inputId", "comment-input");
    w_commentInput.add_attribute_value("submit-label", Variant("Post"));
    widgets.emplace_back(w_commentInput);

    // In the following, fake some comments data
    QList<Comment> comment_list;
    std::string comment_str = "Comment ";
    for(int i = 0; i < 3;  i++) {
        Comment comment;

        comment.id         = 1.0;
        comment.publishTime = "2015-3-18";
        comment.text = comment_str;
        comment.text += std::to_string(i+1);
        comment_list.append(comment);
    }

    int index = 0;
    Q_FOREACH(const auto & comment, comment_list) {
        std::string id = "commentId_" + std::to_string(index++);
        ids.emplace_back(id);

        PreviewWidget w_comment(id, "comment");
        w_comment.add_attribute_value("comment", Variant(comment.text));
        w_comment.add_attribute_value("author", Variant("Author"));
        w_comment.add_attribute_value("source", Variant(result["comment_icon"].get_string().c_str()));
        w_comment.add_attribute_value("subtitle", Variant(comment.publishTime));
        widgets.emplace_back(w_comment);
    }

    layout1col.add_column(ids);
    reply->register_layout({layout1col, layout2col, layout3col});
    reply->push( widgets );
}

在上面的代码中,我们添加了

    PreviewWidget w_image("img", "image");
    w_image.add_attribute_value("source", Variant(result["share_icon"].get_string().c_str()));
    VariantMap share_data;
//    share_data["uri"] = Variant("http://img2.imgtn.bdimg.com/it/u=442803940,143587648&fm=21&gp=0.jpg");
    share_data["uri"] = Variant(result["share_pic"].get_string().c_str());
    share_data["content-type"] = Variant("pictures");
    w_image.add_attribute_value("share-data",  sc::Variant(share_data));
    widgets.emplace_back(w_image);

同时,我们也在下面的Ids中添加了新增加的img ID:

    std::vector<std::string> ids = { "image", "header", "summary", "tracks",
                                    "videos", "gallery_header", "gallerys", "reviews", "exp",
                                     "review_input", "rating_input", "inputId", "img" };

通过这样的方法,当我们的照片被显示时,在图片的左下方就会出现一个分享的按钮.



点击我们的按钮就可以把我们在上面"share_pic"中定义的照片分享出去.这个照片也可以是网路上的一张照片.


作者:UbuntuTouch 发表于2016/3/30 8:25:59 原文链接
阅读:551 评论:0 查看评论

Read more
UbuntuTouch

我刚看了一下AbstractButton.这个API提供了一个最基本的供我们写我们的自己按钮的功能,比如它有clicked, pressAndHold信号供我们使用,同时也提供了一个最基本的一下属性,比如hover及触觉功能等.在最新的API中,它也提供了一个最新的功能:


sensingMargins
sensingMargins.left : real
sensingMargins.right : real
sensingMargins.top : real
sensingMargins.bottom : real
sensingMargins.all : real


这个属性是为了能够使得我们定义我们按钮的触发区域,比如,我们想在延伸我们的按钮的区域使得我们可以在更大的区域对我们的按钮产生按钮事件.在下面的例程中,我们来做一个简单的实验:


Main.qml


import QtQuick 2.4
import Ubuntu.Components 1.3

MainView {
    // objectName for functional testing purposes (autopilot-qt5)
    objectName: "mainView"

    // Note! applicationName needs to match the "name" field of the click manifest
    applicationName: "abstractbutton.liu-xiao-guo"

    width: units.gu(100)
    height: units.gu(75)

    Page {
        title: i18n.tr("abstractbutton")

        Rectangle {
            id: red
            anchors.centerIn: parent
            width: units.gu(10)
            height: units.gu(10)
            border.color: "red"

            AbstractButton {
                anchors.fill: parent
                sensingMargins {
                    left: units.gu(1)
                    top: units.gu(1)
                    bottom: units.gu(1)
                    right: units.gu(10)
                }

                onClicked: {
                    console.log("it is clicked in red")
                }
            }
        }

        Rectangle {
            id: blue
            anchors.left: red.right
            anchors.top: red.top
            border.color: "blue"
            width: units.gu(10)
            height: units.gu(10)

//            MouseArea {
//                anchors.fill: parent
//                onClicked: {
//                    console.log("it is clicked in blue")
//                }
//            }
        }
    }
}

在上面,我们定义了一个红色区域的按钮,同时我们也定义了一个蓝色的区域.在红色的按钮中,我们定义了:

 sensingMargins {
                    left: units.gu(1)
                    top: units.gu(1)
                    bottom: units.gu(1)
                    right: units.gu(10)
                }

qml: it is clicked in red
qml: it is clicked in red
qml: it is clicked in red
qml: it is clicked in red

这是因为我们在红色按钮中把它可以触碰的区域延伸到了蓝色的方框中.当然如果,我们把我们上面的代码修改为如下:

        Rectangle {
            id: blue
            anchors.left: red.right
            anchors.top: red.top
            border.color: "blue"
            width: units.gu(10)
            height: units.gu(10)

            MouseArea {
                anchors.fill: parent
                onClicked: {
                    console.log("it is clicked in blue")
                }
            }
        }

那么当我们在蓝色区域触屏时,我们再也看不到上面的输出了.



值得指出的是,由于这个sensingMargins比较新,所以它需要最新的软件版本才能够支持.具体要求可以参阅bug

作者:UbuntuTouch 发表于2016/3/21 11:51:23 原文链接
阅读:250 评论:0 查看评论

Read more
UbuntuTouch

我们知道一个好的工具可以帮我们更好更快地开发我们的应用.在今天的文章中,我来介绍一下我最新开发的一个文件浏览器工具.这个工具可以很方便地帮我们打开我们所需要的文件,并快速地查看我们应用/Scope输出的信息,以便更方便地调试我们的应用.由于该应用使用了"unconfined"安全策略,所有不能上传到应用商店.如果开发者感兴趣的话,可以直接从我的github中下载,并安装到自己的手机中.目前应用还在完善中.如果大家有什么建议的话,欢迎提出来.我会在下一个版本中考虑进去的.


应用截图:


    


   


  




具体使用方法:


1)在目录的图片上向右滑动,进入到下一个目录中

2)在窗口中向左滑动,退回到上一个目录中

3)双击当前的文件,查看文件的内容.目前只支持.txt,.log,.conf,jpg/jpeg/png文件的查看

4)点击右上的"h"图标来查看hidden文件

5)点击右上"log"图标,只显示log文件.用于快速定位log文件.如果想看到其它格式的文件,就需要取消只显示log文件图标.

6)点击"syslog"图标,显示/var/log/syslog中的内容,供调试


对于我们开发者开发Scope来说,我们可以查看/home/phablet/.cache/upstart/scope_registry.log文件来查看我们的输出以帮助我们来更好地调试我们的Scope.


具体安装步骤,请参阅github中的"readme.txt"文件.

项目文件:https://github.com/liu-xiao-guo/filebrowser

更多想下载有趣的"unconfined"应用的开发者可以参阅网址https://open.uappexplorer.com/apps.里面也有一个文件浏览器,但是它打不开log文件等.操作起来应该没有我的这个方便 :)

作者:UbuntuTouch 发表于2016/3/21 13:29:53 原文链接
阅读:326 评论:0 查看评论

Read more
UbuntuTouch

由于一些原因,在Ubuntu手机上,只支持一个前台运行的应用.每当应用被推到后台后,就会被自动挂起(suspended),该应用将不再被运行.这也是Ubuntu手机和安卓系统不一样的地方.更确切地说,Ubuntu手机应用的设计更类似于iPhone的应用.只允许一个前台运行的应用.当然如果把手机接到一个无线鼠标和键盘,那么我们的手机会自动进入到Desktop模式,也就自动具有多任务的功能.

对于很多开发者来说,没有了多任务,就好像没有了一些创新的应用,比如,我们不可能把导航的应用推到后台就不运行了.在实际的一些应用中,能够在后台运行,也是一个非常有用的功能.在今天的文章中,我们将介绍如何实现能够在后台运行的应用.在该应用中,我们使用了"unconfined"安全策略.必须注意的一点是,这个样的应用将不能进入到Ubuntu Store.如果有可能的话,可以上传到https://open.uappexplorer.com/apps商店供一些特别需要的用户使用.


1)使用unconfined安全策略


就像我们上面提到的,为了能够访问我们一般应用访问不到的文件地址,我们必须在我们的apparmor文件中定义一些特别的安全策略:

{
    "policy_groups": [
        "networking"
    ],
    "policy_version": 1.3,
    "template": "unconfined"
}

有了上面unconfined定义,我们的应用就可以访问到一些我们不能访问到的资源.从某种意义上讲,已经打破了我们在Ubuntu手机上所设置的安全机制.必须注意的是这样的不明来源的应用可能对我们的手机造成伤害


2)修改应用的lifecycleException标示



一旦一个应用的这个lifecycleException标志被修改,我们的应用在被推到后台时,将不被系统所挂起(suspended).那么我们怎么修该我们的应用的这个标示呢?我们可以仿照在launchpad.net上的https://launchpad.net/tweakgeek项目.我们可以通过上面的方法来获取我们当前应用的信息,并做适当的修改.

Main.cpp

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQuickView>

#include "applicationmodel.h"

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);

    qmlRegisterType<ApplicationModel>("TweakGeek", 1, 0, "ApplicationModel");
    qmlRegisterUncreatableType<ApplicationItem>("TweakGeek", 1, 0, "ApplicationItem", "bla");

    QQuickView view;
    view.setSource(QUrl(QStringLiteral("qrc:///Main.qml")));
    view.setResizeMode(QQuickView::SizeRootObjectToView);
    view.show();
    return app.exec();
}

在上面我们把ApplicationModel及ApplicationItem数据类型进行登记,这样我们可以在我们的QML中运用它们.

Main.qml


import QtQuick 2.4
import Ubuntu.Components 1.3
import TweakGeek 1.0
import QtQuick.Layouts 1.1

MainView {
    // objectName for functional testing purposes (autopilot-qt5)
    objectName: "mainView"

    // Note! applicationName needs to match the "name" field of the click manifest
    applicationName: "keeprunningapp.liu-xiao-guo"

    width: units.gu(60)
    height: units.gu(85)

    property int index: 0
    property var myapp

    ApplicationModel {
        id: applicationModel
    }

    Timer {
        interval: 500; running: true; repeat: true
        onTriggered: {
            index ++
            console.log("index: " + index)
        }
    }

    function findMyApp() {
        var count = applicationModel.count();
        for ( var i = 0 ; i < count; i++ ) {
            var app = applicationModel.get(i)
            // console.log("app name: " + app.name)
            if ( app.name === "keeprunningapp" ) {
                // if our own app is found, make it not die
                console.log("My app setLifecycleException: " + app.lifecycleException)
                myapp = app
            }
        }
    }

    Page {
        header: PageHeader {
            title: "keeprunningapp"
        }

        Connections {
            target: Qt.application
            onActiveChanged: {
                console.log("Qt.application.active: " + Qt.application.active);
            }
        }

        Column {
            anchors.centerIn: parent
            spacing: units.gu(2)

            Label {
                text: "current app is: " + Qt.application.active
                fontSize: "large"
            }

            Label {
                text: "index: " + index
                fontSize: "large"
            }

            RowLayout {
                spacing: units.gu(5)

                Label {
                    text: "Prevent suspending"
                    Layout.fillWidth: true
                    fontSize: "large"
                }

                Switch {
                    checked: myapp.lifecycleException
                    onClicked: myapp.lifecycleException = checked
                }
            }
        }
    }

    Component.onCompleted: {
        findMyApp();
    }
}

我们的实现也非常地简单.我们首先通过findMyApp来寻找到我们自己应用的实例,并在Switch中:
                Switch {
                    checked: myapp.lifecycleException
                    onClicked: myapp.lifecycleException = checked
                }
进行绑定.

在我们的应用,为了显示我们的应用是否正在运行,我们特别设计了一个定时器,每隔500毫秒,输出一行字.

    Timer {
        interval: 500; running: true; repeat: true
        onTriggered: {
            index ++
            console.log("index: " + index)
        }
    }

我们可以运行我们的应用:



当我们的应用的"Prevent suspending"开关设为"关"时,每当应用被推到后台,上面的定时器的输出就会停止,表明应用被suspended.而当我们的开关设为"开"时,每当应用被推到后台时,在我们的应用窗口还是可以看到连绵不断地输出:

qml: index: 418
qml: index: 419
qml: index: 420
qml: index: 421
qml: index: 422
qml: index: 423
qml: index: 424
qml: index: 425
qml: index: 426
qml: index: 427

整个项目的源码在:https://github.com/liu-xiao-guo/keeprunningapp




作者:UbuntuTouch 发表于2016/3/22 14:13:17 原文链接
阅读:381 评论:0 查看评论

Read more
UbuntuTouch

我们知道对于一些手机应用来说,能够得到屏幕的尺寸信息已经屏幕的方向,那么对我们的应用的布局非常中.我们可以通过对这个事件的感知,进一步来对我们的应用的布局来重新调整.


下面我们来通过一个简单的例程来显示在Ubuntu Screen API中有那些信息.


Main.qml

import QtQuick 2.4
import Ubuntu.Components 1.3
import QtQuick.Window 2.2

MainView {
    // objectName for functional testing purposes (autopilot-qt5)
    objectName: "mainView"

    // Note! applicationName needs to match the "name" field of the click manifest
    applicationName: "screen.liu-xiao-guo"

    width: units.gu(60)
    height: units.gu(85)

    property var orientations: ["PrimaryOrientation", "PortraitOrientation",
                    "LandscapeOrientation","", "InvertedPortraitOrientation","", "","",
                    "InvertedLandscapeOrientation" ]


    Page {
        title: i18n.tr("screen")

        Column {
            anchors.centerIn: parent
            spacing: units.gu(2)

            Label {
                text: "desktopAvailableHeight: " + Screen.desktopAvailableHeight
            }

            Label {
                text: "devicePixelRatio: " + Screen.devicePixelRatio
            }

            Label {
                text: "desktopAvailableWidth: " + Screen.desktopAvailableWidth
            }

            Label {
                text: "height: " + Screen.height
            }

            Label {
                text: "width: " + Screen.width
            }

            Label {
                text: "name: " + Screen.name
            }

            Label {
                text: "orientation: " + orientations[Screen.orientation]
            }

            Label {
                text: "primaryOrientation: " + orientations[Screen.primaryOrientation]
            }

            Label {
                text: "orientationUpdateMask: " + Screen.orientationUpdateMask
            }

            Label {
                text: "pixelDensity: " + Screen.pixelDensity
            }
        }
    }
}

在我们的MX4手机上运行我们的应用:

    

从上面的信息中,我们可以看出来,我们的Screen API给出的所有的信息.细心的开发者将会发现这里得到的信息和我们之前在文章"如何得到屏幕和可用显示区域的大小尺寸及运用分辨率无关的编程"得到的屏幕尺寸是一样的.


作者:UbuntuTouch 发表于2016/3/22 17:08:29 原文链接
阅读:242 评论:0 查看评论

Read more