<?xml version="1.0" encoding="ISO-8859-1" ?>

<rdf:RDF
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns="http://purl.org/rss/1.0/"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
>

	<channel rdf:about="http://luisbg.blogalia.com/rdf.xml">
		<title>the phrygian cap</title>
		<link>http://luisbg.blogalia.com/</link>
		<description>luis de bethencourt's blog about the technological freedom world.</description>
		<dc:language>es-ES</dc:language>
		<dc:rights>Copyright d33p</dc:rights>
		<dc:publisher>d33p</dc:publisher>
  		<dc:creator>d33p</dc:creator>
		<items>
			<rdf:Seq>
								<rdf:li resource="http://luisbg.blogalia.com//historias/76869" />
				<rdf:li resource="http://luisbg.blogalia.com//historias/76017" />
				<rdf:li resource="http://luisbg.blogalia.com//historias/75813" />
				<rdf:li resource="http://luisbg.blogalia.com//historias/74916" />
				<rdf:li resource="http://luisbg.blogalia.com//historias/74881" />
				<rdf:li resource="http://luisbg.blogalia.com//historias/74602" />
				<rdf:li resource="http://luisbg.blogalia.com//historias/74484" />
				<rdf:li resource="http://luisbg.blogalia.com//historias/74475" />
				<rdf:li resource="http://luisbg.blogalia.com//historias/74384" />
				<rdf:li resource="http://luisbg.blogalia.com//historias/74348" />

			</rdf:Seq>
		</items>
	</channel>

	
	<item rdf:about="http://luisbg.blogalia.com//historias/76869">
		<title>C++ Cheat Sheet</title>
		<link>http://luisbg.blogalia.com//historias/76869</link>
		<description>I spend most of my time writing and reading C code, but every once in a while I get to play with a C++ project and find myself doing frequent reference checks to &lt;a href=&quot;http://cppreference.com&quot;&gt;cppreference.com&lt;/a&gt;. I wrote myself the most concise cheat sheet I could that still shaved off the majority of those quick checks. Maybe it helps other fellow programmers who occasionally dabble with C++.&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;
&lt;!-- HTML generated using hilite.me --&gt;&lt;div style=&quot;background: #ffffff; overflow:auto;width:auto;border:solid white;border-width:.1em .1em .1em .8em;padding:.2em .6em;&quot;&gt;&lt;pre style=&quot;margin: 0; line-height: 125%&quot;&gt;&lt;span style=&quot;color: #008800; font-weight: bold&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color: #BB0066; font-weight: bold&quot;&gt;ClassName&lt;/span&gt; {
  &lt;span style=&quot;color: #333399; font-weight: bold&quot;&gt;int&lt;/span&gt; priv_member;  &lt;span style=&quot;color: #888888&quot;&gt;// private by default&lt;/span&gt;
&lt;span style=&quot;color: #997700; font-weight: bold&quot;&gt;protected:&lt;/span&gt;
  &lt;span style=&quot;color: #333399; font-weight: bold&quot;&gt;int&lt;/span&gt; protect_member;
&lt;span style=&quot;color: #997700; font-weight: bold&quot;&gt;public:&lt;/span&gt;
  ClassName() &lt;span style=&quot;color: #888888&quot;&gt;// constructor&lt;/span&gt;
  &lt;span style=&quot;color: #333399; font-weight: bold&quot;&gt;int&lt;/span&gt; get_priv_mem();  &lt;span style=&quot;color: #888888&quot;&gt;// just prototype of func&lt;/span&gt;
  &lt;span style=&quot;color: #008800; font-weight: bold&quot;&gt;virtual&lt;/span&gt; &lt;span style=&quot;color: #333333&quot;&gt;~&lt;/span&gt;ClassName() {} &lt;span style=&quot;color: #888888&quot;&gt;// destructor&lt;/span&gt;
};

&lt;span style=&quot;color: #333399; font-weight: bold&quot;&gt;int&lt;/span&gt; ClassName&lt;span style=&quot;color: #333333&quot;&gt;::&lt;/span&gt;get_priv_mem() {  &lt;span style=&quot;color: #888888&quot;&gt;// define via scope&lt;/span&gt;
  &lt;span style=&quot;color: #008800; font-weight: bold&quot;&gt;return&lt;/span&gt; priv_member;
}

&lt;span style=&quot;color: #008800; font-weight: bold&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color: #BB0066; font-weight: bold&quot;&gt;ChildName&lt;/span&gt; &lt;span style=&quot;color: #333333&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #008800; font-weight: bold&quot;&gt;public&lt;/span&gt; ClassName, &lt;span style=&quot;color: #008800; font-weight: bold&quot;&gt;public&lt;/span&gt; CanDoMult {
&lt;span style=&quot;color: #997700; font-weight: bold&quot;&gt;public:&lt;/span&gt;
  ChildName() {
    protect_member &lt;span style=&quot;color: #333333&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #0000DD; font-weight: bold&quot;&gt;0&lt;/span&gt;;
  } ...
};

&lt;span style=&quot;color: #008800; font-weight: bold&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color: #BB0066; font-weight: bold&quot;&gt;Square&lt;/span&gt; {
  &lt;span style=&quot;color: #008800; font-weight: bold&quot;&gt;friend&lt;/span&gt; &lt;span style=&quot;color: #008800; font-weight: bold&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color: #BB0066; font-weight: bold&quot;&gt;Rectangle&lt;/span&gt;; ... &lt;span style=&quot;color: #888888&quot;&gt;// can access private members&lt;/span&gt;
};


&lt;span style=&quot;color: #997700; font-weight: bold&quot;&gt;Containers:&lt;/span&gt; container_type&lt;span style=&quot;color: #333333&quot;&gt;&amp;lt;&lt;/span&gt;int&lt;span style=&quot;color: #333333&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt; &lt;span style=&quot;color: #333399; font-weight: bold&quot;&gt;list&lt;/span&gt; &lt;span style=&quot;color: #333333&quot;&gt;-&amp;gt;&lt;/span&gt; linked list
  front(), back(), begin(), end(), {push&lt;span style=&quot;color: #333333&quot;&gt;/&lt;/span&gt;pop}_{front&lt;span style=&quot;color: #333333&quot;&gt;/&lt;/span&gt;back}(), insert(), erase()
&lt;/span&gt; &lt;span style=&quot;color: #333399; font-weight: bold&quot;&gt;deque&lt;/span&gt; &lt;span style=&quot;color: #333333&quot;&gt;-&amp;gt;double ended queue
  [], {push&lt;span style=&quot;color: #333333&quot;&gt;/&lt;/span&gt;pop}_{front&lt;span style=&quot;color: #333333&quot;&gt;/&lt;/span&gt;back}(), insert(), erase(), front(), back(), begin()
&lt;/span&gt; &lt;span style=&quot;color: #333399; font-weight: bold&quot;&gt;queue&lt;span style=&quot;color: #333333&quot;&gt;/&lt;/span&gt;stack&lt;/span&gt; &lt;span style=&quot;color: #333333&quot;&gt;-&amp;gt;&lt;/span&gt; adaptors over deque
  push(), pop(), size(), empty()
  front(), back() &lt;span style=&quot;color: #333333&quot;&gt;&amp;lt;-&lt;/span&gt; queue
  top() &lt;span style=&quot;color: #333333&quot;&gt;&amp;lt;-&lt;/span&gt; stack
&lt;/span&gt; &lt;span style=&quot;color: #333399; font-weight: bold&quot;&gt;unordered_map&lt;/span&gt; &lt;span style=&quot;color: #333333&quot;&gt;-&amp;gt;&lt;/span&gt; hashtable
  [], at(), begin(), end(), insert(), erase(), count(), empty(), size()
&lt;/span&gt; &lt;span style=&quot;color: #333399; font-weight: bold&quot;&gt;vector&lt;/span&gt; &lt;span style=&quot;color: #333333&quot;&gt;-&amp;gt;&lt;/span&gt; dynamic array
  [], at(), front(), back(), {push&lt;span style=&quot;color: #333333&quot;&gt;/&lt;/span&gt;pop}_back, insert(), erase(), size()
&lt;/span&gt; &lt;span style=&quot;color: #333399; font-weight: bold&quot;&gt;map&lt;/span&gt; &lt;span style=&quot;color: #333333&quot;&gt;-&amp;gt;&lt;/span&gt; tree
  [], at(), insert(), erase(), begin(), end(), size(), empty(), find(), count()

&lt;/span&gt; &lt;span style=&quot;color: #333399; font-weight: bold&quot;&gt;unordered_set&lt;/span&gt; &lt;span style=&quot;color: #333333&quot;&gt;-&amp;gt;&lt;/span&gt; hashtable just keys
&lt;/span&gt; &lt;span style=&quot;color: #333399; font-weight: bold&quot;&gt;set&lt;/span&gt; &lt;span style=&quot;color: #333333&quot;&gt;-&amp;gt;&lt;/span&gt; tree just keys
&lt;/pre&gt;&lt;br /&gt;
&lt;/pre&gt;</description>
	</item>

	<item rdf:about="http://luisbg.blogalia.com//historias/76017">
		<title>Git Cheat Sheet</title>
		<link>http://luisbg.blogalia.com//historias/76017</link>
		<description>A few weeks ago I created this Git Cheat Sheet as a reference for commands I use at least once a month. I've found it useful and I'm sharing it so others find it useful too. There are also &lt;a href=&quot;https://github.com/luisbg/git-cheat-sheet/blob/master/README.md&quot;&gt;markdown&lt;/a&gt; and &lt;a href=&quot;https://raw.githubusercontent.com/luisbg/git-cheat-sheet/master/git_cheat_sheet.org&quot;&gt;org-mode&lt;/a&gt; versions available.&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;b&gt;Configure&lt;/b&gt;&lt;ul&gt;&lt;li&gt;git config &amp;#x2013;global user.name &quot;[name]&quot;&lt;ul&gt;&lt;li&gt;Sets the name you want attached to your commit transactions&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;git config &amp;#x2013;global user.email &quot;[email address]&quot;&lt;ul&gt;&lt;li&gt;Sets the email you want attached to your commit transactions&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;git config &amp;#x2013;global color.ui auto&lt;ul&gt;&lt;li&gt;Enables helpful colorization of command line output&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;git config &amp;#x2013;global push.default current&lt;ul&gt;&lt;li&gt;Update a branch with the same name as current branch if no refspec is given&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;git config &amp;#x2013;global core.editor [editor]&lt;ul&gt;&lt;li&gt;Which editor to use when commit and tag that lets you edit messages&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;git config &amp;#x2013;global diff.tool [tool]&lt;ul&gt;&lt;li&gt;Specify which command to invoke as the specified tool for git difftool&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;br /&gt;
&lt;li&gt;&lt;b&gt;Create repositories&lt;/b&gt;&lt;ul&gt;&lt;li&gt;git init [project-name]&lt;ul&gt;&lt;li&gt;Creates a new local repository with the specified name&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;git clone [url]&lt;ul&gt;&lt;li&gt;Downloads a project nd its entire version history&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;br /&gt;
&lt;li&gt;&lt;b&gt;Make changes&lt;/b&gt;&lt;ul&gt;&lt;li&gt;git status&lt;ul&gt;&lt;li&gt;Lists all new or modified files to be committed&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;git status -s&lt;ul&gt;&lt;li&gt;Short view of status&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;git diff&lt;ul&gt;&lt;li&gt;Shows file differences not yet staged&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;git add [file]&lt;ul&gt;&lt;li&gt;Snapshots the file in preparation for versioning&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;git add .&lt;ul&gt;&lt;li&gt;Add all modified files to be commited&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;git add '*.txt'&lt;ul&gt;&lt;li&gt;Add only certain files&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;git add &amp;#x2013;patch filename.x (or -p for short)&lt;ul&gt;&lt;li&gt;Snapshot only chunks of a file&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;git rm [file]&lt;ul&gt;&lt;li&gt;Tell git not to track the file anymore&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;git diff &amp;#x2013;staged&lt;ul&gt;&lt;li&gt;Show what has been added to the index via git add but not yet committed&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;git diff HEAD&lt;ul&gt;&lt;li&gt;Shows what has changed since the last commit.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;git diff HEAD^&lt;ul&gt;&lt;li&gt;Shows what has changed since the commit before the latest commit&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;git diff [branch]&lt;ul&gt;&lt;li&gt;Compare current branch to some other branch&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;git difftool -d&lt;ul&gt;&lt;li&gt;Same as diff, but opens changes via difftool that you have configured&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;git difftool -d master..&lt;ul&gt;&lt;li&gt;See only changes made in the current branch&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;git diff &amp;#x2013;no-commit-id &amp;#x2013;name-only &amp;#x2013;no-merges origin/master&amp;#x2026;&lt;ul&gt;&lt;li&gt;See only the file names that has changed in current branch&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;git diff &amp;#x2013;stat&lt;ul&gt;&lt;li&gt;See statistics on what files have changed and how&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;git reset [file]&lt;ul&gt;&lt;li&gt;Unstages the file, but preserves its contents&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;git commit&lt;ul&gt;&lt;li&gt;Record changes to git. Default editor will open for a commit message&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;git commit -m &quot;[descriptive message]&quot;&lt;ul&gt;&lt;li&gt;Records file snapshots permanently in version history&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;git commit &amp;#x2013;amend&lt;ul&gt;&lt;li&gt;Changing the history, of the HEAD commit&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;br /&gt;
&lt;li&gt;&lt;b&gt;Group changes&lt;/b&gt;&lt;ul&gt;&lt;li&gt;git branch&lt;ul&gt;&lt;li&gt;Lists all local branches in the current directory&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;git branch [branch-name]&lt;ul&gt;&lt;li&gt;Create a new branch&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;git checkout [branch-name]&lt;ul&gt;&lt;li&gt;Switches to the specified branch and updates the working directory&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;git checkout -b &amp;lt;name&amp;gt; &amp;lt;remote&amp;gt;/&amp;lt;branch&amp;gt;&lt;ul&gt;&lt;li&gt;Switches to a remote branch&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;git checkout [filename]&lt;ul&gt;&lt;li&gt;Return file to it's previous version, if it hasn&amp;#8217;t been staged yet&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;git merge [branch]&lt;ul&gt;&lt;li&gt;Combines the specified branch's history into the current branch&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;git merge &amp;#x2013;no&amp;#x2013;ff [branch]&lt;ul&gt;&lt;li&gt;Merge branch without fast forwarding&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;git branch -a&lt;ul&gt;&lt;li&gt;See the full list of local and remote branches&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;git branch -d [branch]&lt;ul&gt;&lt;li&gt;Deletes the specified branch&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;git branch -D [branch]&lt;ul&gt;&lt;li&gt;Hard branch delete, will not complain&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;git branch -m &amp;lt;old&lt;sub&gt;name&lt;/sub&gt;&amp;gt; &amp;lt;new&lt;sub&gt;name&lt;/sub&gt;&amp;gt;&lt;ul&gt;&lt;li&gt;Rename a branch&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;br /&gt;
&lt;li&gt;&lt;b&gt;Refactor filenames&lt;/b&gt;&lt;ul&gt;&lt;li&gt;git rm [file]&lt;ul&gt;&lt;li&gt;Deletes the file from the working directory and stages the deletion&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;git rm &amp;#x2013;cached [file]&lt;ul&gt;&lt;li&gt;Removes the file from version control but preserves the file locally&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;git mv [file-original] [file-renamed]&lt;ul&gt;&lt;li&gt;Changes the file name and prepares it for commit&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;br /&gt;
&lt;li&gt;&lt;b&gt;Suppress tracking&lt;/b&gt;&lt;ul&gt;&lt;li&gt;.gitignore&lt;ul&gt;&lt;li&gt;*.log&lt;/li&gt;&lt;li&gt;build/&lt;/li&gt;&lt;li&gt;temp-*&lt;/li&gt;&lt;li&gt;A text file named .gitignore suppresses accidental versioning of files and paths matching the specified patterns&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;git ls-files &amp;#x2013;other &amp;#x2013;ignored &amp;#x2013;exclude-standard&lt;ul&gt;&lt;li&gt;Lists all ignored files in this project&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;br /&gt;
&lt;li&gt;&lt;b&gt;Save fragments&lt;/b&gt;&lt;ul&gt;&lt;li&gt;git stash&lt;ul&gt;&lt;li&gt;Temporarily stores all modified tracked files&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;git stash pop&lt;ul&gt;&lt;li&gt;Restores the most recently stashed files&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;git stash list&lt;ul&gt;&lt;li&gt;Lists all stashed changesets&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;git stash drop&lt;ul&gt;&lt;li&gt;Discards the most recently stashed changeset&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;br /&gt;
&lt;li&gt;&lt;b&gt;Review history&lt;/b&gt;&lt;ul&gt;&lt;li&gt;git log&lt;ul&gt;&lt;li&gt;Lists version history for the current branch&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;git log &amp;#x2013;follow [file]&lt;ul&gt;&lt;li&gt;Lists version history for a file, including renames&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;git log &amp;#x2013;pretty=format:&quot;%h %s&quot; &amp;#x2013;graph&lt;ul&gt;&lt;li&gt;Pretty commit view, you can customize it as much as you want&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;git log &amp;#x2013;author='Name' &amp;#x2013;after={1.week.ago} &amp;#x2013;pretty=oneline &amp;#x2013;abbrev-commit&lt;ul&gt;&lt;li&gt;See what the author has worked on in the last week&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;git log &amp;#x2013;no-merges master..&lt;ul&gt;&lt;li&gt;See only changes in this branch&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;git diff [file-branch]&amp;#x2026;[second-branch]&lt;ul&gt;&lt;li&gt;Shows content differences between two branches&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;git show [commit]&lt;ul&gt;&lt;li&gt;Outputs metadata and content changes of the specified commit&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;br /&gt;
&lt;li&gt;&lt;b&gt;Redo commits&lt;/b&gt;&lt;ul&gt;&lt;li&gt;git reset&lt;ul&gt;&lt;li&gt;Unstage pending changes, the changes will still remain on file system&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;git reset [commit/tag]&lt;ul&gt;&lt;li&gt;Undoes all commits after [commit], preserving changes locally&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;git reset &amp;#x2013;hard [commit]&lt;ul&gt;&lt;li&gt;Discards all history and changes back to the specified commit&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;br /&gt;
&lt;li&gt;&lt;b&gt;Synchronize changes&lt;/b&gt;&lt;ul&gt;&lt;li&gt;git fetch [bookmark]&lt;ul&gt;&lt;li&gt;Downloads all history from the repository bookmark&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;git fetch -p&lt;ul&gt;&lt;li&gt;Update history of remote branches, you can fetch and purge&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;git merge [bookmark]/[branch]&lt;ul&gt;&lt;li&gt;Combines bookmark's branch into current local branch&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;git push&lt;ul&gt;&lt;li&gt;Push current branch to remote branch&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;git push [remote] [branch]&lt;ul&gt;&lt;li&gt;Manually specify remote and branch to use every time&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;git push -u origin master&lt;ul&gt;&lt;li&gt;If a remote branch is not set up as an upstream, you can make it so&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;git pull&lt;ul&gt;&lt;li&gt;Downloads bookmark history and incorporates changes&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;git pull [remote] [branch]&lt;ul&gt;&lt;li&gt;Specify to pull a specific branch&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;git remote&lt;ul&gt;&lt;li&gt;See list of remote repos available&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;git remote -v&lt;ul&gt;&lt;li&gt;Detailed view of remote repos available&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;git remote add [remote] [url]&lt;ul&gt;&lt;li&gt;Add a new remote&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;</description>
	</item>

	<item rdf:about="http://luisbg.blogalia.com//historias/75813">
		<title>Notes from the GStreamer Summer Hackfest 2015</title>
		<link>http://luisbg.blogalia.com//historias/75813</link>
		<description>&lt;center&gt;&lt;img width=&quot;900&quot; src=&quot;http://i.imgur.com/7bDfoK1.jpg&quot;&gt;&lt;/center&gt;&lt;br /&gt;
&lt;br /&gt;
A week ago a dozen cool guys, who happen to be &lt;a href=&quot;http://gstreamer.freedesktop.org/&quot;&gt;GStreamer&lt;/a&gt; developers, met at Montpellier for the &lt;a href=&quot;https://wiki.gnome.org/Hackfests/GstSummerHackfest2015&quot;&gt;GStreamer Summer Hackfest 2015&lt;/a&gt;. We got together to work for 3 days, over the weekend, without a fixed agenda. The hacking venue &lt;a href=&quot;http://coworkinmontpellier.org/&quot;&gt;coworkin' Montpellier&lt;/a&gt; was provided by Edward Hervey (bilboed) and most meals were provided by GStreamer.&lt;br /&gt;
&lt;br /&gt;
With the opportunity to work in the same room and enjoy the lovely city of Montpellier, developers speed up the patch reviews and fixes by being able to easily discuss them with colleagues through the high-bandwith low-latency face-to-face protocol. They also took the chance to discuss major features and try to settle on problems that have been waiting for design decisions for a long time in the community. This is a non-exhaustive list of work done in the event: &lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;b&gt;Performance improvement for Caps negotiations&lt;/b&gt;: Caps negotiation is part of the GStreamer applications startup and was vastly optimized. Initial tests show it is taking 49.6% less time to happen.&lt;/li&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;li&gt;&lt;b&gt;nvenc element&lt;/b&gt;: A new nvenc element for recent NVIDIA GPU's was made released. It currently implements h264.&lt;/li&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;li&gt;&lt;b&gt;1.6 release&lt;/b&gt;: At the hackfest a few blocker issues were revisited to get the project ready for releasing version 1.6. This will be a stable release. The release candidate just took place right after the hackfest, the 1.5.90 version.&lt;/li&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;li&gt;&lt;b&gt;decodebin3 design proposal/discussion&lt;/b&gt;: A new version of the playback stack was proposed and discussed. It should maintain the same features of the current version but cover use cases needed by targets with restricted resources, such as embedded devices (TV, mobile, for example), and providing a stream selection API for applications to use. This is a very important feature for Tizen to support more hardware-enabled scenarios in its devices.&lt;/li&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;li&gt;&lt;b&gt;Moving to Phabricator&lt;/b&gt;: The community started experimenting with the recently created Phabricator instance for GSteamer's bug and code tracking. Tweaking of settings and scripts, before a full transition from Bugzilla can be made.&lt;/li&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;li&gt;&lt;b&gt;Improvements on GtkGLSink&lt;/b&gt;: The sink had flickering and scaling noise among some other problems. Most are now fixed.&lt;/li&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;li&gt;&lt;b&gt;libav decoders direct rendering&lt;/b&gt;: Direct rendering allows decoders to write their output directly on screen, increasing performance by reducing the number of memory copies done. The libav video decoders had their direct rendering redone for the new libav API as is now enabled again.&lt;/li&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;li&gt;&lt;b&gt;Others&lt;/b&gt;: improvements to RTP payloaders and depayloadres of different formats, discussions about how to provide more documentation, bug fixes and more. &lt;br /&gt;
Without any major core design decision pending, this hackfest allowed the attendees to work on different areas they wanted to focus on and it was very productive in many fronts. With the GStreamer Conference being around the corner, people in the organizing committee discussed which talks should be accepted and other organizational details.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;
&lt;br /&gt;
A huge gratitude note to our host, Edward Hervey (shown below). The venue was very comfortable, the fridge always stocked and the city a lot of fun!&lt;br /&gt;
&lt;br /&gt;
&lt;center&gt;&lt;img width=&quot;900&quot; src=&quot;http://i.imgur.com/vRwE1AZ.jpg&quot;&gt;&lt;br /&gt;
&lt;i&gt;Lively discussion about GST Streams and decodebin3&lt;/i&gt;&lt;/center&gt;&lt;br /&gt;
&lt;br /&gt;
If you missed the notes from the previous &lt;a href=&quot;https://wiki.gnome.org/Hackfests/GstHackfest2015&quot;&gt;Hackfest&lt;/a&gt;. &lt;a href=&quot;http://blogs.s-osg.org/gstreamer-hackfest-2015/&quot;&gt;Read them here&lt;/a&gt;</description>
	</item>

	<item rdf:about="http://luisbg.blogalia.com//historias/74916">
		<title>Building GStreamer for Mac OS X and iOS</title>
		<link>http://luisbg.blogalia.com//historias/74916</link>
		<description>As part of the &lt;a href=&quot;http://lists.freedesktop.org/archives/gstreamer-announce/2014-September/000329.html&quot;&gt;1.4.3 release of GStreamer&lt;/a&gt; I helped the team by making the OS X and iOS builds. The process is easy but has a long sequence of steps. So it is worth sharing it here just in case you might want to run your own GStreamer in any of these platforms.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;1.&lt;/b&gt; First, you need to download CMake&lt;br /&gt;
http://www.cmake.org/files/v3.0/cmake-3.0.2-Darwin-universal.dmg&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;2.&lt;/b&gt; Add CMake to your PATH&lt;br /&gt;
&lt;code&gt;$ export PATH=$PATH:/Applications/CMake.app/Contents/bin&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;3.&lt;/b&gt; Prepare the destination (as root)&lt;br /&gt;
&lt;code&gt;$ mkdir /Library/Frameworks/GStreamer.framework&lt;br /&gt;
$ chown user:user /Library/Frameworks/GStreamer.framework&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;4.&lt;/b&gt; Check out the GStreamer release code&lt;br /&gt;
&lt;code&gt;$ git clone git://anongit.freedesktop.org/gstreamer/sdk/cerbero&lt;br /&gt;
$ cd cerbero&lt;br /&gt;
$ git checkout -b 1.4 origin/1.4&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;5.&lt;/b&gt; Pin the commits to build&lt;br /&gt;
edit config/osx-universal.cbc to have the following:&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;prefix='/Library/Frameworks/GStreamer.framework/Versions/1.0'&lt;br /&gt;
&lt;br /&gt;
recipes_commits = {&lt;br /&gt;
  'gstreamer-1.0' : '1.4.3',&lt;br /&gt;
  'gstreamer-1.0-static' : '1.4.3',&lt;br /&gt;
  'gst-plugins-base-1.0' : '1.4.3',&lt;br /&gt;
  'gst-plugins-base-1.0-static' : '1.4.3',&lt;br /&gt;
  'gst-plugins-good-1.0' : '1.4.3',&lt;br /&gt;
  'gst-plugins-good-1.0-static' : '1.4.3',&lt;br /&gt;
  'gst-plugins-bad-1.0' : '1.4.3',&lt;br /&gt;
  'gst-plugins-bad-1.0-static' : '1.4.3',&lt;br /&gt;
  'gst-plugins-ugly-1.0' : '1.4.3',&lt;br /&gt;
  'gst-plugins-ugly-1.0-static' : '1.4.3',&lt;br /&gt;
  'gst-libav-1.0' : '1.4.3',&lt;br /&gt;
  'gst-libav-1.0-static' : '1.4.3',&lt;br /&gt;
  'gnonlin-1.0' : '1.2.1',&lt;br /&gt;
  'gnonlin-1.0-static' : '1.2.1',&lt;br /&gt;
  'gst-editing-services-1.0' : '1.2.1',&lt;br /&gt;
  'gst-rtsp-server-1.0' : '1.4.3',&lt;br /&gt;
}&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;6.&lt;/b&gt; Run the bootstrap&lt;br /&gt;
&lt;code&gt;$ ./cerbero-uninstalled bootstrap&lt;br /&gt;
$ echo &quot;allow_parallel_build = True&quot; &gt; ~/.cerbero/cerbero.cbc&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;7.&lt;/b&gt; Run the build for OS X. Patience, it needs to build ~80 modules.&lt;br /&gt;
&lt;code&gt;$ ./cerbero-uninstalled -c config/osx-universal.cbc package gstreamer-1.0&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;8.&lt;/b&gt; Run the build for iOS. Some extra steps are necessary for this build.&lt;br /&gt;
&lt;code&gt;$ ./cerbero-uninstalled -c config/cross-ios-universal.cbc buildone gettext libiconv&lt;br /&gt;
$ ./cerbero-uninstalled -c config/cross-ios-universal.cbc package gstreamer-1.0&lt;br /&gt;
$ ./cerbero-uninstalled -c config/cross-ios-universal.cbc buildone gstreamer-ios-templates&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
edit: The last step, rebuilding gettext and libiconv, is not needed anymore thanks this bug fix&lt;br /&gt;
http://cgit.freedesktop.org/gstreamer/cerbero/commit/?id=b6acf4aa85c1e43b445fd3a292a9109854044df1</description>
	</item>

	<item rdf:about="http://luisbg.blogalia.com//historias/74881">
		<title>Now Samsung @ London</title>
		<link>http://luisbg.blogalia.com//historias/74881</link>
		<description>&lt;center&gt;&lt;img src=&quot;http://www.quickmeme.com/img/d0/d0abe12e7f63cc3aedfbf2ce8e5ccfa5ffd3ecf4d7a386ad999f193f1a950f0d.jpg&quot;&gt;&lt;/center&gt;&lt;br /&gt;
&lt;br /&gt;
I just moved back to Europe, this time to foggy London town, to join the Open Source Group at Samsung. Where I will be contributing upstream to GStreamer and WebKit/Blink during the day and ironically mocking the local hipsters at night.&lt;br /&gt;
&lt;br /&gt;
After 4 years with Collabora it is sad to leave behind the talented and enjoyable people I've grown fond of there, but it's time to move on to the next chapter in my life. The Open Source Group is a perfect fit: contribute upstream, participate in innovative projects and be active in the Open Source community. I am very excited for this new job opportunity and to explore new levels of involvement in Open Source.&lt;br /&gt;
&lt;br /&gt;
I am going to miss Montreal. It's very particular joie de vivre. Will miss the poutine, not the winter.&lt;br /&gt;
&lt;br /&gt;
For all of those in London, I will be joining the next GNOME Beers event or let me know if you want to meet up for a coffee/pint.&lt;br /&gt;
&lt;br /&gt;
&lt;center&gt;&lt;img src=&quot;http://www.beeskool.com/wp-content/uploads/samsung_505_081612094512.jpg&quot;&gt;&lt;/center&gt;</description>
	</item>

	<item rdf:about="http://luisbg.blogalia.com//historias/74602">
		<title>GStreamer and emacs</title>
		<link>http://luisbg.blogalia.com//historias/74602</link>
		<description>&lt;a href=&quot;http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gst-running.html&quot;&gt;Debug logs&lt;/a&gt; are an extremely helpful tool in the &lt;a href=&quot;http://gstreamer.freedesktop.org/&quot;&gt;GStreamer&lt;/a&gt; developer's toolbox.&lt;br /&gt;
Most will say you can't live without them.&lt;br /&gt;
&lt;br /&gt;
Something I've always missed when reading them is a convenient way to jump back and forth between the logs and the source code. So I went ahead and wrote an &lt;a href=&quot;http://www.emacswiki.org/emacs/&quot;&gt;emacs&lt;/a&gt; mini mode that does exactly this:&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;a href=&quot;https://github.com/luisbg/emacs-gstreamer&quot;&gt;emacs-gstreamer&lt;/a&gt;&lt;br /&gt;
an emacs mini module to navigate GStreamer debug logs.&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
When hitting Enter or M-. in a log file it will open the source code to the line that generated that debug message. If you have multiple emacs windows open, it  will open the GStreamer source code file in the second to last active so you can continue reading the log in the active window. If you only have one window open it will open the source code file in the current one. After that you can use your favorite window and buffer handling to surf the files. Read, learn, write, and develop.&lt;br /&gt;
&lt;br /&gt;
&lt;center&gt;&lt;a href=&quot;http://people.collabora.com/~luisbg/emacsgst.webm&quot;&gt;Click here to watch a screencast&lt;/a&gt;&lt;/center&gt;&lt;br /&gt;
&lt;br /&gt;
To get it running you need to have loaded a tags table with the source code. Read &lt;a href=&quot;http://luisbg.blogalia.com/historias/71709&quot;&gt;this other article&lt;/a&gt; to learn how. I run it as part of my &lt;i&gt;gst-uninstalled&lt;/i&gt; script.&lt;br /&gt;
Then just run &lt;b&gt;M-x gst-debug&lt;/b&gt; in the debug log file's buffer.&lt;br /&gt;
&lt;br /&gt;
Let me know if it helps your development workflow!</description>
	</item>

	<item rdf:about="http://luisbg.blogalia.com//historias/74484">
		<title>snappy has arrived to 1.0</title>
		<link>http://luisbg.blogalia.com//historias/74484</link>
		<description>&lt;a href=&quot;https://wiki.gnome.org/Apps/Snappy&quot;&gt;snappy&lt;/a&gt; is an open source media player that gathers the power and flexibility of &lt;a href=&quot;http://gstreamer.freedesktop.org/&quot;&gt;GStreamer&lt;/a&gt; inside the comfort of a minimalistic &lt;a href=&quot;http://blogs.gnome.org/clutter/&quot;&gt;Clutter&lt;/a&gt; interface. &lt;br /&gt;
&lt;br /&gt;
The snappy development team is proud to announce it's &lt;b&gt;1.0 release&lt;/b&gt;.&lt;br /&gt;
Codename: &quot;I'll be back&quot;, Terminator&lt;br /&gt;
&lt;br /&gt;
We think the project has achieved the maturity worthy of a 1.0 release. It does one thing and it does it well.&lt;br /&gt;
&lt;br /&gt;
&lt;center&gt;&lt;img src=&quot;https://wiki.gnome.org/Apps/Snappy?action=AttachFile&amp;do=get&amp;target=snappy_v1.0.png&quot;&gt;&lt;/center&gt;&lt;br /&gt;
&lt;br /&gt;
Some of the &lt;b&gt;changes&lt;/b&gt; you will notice are:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;It&amp;#8217;s been given some needed visual polish&lt;/li&gt;&lt;li&gt;Playback speed adjustable&lt;/li&gt;&lt;li&gt;Video and audio synchronization tweeking&lt;/li&gt;&lt;li&gt;Time left of stream viewer&lt;/li&gt;&lt;li&gt;Better drag and drop&lt;/li&gt;&lt;li&gt;Better media history handling&lt;/li&gt;&lt;li&gt;More features accessible from Clutter interface&lt;/li&gt;&lt;li&gt;Bug fixes&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Features&lt;/b&gt; already included from previous releases:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Subtitle support&lt;/li&gt;&lt;li&gt;Desktop launcher&lt;/li&gt;&lt;li&gt;Video and audio synchronization tweeking.&lt;/li&gt;&lt;li&gt;Multi-screen full-screen&lt;/li&gt;&lt;li&gt;Media queues&lt;/li&gt;&lt;li&gt;History of played media&lt;/li&gt;&lt;li&gt;Seeking/muting/cycling through languages (audio streams)&lt;/li&gt;&lt;li&gt;Frame stepping&lt;/li&gt;&lt;li&gt;Much more&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;center&gt;&lt;b&gt;Download&lt;/b&gt; a tarball: &lt;a href=&quot;https://download.gnome.org/sources/snappy/1.0/snappy-1.0.tar.xz&quot;&gt;xz&lt;/a&gt;&lt;br /&gt;
&lt;b&gt;Clone&lt;/b&gt; the &lt;a href=&quot;https://git.gnome.org/browse/snappy&quot;&gt;git repo&lt;/a&gt;&lt;br /&gt;
Packages in distributions will be updated soon&lt;/center&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://git.gnome.org/browse/snappy/tree/THANKS&quot;&gt;Thanks&lt;/a&gt; to all who helped in snappy's creation! &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Disclaimer: No moose were harmed during the making of this release. One got homesick and an other disappeared for days in a Breaking Bad marathon, but that's about it.</description>
	</item>

	<item rdf:about="http://luisbg.blogalia.com//historias/74475">
		<title>Resilience</title>
		<link>http://luisbg.blogalia.com//historias/74475</link>
		<description>&lt;center&gt;&quot;&lt;i&gt;It always seems impossible until its done.&lt;/i&gt;&quot;&lt;br /&gt;
&lt;a href=&quot;http://en.wikipedia.org/wiki/Nelson_Mandela&quot;&gt;Nelson Mandela&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;img src=&quot;http://i.imgur.com/Sphtv5T.jpg&quot;&gt;&lt;br /&gt;
&amp;#8220;&lt;i&gt;My first Soyuz simulator! Summer 1964, nearly 5 years old.&lt;/i&gt;&quot;&lt;br /&gt;
&lt;a href=&quot;http://en.wikipedia.org/wiki/Chris_Hadfield&quot;&gt;Chris Hadfield&lt;/a&gt;&lt;/center&gt;</description>
	</item>

	<item rdf:about="http://luisbg.blogalia.com//historias/74384">
		<title>Why Coding Is Fun</title>
		<link>http://luisbg.blogalia.com//historias/74384</link>
		<description>&lt;center&gt;&lt;img src=&quot;http://i.imgur.com/BBNlefr.jpg&quot;&gt;&lt;/center&gt;&lt;br /&gt;
&lt;br /&gt;
&quot;&lt;i&gt;First is the &lt;b&gt;sheer joy of making things&lt;/b&gt;. As the child delights in his mud pie, so the adult enjoys building things, especially things of his own design. [...]&lt;br /&gt;
&lt;br /&gt;
Second is the pleasure of making &lt;b&gt;things that are useful&lt;/b&gt; to other people. Deep within, we want others to use our work and to find it helpful. [...]&lt;br /&gt;
&lt;br /&gt;
Third is the fascination of &lt;b&gt;fashioning complex puzzle-like objects&lt;/b&gt; of interlocking moving parts and watching them work in subtle cycles, playing out the consequences of principles built in from the beginning. [...]&lt;br /&gt;
&lt;br /&gt;
Fourth is the joy of always &lt;b&gt;learning&lt;/b&gt;, which springs from the non-repeating nature of the task. In one way or another the problem is ever new, and its solver learns something; sometimes practical, sometimes theoretical, and sometimes both.&lt;br /&gt;
&lt;br /&gt;
Finally, there is the delight of working in such a &lt;b&gt;tractable medium&lt;/b&gt;. The programmer [...] works only &lt;b&gt;slightly removed from pure thought-stuff&lt;/b&gt;. He builds his castles in the air, from air, creating by exertion of the imagination. Few media of creation are so flexible, so easy to polish and rework,so readily capable of realizing gran conceptual structures.&lt;br /&gt;
&lt;br /&gt;
Yet the program construct [...] is real in the sense that &lt;b&gt;it moves and works&lt;/b&gt;, producing visible outputs separate from the construct itself.&lt;/i&gt;&quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;center&gt;From Fred Brooke's &lt;a href=&quot;http://en.wikipedia.org/wiki/The_Mythical_Man-Month&quot;&gt;&quot;Mythical Man Month&quot;&lt;/a&gt;&lt;br /&gt;
Image from &lt;a href=&quot;https://www.kickstarter.com/projects/lindaliukas/hello-ruby&quot;&gt;Hello Ruby&lt;/a&gt;&lt;/center&gt;</description>
	</item>

	<item rdf:about="http://luisbg.blogalia.com//historias/74348">
		<title>OpenStack Swift and Temporary URLs How To</title>
		<link>http://luisbg.blogalia.com//historias/74348</link>
		<description>One of the many amazing features of &lt;a href=&quot;http://docs.openstack.org/developer/swift/&quot;&gt;Swift&lt;/a&gt;, &lt;a href=&quot;https://www.openstack.org/&quot;&gt;OpenStack&lt;/a&gt;'s object storage component, is how it &lt;b&gt;creates URLs to provide temporary public access to objects&lt;/b&gt;. Thanks to the middleware component called &lt;a href=&quot;https://github.com/openstack/swift/blob/master/bin/swift-temp-url&quot;&gt;tempurl&lt;/a&gt;. For example, imagine a website wants to provide a link to a media file stored in Swift for HTML5 playback. Instead of needing a Swift account with public access, and all the problems that would bring, Swift can generate a URL with limited access time to the resource. This way the browser can &lt;b&gt;access the object directly&lt;/b&gt; instead of needing the website to act as a proxy and objects can selectively be made publicly accessible without compromising the rest or using expensive copies between private to public accounts. If the link is accidentally leaked, the &lt;b&gt;access is time limited&lt;/b&gt; until the expiration time set.&lt;br /&gt;
&lt;br /&gt;
So how do you use this temporary urls? Glad you asked.&lt;br /&gt;
&lt;br /&gt;
Let's assume you have the following Swift installation:&lt;br /&gt;
&lt;pre&gt;&lt;code&gt;&lt;b&gt;http://192.168.1.42:8080&lt;/b&gt;

Account: &lt;b&gt;AUTH_data&lt;/b&gt;
Container: &lt;b&gt;media&lt;/b&gt;
Object: &lt;b&gt;example_obj&lt;/b&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
The first thing we need to do is &lt;b&gt;add temporary URL secret keys&lt;/b&gt; to the Swift account. Since tempurl will look at the Temp-URL-Key and Temp-URL-Key-2 metas when an object is requested through a temporary URL to decide if access is allowed. Only one key is neccessary, but a second one is useful to rotate through keys while keeping existing temporary urls validated. Any arbitrary string can serve as a secret key.&lt;br /&gt;
&lt;br /&gt;
We add the temporary urls secret keys with the command:&lt;br /&gt;
&lt;pre&gt;&lt;code&gt;$ &lt;b&gt;swift post -m &quot;Temp-URL-Key:secrete_key_a&quot;&lt;/b&gt;
$ &lt;b&gt;swift post -m &quot;Temp-URL-Key-2:secrete_key_b&quot;&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
Once we have the keys we can allow public access to objects. The easiest way is to use the tool &lt;b&gt;swift-temp-url&lt;/b&gt; which returns a temporary URL. The arguments it needs are; &lt;b&gt;HTTP method&lt;/b&gt;, availability period in &lt;b&gt;seconds&lt;/b&gt;, &lt;b&gt;object path&lt;/b&gt; and one &lt;b&gt;temp-url-key&lt;/b&gt;. For example to GET the object we mentioned above:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;&lt;code&gt;$ &lt;b&gt;swift-temp-url GET 60 /v1/AUTH_data/media/example_obj secret_key_a&lt;/b&gt;

/v1/AUTH_data/media/example_Obj?temp_url_sig=b9746f2e38313635257877abdb8340c48ebd622c&amp;temp_url_expires=1392925673&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
Now you can retrieve the file via this temporary URL, you just need to &lt;b&gt;add the hostname&lt;/b&gt; to have the full URL.&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;&lt;code&gt;$ &lt;b&gt;curl http://192.168.1.42:8080/v1/AUTH_data/media/example_Obj?temp_url_sig=b9746f2e38313635257877abdb8340c48ebd622c&amp;temp_url_expires=1392925673&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
Eventhough you probably already guessed it, let's note the format of the temporary URL. Typical object path, plus temp_url_sig, and temp_url_expires.&lt;br /&gt;
In this example:&lt;br /&gt;
&lt;pre&gt;&lt;code&gt;
http://192.168.1.42:8080/v1/AUTH_data/media/example_Obj?
temp_url_sig=b9746f2e38313635257877abdb8340c48ebd622c&amp;
temp_url_expires=1392925673
&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
There you have it. Notice we set it up for a GET method. You could do the same with a PUT method to allow a user to push data to a specified path. Perhaps using this in combination with browser form post translation middleware to allow direct-from-browser uploads to specific locations in Swift. Besides GET and PUSH, you can use HEAD to retrieve the header of the object.&lt;br /&gt;
&lt;br /&gt;
At this stage you must be happy to see how easy and convenient this is, but wondering how you can integrate it with your code. You can replicate swift-temp-url with the following block of &lt;b&gt;Python code&lt;/b&gt;:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;&lt;code&gt;import hmac
from hashlib import sha1
from time import time

# Get a temporary public url for the object
method = 'GET'
duration_in_seconds = 60*60*3
expires = int(time() + duration_in_seconds)
path = '/v1/AUTH_test/%s/%s' % (self.container, track)
key = self.temp_url_key
hmac_body = '%s\n%s\n%s' % (method, expires, path)
sig = hmac.new(key, hmac_body, sha1).hexdigest()
s = 'https://{host}/{path}?temp_url_sig={sig}&amp;temp_url_expires={expires}'
url = s.format(host=self.url, path=path, sig=sig, expires=expires)&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Have in mind that any alteration of the resource path or query arguments results in a 401 Unauthorized error. Similarly, a PUT where GET was the allowed method returns a 401. HEAD is allowed if GET or PUT is allowed. Changing the X-Account-Meta-Temp-URL-Key invalidates any previously generated temporary URLs within 60 seconds (the memcache time for the key).&lt;br /&gt;
&lt;br /&gt;
That's all for now. What else would you like to learn regarding &lt;b&gt;Swift&lt;/b&gt;?</description>
	</item>


</rdf:RDF>