<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-5416507646115832994</id><updated>2024-10-24T13:18:51.479-06:00</updated><category term="Android"/><category term="Apple"/><category term="iOS"/><category term="Hardware"/><category term="Programming"/><category term="Development"/><category term="iPhone"/><category term="Tablets"/><category term="iPad"/><category term="Mobile"/><category term="iPod"/><category term="Cellphone"/><category term="Market"/><category term="Google"/><category term="Sony"/><category term="Mittra"/><category term="PS3"/><category term="Samsung"/><category term="Games"/><category term="Haskell"/><category term="Nvidia"/><category term="PSP"/><category term="C++"/><category term="Infograph"/><category term="Motorola"/><category term="Reports"/><category term="Security"/><category term="Technology"/><category term="Twitter"/><category term="Videogames"/><category term="oAuth"/><category term="Blackberry"/><category term="LG"/><category term="Mittratter"/><category term="Software"/><category term="Spanish"/><category term="3D"/><category term="API"/><category term="Algorithms"/><category term="Blog"/><category term="FastPost"/><category term="Internet"/><category term="Links"/><category term="Network"/><category term="Ubuntu"/><category term="ARM"/><category term="Deferred Lighting"/><category term="GCM"/><category term="Github"/><category term="Graphics"/><category term="Linux"/><category term="Math"/><category term="Mathematics"/><category term="Netbook"/><category term="Newcastle"/><category term="Nintendo"/><category term="Problems"/><category term="Processor"/><category term="Smarphones"/><category term="Suertudo"/><category term="TCP/IP"/><category term="Vita"/><category term="WP7"/><category term="3DS"/><category term="AI"/><category term="Accelerometer"/><category term="Airplay"/><category term="Authentication"/><category term="Bluetooth"/><category term="CSP"/><category term="Capcom"/><category term="Chrome"/><category term="Cocoa"/><category term="DHCP"/><category term="DNS"/><category term="ETrade"/><category term="Geek"/><category term="HP"/><category term="HTC"/><category term="IPTABLES"/><category term="Kinect"/><category term="Kinnect"/><category term="MacBookPro"/><category term="Microsoft"/><category term="MvsC"/><category term="Nettop"/><category term="OpenDNS"/><category term="OpenFeint"/><category term="Opera"/><category term="PSN"/><category term="Physics"/><category term="Qualcomm"/><category term="RIM"/><category term="Reality"/><category term="SSH"/><category term="Safari"/><category term="Shell"/><category term="Sockets"/><category term="Swift"/><category term="Texas Instruments"/><category term="Tips"/><category term="WebOS"/><category term="Wireless"/><category term="iAd"/><title type='text'>Mittra Software Blog</title><subtitle type='html'>Mobile Devices and Development</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://mittrasw.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5416507646115832994/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://mittrasw.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/5416507646115832994/posts/default?start-index=26&amp;max-results=25&amp;redirect=false'/><author><name>Mittra Software</name><uri>http://www.blogger.com/profile/09954375852101781488</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNOlduh3N2owDQr9ycxnooumei02qLd3Qe1gjwUfRboNE_va3p3fjZfKxdJB1CXQHPIs03R-OGEuB1wgNR8unWjwqtx1t2vrULIZ2Ure1mJ2J9XaKzvfAeViXoRIy_6g/s113/LogoMittra2.png'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>133</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5416507646115832994.post-5617875152118941836</id><published>2017-04-24T16:34:00.001-05:00</published><updated>2017-04-24T16:36:39.831-05:00</updated><title type='text'>MobCur v1.0</title><content type='html'>MobCur is a shorthand for &quot;Mobile Currency&quot;, which is a simple proxy app that connects to the Bitso API that retrieves current prices (in Mexican Pesos) for Bitcoin and Ethereum.&lt;br /&gt;
&lt;br /&gt;
Version 1.0 is a very simple app, it shows the current price, a small 5 minutes candlestick graph, the last 100 transactions, and both sides of the order book.&lt;br /&gt;
&lt;br /&gt;
Later on, if time allows, I will expands its capabilities for other currencies and exchanges, as well as a AppleTV version of it.&lt;br /&gt;
&lt;br /&gt;
I hope you enjoy.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgcYHHNa4GfoSRZ57gOYcNwXp1GgCrc3tOlxfknrmLJuAk9MhLe4aBKmIF8bkaEu_ZUSqTNUhRsJfW6PCXTeZrEDd7OEpTTVbSOYHkURLCuh2iWn76qxTxEWSlBpGSIdmxMyUd4bVQ8Ho5J/s1600/Simulator+Screen+Shot+24+Apr+2017%252C+2.36.09+PM.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgcYHHNa4GfoSRZ57gOYcNwXp1GgCrc3tOlxfknrmLJuAk9MhLe4aBKmIF8bkaEu_ZUSqTNUhRsJfW6PCXTeZrEDd7OEpTTVbSOYHkURLCuh2iWn76qxTxEWSlBpGSIdmxMyUd4bVQ8Ho5J/s320/Simulator+Screen+Shot+24+Apr+2017%252C+2.36.09+PM.png&quot; width=&quot;180&quot; height=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mittrasw.blogspot.com/feeds/5617875152118941836/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mittrasw.blogspot.com/2017/04/mobcur-v10.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5416507646115832994/posts/default/5617875152118941836'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5416507646115832994/posts/default/5617875152118941836'/><link rel='alternate' type='text/html' href='http://mittrasw.blogspot.com/2017/04/mobcur-v10.html' title='MobCur v1.0'/><author><name>Mittra Software</name><uri>http://www.blogger.com/profile/09954375852101781488</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNOlduh3N2owDQr9ycxnooumei02qLd3Qe1gjwUfRboNE_va3p3fjZfKxdJB1CXQHPIs03R-OGEuB1wgNR8unWjwqtx1t2vrULIZ2Ure1mJ2J9XaKzvfAeViXoRIy_6g/s113/LogoMittra2.png'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgcYHHNa4GfoSRZ57gOYcNwXp1GgCrc3tOlxfknrmLJuAk9MhLe4aBKmIF8bkaEu_ZUSqTNUhRsJfW6PCXTeZrEDd7OEpTTVbSOYHkURLCuh2iWn76qxTxEWSlBpGSIdmxMyUd4bVQ8Ho5J/s72-c/Simulator+Screen+Shot+24+Apr+2017%252C+2.36.09+PM.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5416507646115832994.post-2158969794203119654</id><published>2016-05-27T21:22:00.001-05:00</published><updated>2016-05-27T21:22:29.449-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Authentication"/><category scheme="http://www.blogger.com/atom/ns#" term="ETrade"/><category scheme="http://www.blogger.com/atom/ns#" term="Haskell"/><category scheme="http://www.blogger.com/atom/ns#" term="Network"/><category scheme="http://www.blogger.com/atom/ns#" term="oAuth"/><title type='text'>OAuth 1.0a for ETrade API using Haskell</title><content type='html'>Lately, I have been interested in creating a market quotes receiver which later on, using a DB and ML algorithms, will analyze the market movements and provide suggestions for better investments. But initially, I had to connect to an API provided, for which I found &lt;a href=&quot;https://developer.etrade.com/&quot;&gt;ETrade&lt;/a&gt;, which is an Online Broker stablished in the USA which has a REST API to request quotes, account data or even place orders to the Stock Exchange. &lt;br /&gt;
&lt;br /&gt;
I have been long time fan of Haskell, but I had never engaged with a long term project to learn more about the language, the platform and all its possibilities, although I have a book pending to continue writing about Haskell FRP for Game development, this project seems like a good time/learn investment for long term goals: apply category theory, learn to trade stocks, explore Machine Learning algorithms and many more. &lt;br /&gt;
&lt;br /&gt;
For all that, I started doing authentication to the platform, considering that I had to email ETrade customer service to request a Auth public/private key, then later with those in file, I created this script which will perform all necessary steps to retrieve a access token, which would allow me to query everything within the Sandbox: so here is the code:&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;pre style=&quot;background-image: URL(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDcLzOu68WD23doPIL1hcHvui3PV91vF_jVyFuN8oSOBz2BT4pWEgJPomHs2Zk-c1BVA71ID8VhWoIqpKUySz-Ixq5bxIJU431ktIkL-vURX0KNxnt7BHwmM_W-4CO3UAuWXL6OgHsOOwV/s320/codebg.gif); background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;&quot;&gt;&lt;code style=&quot;color: black; word-wrap: normal;&quot;&gt;{-# LANGUAGE OverloadedStrings #-}

module Network.Authenticate.ETradeOAuth
where

import           Data.ByteString         as BS
import           Data.ByteString.Char8   as C8 (pack, unpack)
import           Data.List               as ML
import           Data.Maybe
import           Network.HTTP.Client
import           Network.HTTP.Client.TLS
import           Network.HTTP.Types.URI
import           System.Environment
import           System.IO               ()
import           Web.Authenticate.OAuth
import           Web.Browser

authToken :: ByteString
authToken = &quot;oauth_token&quot;

-- OAuth Object to use when communicating with
-- ETrade developer API. Also, it must define
-- the two fields: oauthConsumerKey and oauthConsumerSecret
-- to be able to stablish a succesful communication.
-- For more information:
-- https://developer.etrade.com/ctnt/dev-portal/getArticleByCategory?category=Documentation
oa :: OAuth
oa = newOAuth {
    oauthServerName      = &quot;ETrade&quot;
  , oauthRequestUri      = &quot;https://etws.etrade.com/oauth/request_token&quot;
  , oauthAccessTokenUri  = &quot;https://etws.etrade.com/oauth/access_token&quot;
  , oauthAuthorizeUri    = &quot;https://us.etrade.com/e/t/etws/authorize&quot;
  , oauthSignatureMethod = HMACSHA1
  , oauthVersion         = OAuth10a
  , oauthConsumerKey     = undefined
  , oauthConsumerSecret  = undefined
  , oauthCallback        = Just &quot;oob&quot;
  }

-- We use a tlsManager to communicate using HTTPS
mgr :: IO Manager
mgr = newManager tlsManagerSettings

-- OAuth can construct automatically the authorization
-- URL, however ETrade uses another structure, which
-- is depicted as follows:
-- https://us.etrade.com/e/t/etws/authorize?key={oauth_consumer_key}&amp;amp;token={oauth_token}
etradeAuthUri :: OAuth -&amp;gt; Credential -&amp;gt; ByteString
etradeAuthUri oa crd = BS.concat [authUri, &quot;?key=&quot;, consumerKey, &quot;&amp;amp;token=&quot;, token]
    where
        authUri = C8.pack $ oauthAuthorizeUri oa
        token = urlEncode True $ findAuth $ unCredential crd
        consumerKey = urlEncode True $ oauthConsumerKey oa

-- Helper function to find the OAuth token out of a temporal credential
findAuth :: [(ByteString, ByteString)] -&amp;gt; ByteString
findAuth x = snd $ fromJust findAction
    where
        findFunction a = authToken == fst a
        findAction = ML.find findFunction x

-- This will innitiate the OAuth process, using an OAuth object and
-- a TLS Manager to asking for a temporary credential, with which it
-- will redirect the user to a ETrade webpage in which access is
-- authorized and a confirmation string is provided
doInitialAuth :: OAuth -&amp;gt; Manager -&amp;gt; IO Credential
doInitialAuth oa m = do
    temp &lt;- --=&quot;&quot; -=&quot;&quot; ::=&quot;&quot; able=&quot;&quot; access=&quot;&quot; all=&quot;&quot; an=&quot;&quot; are=&quot;&quot; as=&quot;&quot; authurl=&quot;&quot; c8.unpack=&quot;&quot; confirmation=&quot;&quot; doaccessauth=&quot;&quot; for=&quot;&quot; gettemporarycredential=&quot;&quot; in=&quot;&quot; let=&quot;&quot; m=&quot;&quot; make=&quot;&quot; oa=&quot;&quot; oauth=&quot;&quot; openbrowser=&quot;&quot; place=&quot;&quot; platform=&quot;&quot; request=&quot;&quot; return=&quot;&quot; string=&quot;&quot; subsequently=&quot;&quot; temp=&quot;&quot; the=&quot;&quot; to=&quot;&quot; token=&quot;&quot; use=&quot;&quot; we=&quot;&quot; which=&quot;&quot; will=&quot;&quot; with=&quot;&quot;&gt; Manager -&amp;gt; ByteString -&amp;gt; Credential -&amp;gt; IO Credential
doAccessAuth oa m verifier tempCred = getAccessToken oa cred m
    where cred = injectVerifier verifier tempCred

main :: IO Credential
main = do
    print &quot;This script will request an OAuth Token and Open the browser&quot;
    m &lt;- a=&quot;&quot; answer=&quot;&quot; bs.getline=&quot;&quot; bs.null=&quot;&quot; code=&quot;&quot; confirm=&quot;&quot; confirmation=&quot;&quot; continue=&quot;&quot; cred=&quot;&quot; do=&quot;&quot; doaccessauth=&quot;&quot; doinitialauth=&quot;&quot; else=&quot;&quot; if=&quot;&quot; m=&quot;&quot; mgr=&quot;&quot; newcredential=&quot;&quot; oa=&quot;&quot; ot=&quot;&quot; print=&quot;&quot; requests:=&quot;&quot; return=&quot;&quot; rovide=&quot;&quot; string=&quot;&quot; temp=&quot;&quot; the=&quot;&quot; then=&quot;&quot; to=&quot;&quot; uth=&quot;&quot; valid=&quot;&quot;&gt;&lt;/-&gt;&lt;/-&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
Of course, the source could be found in &lt;a href=&quot;https://github.com/rhvall/HaskellScripts/blob/master/Networking/Authenticate/ETrade-OAuth-Example.hs&quot;&gt;Github&lt;/a&gt; with a GPL v3 license.&lt;br /&gt;
&lt;br /&gt;
In general terms, we need to install and import the following libraries:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;bytestring&lt;/li&gt;
&lt;li&gt;authenticate-oauth&lt;/li&gt;
&lt;li&gt;http-client&lt;/li&gt;
&lt;li&gt;http-client-tls&lt;/li&gt;
&lt;li&gt;open-browser&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
With those already in place, it would be as simple as replace the values &quot;oauthConsumerKey&quot; and &quot;oauthConsumerSecret&quot; for those provided by ETrade or any other OAuth 1.0a service. Of course, if using other service, request URIs needs to be replaced. &lt;br /&gt;
&lt;br /&gt;
After that, it is as simple as running this line: &lt;br /&gt;
&lt;pre style=&quot;background-image: URL(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDcLzOu68WD23doPIL1hcHvui3PV91vF_jVyFuN8oSOBz2BT4pWEgJPomHs2Zk-c1BVA71ID8VhWoIqpKUySz-Ixq5bxIJU431ktIkL-vURX0KNxnt7BHwmM_W-4CO3UAuWXL6OgHsOOwV/s320/codebg.gif); background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;&quot;&gt;&lt;code style=&quot;color: black; word-wrap: normal;&quot;&gt;runhaskell ETrade-OAuth-Example.hs.hs
&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
That will automatically run main, which creates a TLS manager, request a token, opens the native OS browser to authorize the application and waits for the access code to finally request an access token from the API. All these steps were simplified using the OAuth library and the code snippet.&lt;br /&gt;
&lt;br /&gt;
Of course, I am open to suggestion on how to improve this code is handled to make it more approachable to other interests. &lt;br /&gt;
&lt;br /&gt;
Further Reading:&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://github.com/rhvall/HaskellScripts/blob/master/Networking/Authenticate/ETrade-OAuth-Example.hs&quot;&gt;Github Source Code Link&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;https://developer.etrade.com/&quot;&gt;Etrade Developer Documentation&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://oauth.net/core/1.0a/&quot;&gt;OAuth Authentication process&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://mittrasw.blogspot.com/feeds/2158969794203119654/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mittrasw.blogspot.com/2016/05/oauth-10a-for-etrade-api-using-haskell.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5416507646115832994/posts/default/2158969794203119654'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5416507646115832994/posts/default/2158969794203119654'/><link rel='alternate' type='text/html' href='http://mittrasw.blogspot.com/2016/05/oauth-10a-for-etrade-api-using-haskell.html' title='OAuth 1.0a for ETrade API using Haskell'/><author><name>Mittra Software</name><uri>http://www.blogger.com/profile/09954375852101781488</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNOlduh3N2owDQr9ycxnooumei02qLd3Qe1gjwUfRboNE_va3p3fjZfKxdJB1CXQHPIs03R-OGEuB1wgNR8unWjwqtx1t2vrULIZ2Ure1mJ2J9XaKzvfAeViXoRIy_6g/s113/LogoMittra2.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5416507646115832994.post-6866483347245734648</id><published>2016-03-22T19:59:00.003-06:00</published><updated>2016-03-22T20:14:29.119-06:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Security"/><category scheme="http://www.blogger.com/atom/ns#" term="Software"/><category scheme="http://www.blogger.com/atom/ns#" term="Spanish"/><title type='text'>Confidencialidad</title><content type='html'>Bajo este rubro, la idea es mantener los mensajes e información secretos, confidenciales. Por ejemplo, utilizando los personajes de la comunicación, hacer que Ana o Juan se comuniquen sin que Eva o María descifren la información que comparten.&lt;br /&gt;
&lt;br /&gt;
Para conseguir confidencialidad, la mayoría de los sistemas utilizan algún tipo de cifrado de tal manera que, si el texto es entremezclado, se aplica una función inversa que recupere el mensaje como originalmente fue creado.&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
Existe también una distinción entre codificar y cifrar; la primera solo modifica la representación inicial, y cualquiera que conozca el método de codificación debería ser capaz de leer los datos. En el segundo caso, cuando los mensajes son cifrados utilizando llaves digitales, se logra confidencialidad ya que es necesario poseer tal acceso para descifrar los contenidos originales.&lt;br /&gt;
&lt;br /&gt;
A su vez se tienen técnicas de estenografía, la cual utiliza métodos inusuales de comunicación como pueden ser imágenes o audio, en donde se utilizan las repeticiones de, por ejemplo, la letra “A”, para representar un cierta información, y así transmitir, confidencialmente, el mensaje; esto se logra mientras el “adversario” desconozca los patrones utilizados por el algoritmo. Por supuesto, estas técnicas no son tan sólidas en comparación con el cifrado.&lt;br /&gt;
&lt;br /&gt;
Otro ejemplo de confidencialidad se encuentra en el control de acceso, con archivos “ultra secretos” que solo cierto personal puede acceder; también la visualización parcial en bases de datos, donde, a las requisiciones de los usuarios se les provee de información digerida de acuerdo al acceso en vez de a toda la tabla en bruto, manteniendo la confidencialidad de las demás entradas en la base de datos.&lt;br /&gt;
&lt;br /&gt;
&lt;iframe width=&quot;480&quot; height=&quot;320&quot; src=&quot;https://www.youtube.com/embed/pfXTvWXg9ic&quot; frameborder=&quot;0&quot; allowfullscreen&gt;&lt;/iframe&gt;</content><link rel='replies' type='application/atom+xml' href='http://mittrasw.blogspot.com/feeds/6866483347245734648/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mittrasw.blogspot.com/2016/03/confidencialidad.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5416507646115832994/posts/default/6866483347245734648'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5416507646115832994/posts/default/6866483347245734648'/><link rel='alternate' type='text/html' href='http://mittrasw.blogspot.com/2016/03/confidencialidad.html' title='Confidencialidad'/><author><name>Mittra Software</name><uri>http://www.blogger.com/profile/09954375852101781488</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNOlduh3N2owDQr9ycxnooumei02qLd3Qe1gjwUfRboNE_va3p3fjZfKxdJB1CXQHPIs03R-OGEuB1wgNR8unWjwqtx1t2vrULIZ2Ure1mJ2J9XaKzvfAeViXoRIy_6g/s113/LogoMittra2.png'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img.youtube.com/vi/pfXTvWXg9ic/default.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5416507646115832994.post-6514192674489221864</id><published>2016-03-17T21:52:00.000-06:00</published><updated>2016-03-17T22:21:09.549-06:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Security"/><category scheme="http://www.blogger.com/atom/ns#" term="Software"/><category scheme="http://www.blogger.com/atom/ns#" term="Spanish"/><title type='text'>Autorización</title><content type='html'>El video anterior se hablaba de los métodos para descubrir con quién se estaba comunicando, ahora bien, el objetivo primordial de la autorización es determinar que las actividades que cierta entidad reconocida son legítimas, en otras palabras, que las acciones a ejecutar en un sistema son validas para los permisos que se tengan como usuario del sistema.&lt;br /&gt;
&lt;br /&gt;
Un ejemplo sencillo como el siguiente: se tiene a un usuario autentificado en el sistema (Ana), una vez se tiene una sesión válida, ella quiere ejecutar un archivo en una sección solo “autorizada” para administradores, entonces el Sistema Operativo lleva a cabo una verificación por medio de la “Lista de Control de Acceso”, en la cual se comparan los permisos de Ana para comprobar si forma parte del grupo “administradores” y así permitirle ejecutar dicho programa.&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;h3&gt;Listas de Control de Acceso&lt;/h3&gt;A continuación se tiene un ejemplo básico de una lista donde las columnas determinan las categorías que impactan en el sistema; las hileras permiten identificar a los usuarios con los permisos asociados a su sesión.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Usuario&lt;/b&gt;  | &lt;b&gt;Recurso&lt;/b&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; | &lt;b&gt;Rol&lt;/b&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;| &lt;b&gt;Privilegio&lt;/b&gt;&lt;br /&gt;
Maria &amp;nbsp; &amp;nbsp; |  /home/maria/* &amp;nbsp; |      usuario &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; | Lectura, escritura, ejecución&lt;br /&gt;
Juan &amp;nbsp; &amp;nbsp; &amp;nbsp; |     /home/juan/*  /*  | administrador | Lectura, escritura, ejecución&lt;br /&gt;
&lt;br /&gt;
Como podemos identificar, María puede leer, escribir o ejecutar únicamente en directorios derivados de su directorio de acceso; por otro lado, Juan puede hacer lo mismo tanto con su folder de inicio como en la raíz del sistema, lo cual también  es derivado del rol asignado, como se muestra, un usuario normal o un administrador.&lt;br /&gt;
&lt;h3&gt;Modelos de Control de Acceso&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Obligatorio&lt;/b&gt;: el sistema operativo determina exactamente quién tiene acceso a cuáles recursos.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Discrecional&lt;/b&gt;: Como en Sistemas UNIX, los usuarios autorizados determinan que otros usuarios acceden a los archivos o recursos que pueden crear, usar y mantener.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Basado en Roles&lt;/b&gt;: Al contrario del discrecional, aquí se generan roles, a los cuales los usuarios se adhieren para determinar los privilegios de acceso.&lt;/li&gt;
&lt;/ul&gt;Derivado de esta clasificación, se tiene uno en particular llamado el Modelo Bell-LaPadula; muy popular su uso en entornos militares, es no discrecional y permite clasificar los recursos a proteger en: Ultra Secreto, Secreto, Confidencial o desclasificado, los cuales son asignados tanto a usuarios como objetos dentro del sistema y se siguen 3 reglas básicas:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;b&gt;Propiedad simple&lt;/b&gt;: Un usuario no puede acceder a los recursos con clasificaciones mayores a las asignadas a su rol. También se le conoce como “sin lectura superior”.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Propiedad estrella (de confinamiento)&lt;/b&gt;: Recursos creados en cierta clasificación solo pueden ser leídos por usuarios con acceso del mismo tipo o mayor, o también “regla de no escritura inferior”.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Propiedad de tranquilidad&lt;/b&gt;: No se le permite a ningún objeto cambiar su nivel de clasificación a menos que no haya algún otro lector o escritor de tal documento en el sistema.&lt;/li&gt;
&lt;/ul&gt;Este modelo permite reducir fugas de información cuando lo usuarios respetas reglas del sistema.&lt;br /&gt;
&lt;br /&gt;
&lt;iframe width=&quot;480&quot; height=&quot;320&quot; src=&quot;https://www.youtube.com/embed/WgDQ2q43pCY&quot; frameborder=&quot;0&quot; allowfullscreen&gt;&lt;/iframe&gt;</content><link rel='replies' type='application/atom+xml' href='http://mittrasw.blogspot.com/feeds/6514192674489221864/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mittrasw.blogspot.com/2016/03/autorizacion-el-video-anterior-se.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5416507646115832994/posts/default/6514192674489221864'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5416507646115832994/posts/default/6514192674489221864'/><link rel='alternate' type='text/html' href='http://mittrasw.blogspot.com/2016/03/autorizacion-el-video-anterior-se.html' title='Autorización'/><author><name>Mittra Software</name><uri>http://www.blogger.com/profile/09954375852101781488</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNOlduh3N2owDQr9ycxnooumei02qLd3Qe1gjwUfRboNE_va3p3fjZfKxdJB1CXQHPIs03R-OGEuB1wgNR8unWjwqtx1t2vrULIZ2Ure1mJ2J9XaKzvfAeViXoRIy_6g/s113/LogoMittra2.png'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img.youtube.com/vi/WgDQ2q43pCY/default.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5416507646115832994.post-7198079161412324245</id><published>2016-03-10T21:11:00.004-06:00</published><updated>2016-03-14T20:27:27.327-06:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Security"/><category scheme="http://www.blogger.com/atom/ns#" term="Software"/><category scheme="http://www.blogger.com/atom/ns#" term="Spanish"/><title type='text'>Autenticación</title><content type='html'>En futuras entradas, vamos a utilizar a los siguientes personajes para explicar como se establece comunicación entre partes:&lt;br /&gt;
&lt;br /&gt;
Ana &amp;amp; Juan - Chicos buenos&lt;br /&gt;
Eva - Chismosa pasiva&lt;br /&gt;
María - Chismosa activa&lt;br /&gt;
Tomas - Ana &amp;amp; Juan confían en él&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;Autenticación&lt;/h3&gt;Nos permite verificar la identidad de una persona ante un sistema computacional. Para esto es necesario asegurar que la comunicación entre Ana &amp;amp; Juan es verificada sin que terceras partes (Eva o María) sustituyan la identidad de alguno. Básicamente podemos clasificar a las formas genéricas en tres:&lt;br /&gt;
&lt;br /&gt;
- Algo que “Sabes” (por ejemplo, contraseñas).&lt;br /&gt;
- Algo que “Tienes” (por ejemplo, token).&lt;br /&gt;
- Algo que “Eres” (por ejemplo, biométricos).&lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;h3&gt;Algo que “Sabes”&lt;/h3&gt;El ejemplo clásico son las “Contraseñas”: Son fáciles de implementar ya que su uso generalizado permite a las personas entender su utilización. En contra pueden darse a conocer si tienen pocos caracteres o si son utilizados en muchos sitios y alguno de ellos es comprometido.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;Algo que “Tienes”&lt;/h3&gt;Esta forma permite generar información dinámica con respecto a un elemento al que se tiene acceso, por ejemplo un mensaje SMS enviado al teléfono celular, también se tienen tokens digitales, “Smart Cards” o aplicaciones generadoras de PIN. Esto permite incrementar la dificultad para que un atacante sea autentificado.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;Algo que “Eres”&lt;/h3&gt;Existen varios métodos que permiten identificar a un usuario por medio de los parámetros biométricos que son parte de la persona, por ejemplo un escáner retinal, detector de huellas dactilares o reconocimiento facial, entre otros. Aquí se tiene como principal ventaja el hecho de incrementar la seguridad del sistema; por otro lado, los datos obtenidos puede generar un alto número de falsos positivos, así como gozar de menor popularidad entre usuarios cuando tienden a ser muy intrusivos (escáner de iris).&lt;br /&gt;
&lt;br /&gt;
Es importante recordar los siguientes casos:&lt;br /&gt;
&lt;br /&gt;
- Falso Positivo: Un usuario auténtico es rechazado como tal.&lt;br /&gt;
- Falso Negativo: Un impostor es autentificado.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;Notas importantes&lt;/h3&gt;Diferentes formas genéricas de autenticación pueden ser utilizadas al mismo tiempo para aumentar la seguridad del sistema. También se debe considerar al tipo de usuario que se quiere autorizar, si es persona a computadora ó entre computadoras. Esto nos permite diferenciar tres tipos:&lt;br /&gt;
&lt;br /&gt;
- Clientes: Un servidor verifica el identificador del cliente&lt;br /&gt;
- Servidores: Un cliente verifica el identificador del servidor&lt;br /&gt;
- Mutua: Ambas partes verifican la autenticidad del otro.&lt;br /&gt;
&lt;br /&gt;
Una vez que el usuario a sido autentificado, se le considera “Principal”.&lt;br /&gt;
&lt;br /&gt;
&lt;iframe allowfullscreen=&quot;&quot; frameborder=&quot;0&quot; height=&quot;320&quot; src=&quot;https://www.youtube.com/embed/7GwkrPnVPfY&quot; width=&quot;480&quot;&gt;&lt;/iframe&gt;</content><link rel='replies' type='application/atom+xml' href='http://mittrasw.blogspot.com/feeds/7198079161412324245/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mittrasw.blogspot.com/2016/03/autentificacion.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5416507646115832994/posts/default/7198079161412324245'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5416507646115832994/posts/default/7198079161412324245'/><link rel='alternate' type='text/html' href='http://mittrasw.blogspot.com/2016/03/autentificacion.html' title='Autenticación'/><author><name>Mittra Software</name><uri>http://www.blogger.com/profile/09954375852101781488</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNOlduh3N2owDQr9ycxnooumei02qLd3Qe1gjwUfRboNE_va3p3fjZfKxdJB1CXQHPIs03R-OGEuB1wgNR8unWjwqtx1t2vrULIZ2Ure1mJ2J9XaKzvfAeViXoRIy_6g/s113/LogoMittra2.png'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img.youtube.com/vi/7GwkrPnVPfY/default.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5416507646115832994.post-8737308952228413398</id><published>2016-03-07T20:15:00.000-06:00</published><updated>2016-03-14T20:24:44.111-06:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Security"/><category scheme="http://www.blogger.com/atom/ns#" term="Software"/><category scheme="http://www.blogger.com/atom/ns#" term="Spanish"/><title type='text'>Objetivos de Seguridad</title><content type='html'>La seguridad se debe tratar desde una perspectiva holística, en otras palabras, es necesario cumplir varios requisitos antes de considerar un entorno de Tecnologías de la Información “seguro”.&lt;br /&gt;
&lt;br /&gt;
Muchísimos detalles pueden resultar en imprevistos inesperados que afecten la continuidad de un servicio, en su mayoría relacionados con tecnología. De forma genérica, es posible clasificar en tres: entorno físico, tecnología, políticas y procedimientos. Es típico contar con estos elementos si lo que se busca como prioridad seguridad de un sistema.&lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;h3&gt;Seguridad Física&lt;/h3&gt;&lt;br /&gt;
Un atacante siempre va a buscar la manera más fácil de acceder a información protegida en base a la ley del menor esfuerzo, por lo mismo, se tiene que proteger la ubicación de las instalaciones, limitando acceso al espacio de trabajo, centro de datos o cuales quiera sean los activos a resguardar.&lt;br /&gt;
&lt;br /&gt;
Otro ejemplo se encuentra en los documentos que se tiran a la basura sin verificar si la información que portan es destruida, ya que personal no autorizado podría acceder a su contenido, tan simple como triturar los papeles disminuiría las probabilidades de fuga de información.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;Seguridad Tecnológica&lt;/h3&gt;&lt;br /&gt;
Primordialmente orientado a la protección de la información digital, ya que existen diversas capas en la forma de proveer datos, en otras palabras, “seguridad de la aplicación”: procesos de identificación, validación de privilegios, configuración de servidores o la interpretación de contenido externo.&lt;br /&gt;
&lt;br /&gt;
Así también, se consideran bajo esta categoría otras aplicaciones o librerías que interactúan con el software principal, el sistema operativo sobre el cual es ejecutado, seguridad en la red local - extendida o herramientas de detección de intrusos o cortafuegos.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;Políticas y Procedimientos&lt;/h3&gt;&lt;br /&gt;
Aquí englobamos ataques de ingeniería social, donde un hacker puede contactar con un empleado con suficientes privilegios de lectura u/o escritura a recursos resguardados, en el cual se permite “trabajar” a la persona para que ceda claves de acceso y así provocar intrusiones ilícitas. Para protegerse, es necesario establecer políticas corporativas que marquen la pauta en como debe tratarse la información pública y privada, así como los procedimientos a seguir para tareas genéricas.&lt;br /&gt;
&lt;br /&gt;
Es necesario mantener a los empleados conscientes, educados y vigilantes del entorno así del como tratar los activos de la compañía, por medio de cursos de introducción que generen una cultura de resguardo de activos físicos o digitales.&lt;br /&gt;
&lt;br /&gt;
Para todo esto, es primordial el considerar minuciosamente estos tipos de seguridad (física, tecnológica, políticas y procedimientos), ya que los atacantes van a tomar ventaja de cualquier debilidad y así poder acceder a la información.&lt;br /&gt;
&lt;br /&gt;
&lt;iframe width=&quot;480&quot; height=&quot;320&quot; src=&quot;https://www.youtube.com/embed/GHUysALzlyc&quot; frameborder=&quot;0&quot; allowfullscreen&gt;&lt;/iframe&gt;</content><link rel='replies' type='application/atom+xml' href='http://mittrasw.blogspot.com/feeds/8737308952228413398/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mittrasw.blogspot.com/2016/03/objetivos-de-seguridad.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5416507646115832994/posts/default/8737308952228413398'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5416507646115832994/posts/default/8737308952228413398'/><link rel='alternate' type='text/html' href='http://mittrasw.blogspot.com/2016/03/objetivos-de-seguridad.html' title='Objetivos de Seguridad'/><author><name>Mittra Software</name><uri>http://www.blogger.com/profile/09954375852101781488</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNOlduh3N2owDQr9ycxnooumei02qLd3Qe1gjwUfRboNE_va3p3fjZfKxdJB1CXQHPIs03R-OGEuB1wgNR8unWjwqtx1t2vrULIZ2Ure1mJ2J9XaKzvfAeViXoRIy_6g/s113/LogoMittra2.png'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img.youtube.com/vi/GHUysALzlyc/default.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5416507646115832994.post-3360463187245553966</id><published>2015-11-05T20:24:00.000-06:00</published><updated>2015-11-05T20:25:43.207-06:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Apple"/><category scheme="http://www.blogger.com/atom/ns#" term="Development"/><category scheme="http://www.blogger.com/atom/ns#" term="Swift"/><category scheme="http://www.blogger.com/atom/ns#" term="Videogames"/><title type='text'>PuzzleGony</title><content type='html'>This is the first app I have developed in years as freelancer, a very simple game targeted for Apple Devices: Mac, iOS and Apple TV</content><link rel='replies' type='application/atom+xml' href='http://mittrasw.blogspot.com/feeds/3360463187245553966/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mittrasw.blogspot.com/2015/11/puzzlegony.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5416507646115832994/posts/default/3360463187245553966'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5416507646115832994/posts/default/3360463187245553966'/><link rel='alternate' type='text/html' href='http://mittrasw.blogspot.com/2015/11/puzzlegony.html' title='PuzzleGony'/><author><name>Mittra Software</name><uri>http://www.blogger.com/profile/09954375852101781488</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNOlduh3N2owDQr9ycxnooumei02qLd3Qe1gjwUfRboNE_va3p3fjZfKxdJB1CXQHPIs03R-OGEuB1wgNR8unWjwqtx1t2vrULIZ2Ure1mJ2J9XaKzvfAeViXoRIy_6g/s113/LogoMittra2.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5416507646115832994.post-3785488651108643694</id><published>2013-11-22T20:41:00.002-06:00</published><updated>2013-11-22T21:05:43.916-06:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Algorithms"/><category scheme="http://www.blogger.com/atom/ns#" term="Haskell"/><category scheme="http://www.blogger.com/atom/ns#" term="Mathematics"/><category scheme="http://www.blogger.com/atom/ns#" term="Problems"/><category scheme="http://www.blogger.com/atom/ns#" term="Programming"/><title type='text'>Word capitalization with Haskell</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjLlpQZtTh_Zwq0ql5tl_P_C7gZpNMDK8qmPM2G0cTHxSGpP6b9O2N9jJv2d-7gZTSYQlAOrOlo_fZAls9kFRqnuNGjstd7vyMbZZaligu6Z9-Ps2_CntWm-efZYlWAvygzEV6wpfraHz5f/s1600/trie.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjLlpQZtTh_Zwq0ql5tl_P_C7gZpNMDK8qmPM2G0cTHxSGpP6b9O2N9jJv2d-7gZTSYQlAOrOlo_fZAls9kFRqnuNGjstd7vyMbZZaligu6Z9-Ps2_CntWm-efZYlWAvygzEV6wpfraHz5f/s320/trie.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
We have this problem, given a string of words, capitalize just the first letter, but the main trouble here is the lack of a common pattern to distinguish between one and another, for example:&lt;br /&gt;
&lt;br /&gt;
&quot;helloanyonethere&quot; -&amp;gt; &quot;HelloAnyoneThere&quot;&lt;br /&gt;
&quot;himartin&quot; -&amp;gt; &quot;HiMartin&quot;&lt;br /&gt;
&quot;hellorange&quot; -&amp;gt; &quot;HelloRange&quot;&lt;br /&gt;
&quot;thereach&quot; -&amp;gt; &quot;TheReach&quot;&lt;br /&gt;
&lt;br /&gt;
Well, the trouble can be addressed using Haskell, list and the always opportune recursion. The input information would be a dictionary that contains all possible words and the string to analyze; the output should be an string with the capitalized letters.&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
Now, lets explain the code step by step, first we need a function that search a string in a list of strings, which is simple, just tell me if the element is contained in the list.&lt;br /&gt;
&lt;br /&gt;
&lt;pre style=&quot;background-image: URL(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDcLzOu68WD23doPIL1hcHvui3PV91vF_jVyFuN8oSOBz2BT4pWEgJPomHs2Zk-c1BVA71ID8VhWoIqpKUySz-Ixq5bxIJU431ktIkL-vURX0KNxnt7BHwmM_W-4CO3UAuWXL6OgHsOOwV/s320/codebg.gif); background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;&quot;&gt;&lt;code style=&quot;color: black; word-wrap: normal;&quot;&gt;
isInDic :: String -&amp;gt; [String] -&amp;gt; Bool
isInDic str dic = elem str dic

&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
Next, the magic happens with two big (but equally structured) functions, one that considers as priority bigger words and another that starts from smaller words (dropMaxDic &amp;lt;-&amp;gt; dropMinDic). The only difference between these two functions is the comparison of the current index N, if it is less or equal to the maximum allowed word size or, in the other hand, greater than or equal to the minimum allowed word size.&lt;br /&gt;
&lt;br /&gt;
&lt;pre style=&quot;background-image: URL(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDcLzOu68WD23doPIL1hcHvui3PV91vF_jVyFuN8oSOBz2BT4pWEgJPomHs2Zk-c1BVA71ID8VhWoIqpKUySz-Ixq5bxIJU431ktIkL-vURX0KNxnt7BHwmM_W-4CO3UAuWXL6OgHsOOwV/s320/codebg.gif); background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;&quot;&gt;&lt;code style=&quot;color: black; word-wrap: normal;&quot;&gt;
dropMaxDic :: Int -&amp;gt; String -&amp;gt; [String] -&amp;gt; [String]
dropMaxDic n str dic 
    | n == minWordSize    = []
    | otherwise = 
        if  (foundInDic == True)
        then
            capitalize : dropMaxDic maxWordSize removed dic
        else
            dropMaxDic (n - 1) str dic
    where
        wordToSearch = take n str
        capitalize = toUpper (wordToSearch!!0) : drop 1 wordToSearch
        foundInDic = isInDic wordToSearch dic
        removed = drop n str

&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
Apart from that, they just recursively call, have you found a word, then concatenate the first capital along with the rest of the word and continue searching for more given a Mix/Max size. On the main loop we just load the british english dictionary, parse it so that bigger words are at the beginning and call the desired function on each test. The output of this program is shown as follows:&lt;br /&gt;
&lt;br /&gt;
&lt;pre style=&quot;background-image: URL(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDcLzOu68WD23doPIL1hcHvui3PV91vF_jVyFuN8oSOBz2BT4pWEgJPomHs2Zk-c1BVA71ID8VhWoIqpKUySz-Ixq5bxIJU431ktIkL-vURX0KNxnt7BHwmM_W-4CO3UAuWXL6OgHsOOwV/s320/codebg.gif); background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;&quot;&gt;&lt;code style=&quot;color: black; word-wrap: normal;&quot;&gt;
*CameCase&amp;gt; main
[&quot;Hello&quot;,&quot;Anyone&quot;,&quot;There&quot;]
[&quot;Him&quot;,&quot;Art&quot;,&quot;In&quot;]
--- Martin is not part of the
--- dictionary, that is why it
--- is split into &quot;Art&quot; &amp;amp; &quot;In&quot;
[&quot;Hello&quot;,&quot;Range&quot;]
[&quot;There&quot;]  
--- Here, it was more important to catch
--- &quot;There&quot; than &quot;The&quot;,&quot;Reach&quot;

--- This section goes from
--- Min to Max
[&quot;Hell&quot;]
[&quot;Him&quot;,&quot;Ar&quot;,&quot;Ti&quot;]
[&quot;Hell&quot;,&quot;Or&quot;,&quot;An&quot;,&quot;Ge&quot;]
[&quot;The&quot;,&quot;Re&quot;,&quot;Ac&quot;]

&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
As we can see, the second section (Min -&amp;gt; Max) do not show any of the desired strings as output, this is mainly restricted to the use of the dictionary. Of course, this procedure is not efficient at all!!, I am aware of that, because it behaves (in the worst case scenario) as O(n^n), first because every word (either Max or Min) makes &quot;n&quot; searches to the dictionary, then if nothing is found, continue with the following iteration (Min + 1 | Max - 1). n searches for n possible words it is not efficient at all!!, but there are some improvements that could take place:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt; Have a dictionary with a reduced set of words, those that are probabilistically more precise to appear.&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt; Parse the dictionary and transform it into a tree, where a lookup can take just O(n log n) to search for an entry.&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt; Parse the string as a &quot;trie&quot; structure, where the alphabet would mean the first entries and possible words could be constructed out of the connected leafs to the root.&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt; Execute Max and Min concurrently and merge the end results. This would only output more accurate results but perform badly still.&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt; Use a bullet proof library for parsing strings.&lt;br /&gt;
&lt;/li&gt;
&lt;br /&gt;
&lt;li&gt; Become a better programmer and design well from the beginning :).&lt;br /&gt;
&lt;/li&gt;
&lt;br /&gt;
&lt;/ul&gt;
Therefore, for now and as an educational improvement on Haskell usage, this seems to be a fair program.  Links:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;GitHub: &lt;a href=&quot;https://github.com/rhvall/Haskell/blob/master/CamelCase&quot;&gt;https://github.com/rhvall/Haskell/blob/master/CamelCase&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;  &lt;a href=&quot;http://stackoverflow.com/questions/8870261/how-to-split-text-without-spaces-into-list-of-words&quot;&gt;http://stackoverflow.com/questions/8870261/how-to-split-text-without-spaces-into-list-of-words&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;   &lt;a href=&quot;http://en.wikipedia.org/wiki/Trie&quot;&gt;http://en.wikipedia.org/wiki/Trie&lt;/a&gt;&lt;/li&gt;
&lt;li&gt; &lt;a href=&quot;http://www.geeksforgeeks.org/dynamic-programming-set-32-word-break-problem/&quot;&gt;http://www.geeksforgeeks.org/dynamic-programming-set-32-word-break-problem/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content><link rel='replies' type='application/atom+xml' href='http://mittrasw.blogspot.com/feeds/3785488651108643694/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mittrasw.blogspot.com/2013/11/word-capitalization-with-haskell.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5416507646115832994/posts/default/3785488651108643694'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5416507646115832994/posts/default/3785488651108643694'/><link rel='alternate' type='text/html' href='http://mittrasw.blogspot.com/2013/11/word-capitalization-with-haskell.html' title='Word capitalization with Haskell'/><author><name>Mittra Software</name><uri>http://www.blogger.com/profile/09954375852101781488</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNOlduh3N2owDQr9ycxnooumei02qLd3Qe1gjwUfRboNE_va3p3fjZfKxdJB1CXQHPIs03R-OGEuB1wgNR8unWjwqtx1t2vrULIZ2Ure1mJ2J9XaKzvfAeViXoRIy_6g/s113/LogoMittra2.png'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjLlpQZtTh_Zwq0ql5tl_P_C7gZpNMDK8qmPM2G0cTHxSGpP6b9O2N9jJv2d-7gZTSYQlAOrOlo_fZAls9kFRqnuNGjstd7vyMbZZaligu6Z9-Ps2_CntWm-efZYlWAvygzEV6wpfraHz5f/s72-c/trie.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5416507646115832994.post-6490800551601782731</id><published>2013-11-20T21:30:00.001-06:00</published><updated>2013-11-20T21:30:21.075-06:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Algorithms"/><category scheme="http://www.blogger.com/atom/ns#" term="Haskell"/><category scheme="http://www.blogger.com/atom/ns#" term="Mathematics"/><category scheme="http://www.blogger.com/atom/ns#" term="Problems"/><category scheme="http://www.blogger.com/atom/ns#" term="Programming"/><title type='text'>Pentagonal Numbers in Haskell</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4jlfeUPXTG_8LqUlp4QPAAJ1FzvlxYJCKFLy1eGp1RjfC8OA4V-H0XwemhYlYiwloQfDkQ9Ee8puwWJbfxhZGssu1OzNYOi2zW_W3CU2TrR7bptsVo7cvdtP4t3uLoctLiJEjj4l0ZVTX/s1600/image005.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4jlfeUPXTG_8LqUlp4QPAAJ1FzvlxYJCKFLy1eGp1RjfC8OA4V-H0XwemhYlYiwloQfDkQ9Ee8puwWJbfxhZGssu1OzNYOi2zW_W3CU2TrR7bptsVo7cvdtP4t3uLoctLiJEjj4l0ZVTX/s320/image005.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
As part of my refresh on algorithms, data structures and programming, I found this interesting &lt;a href=&quot;http://projecteuler.net/problem=44&quot;&gt;mathematic problem&lt;/a&gt;:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;&lt;div style=&quot;font-family: &#39;Trebuchet MS&#39;, sans-serif; font-size: 16px;&quot;&gt;Pentagonal numbers are generated by the formula, P&lt;sub&gt;&lt;var style=&quot;font-family: &#39;times new roman&#39;; font-size: 16px;&quot;&gt;n&lt;/var&gt;&lt;/sub&gt;=&lt;var style=&quot;font-family: &#39;times new roman&#39;; font-size: 19px;&quot;&gt;n&lt;/var&gt;(3&lt;var style=&quot;font-family: &#39;times new roman&#39;; font-size: 19px;&quot;&gt;n&lt;/var&gt;&lt;img alt=&quot;−&quot; border=&quot;0&quot; height=&quot;3&quot; src=&quot;http://projecteuler.net/images/symbol_minus.gif&quot; style=&quot;border: 0px; vertical-align: middle;&quot; width=&quot;9&quot; /&gt;1)/2. The first ten pentagonal numbers are:&lt;/div&gt;&lt;div style=&quot;font-family: &#39;Trebuchet MS&#39;, sans-serif; font-size: 16px; text-align: center;&quot;&gt;1, 5, 12, 22, 35, 51, 70, 92, 117, 145, ...&lt;/div&gt;&lt;div style=&quot;font-family: &#39;Trebuchet MS&#39;, sans-serif; font-size: 16px;&quot;&gt;It can be seen that P&lt;sub&gt;4&lt;/sub&gt;&amp;nbsp;+ P&lt;sub&gt;7&lt;/sub&gt;&amp;nbsp;= 22 + 70 = 92 = P&lt;sub&gt;8&lt;/sub&gt;. However, their difference, 70&amp;nbsp;&lt;img alt=&quot;−&quot; border=&quot;0&quot; height=&quot;3&quot; src=&quot;http://projecteuler.net/images/symbol_minus.gif&quot; style=&quot;border: 0px; vertical-align: middle;&quot; width=&quot;9&quot; /&gt;&amp;nbsp;22 = 48, is not pentagonal.&lt;/div&gt;&lt;div style=&quot;font-family: &#39;Trebuchet MS&#39;, sans-serif; font-size: 16px;&quot;&gt;Find the pair of pentagonal numbers, P&lt;sub&gt;&lt;var style=&quot;font-family: &#39;times new roman&#39;; font-size: 16px;&quot;&gt;j&lt;/var&gt;&lt;/sub&gt;&amp;nbsp;and P&lt;sub&gt;&lt;var style=&quot;font-family: &#39;times new roman&#39;; font-size: 16px;&quot;&gt;k&lt;/var&gt;&lt;/sub&gt;, for which their sum and difference are pentagonal and D = |P&lt;sub&gt;&lt;var style=&quot;font-family: &#39;times new roman&#39;; font-size: 16px;&quot;&gt;k&lt;/var&gt;&lt;/sub&gt;&amp;nbsp;&lt;img alt=&quot;−&quot; border=&quot;0&quot; height=&quot;3&quot; src=&quot;http://projecteuler.net/images/symbol_minus.gif&quot; style=&quot;border: 0px; vertical-align: middle;&quot; width=&quot;9&quot; /&gt;&amp;nbsp;P&lt;sub&gt;&lt;var style=&quot;font-family: &#39;times new roman&#39;; font-size: 16px;&quot;&gt;j&lt;/var&gt;&lt;/sub&gt;| is minimised; what is the value of D?&lt;/div&gt;&lt;/blockquote&gt;&lt;br /&gt;
Then, I decided to elaborate a program in Haskell that would find the number D. Of course, you can find the code in &lt;a href=&quot;https://github.com/rhvall/Haskell/blob/master/Pentagons.hs&quot;&gt;Github&lt;/a&gt;.&lt;br /&gt;
</content><link rel='replies' type='application/atom+xml' href='http://mittrasw.blogspot.com/feeds/6490800551601782731/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mittrasw.blogspot.com/2013/11/pentagonal-numbers-in-haskell.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5416507646115832994/posts/default/6490800551601782731'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5416507646115832994/posts/default/6490800551601782731'/><link rel='alternate' type='text/html' href='http://mittrasw.blogspot.com/2013/11/pentagonal-numbers-in-haskell.html' title='Pentagonal Numbers in Haskell'/><author><name>Mittra Software</name><uri>http://www.blogger.com/profile/09954375852101781488</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNOlduh3N2owDQr9ycxnooumei02qLd3Qe1gjwUfRboNE_va3p3fjZfKxdJB1CXQHPIs03R-OGEuB1wgNR8unWjwqtx1t2vrULIZ2Ure1mJ2J9XaKzvfAeViXoRIy_6g/s113/LogoMittra2.png'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4jlfeUPXTG_8LqUlp4QPAAJ1FzvlxYJCKFLy1eGp1RjfC8OA4V-H0XwemhYlYiwloQfDkQ9Ee8puwWJbfxhZGssu1OzNYOi2zW_W3CU2TrR7bptsVo7cvdtP4t3uLoctLiJEjj4l0ZVTX/s72-c/image005.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5416507646115832994.post-3460841837632262062</id><published>2013-11-08T15:01:00.001-06:00</published><updated>2013-11-08T15:01:29.963-06:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Algorithms"/><category scheme="http://www.blogger.com/atom/ns#" term="Github"/><category scheme="http://www.blogger.com/atom/ns#" term="Haskell"/><category scheme="http://www.blogger.com/atom/ns#" term="Math"/><category scheme="http://www.blogger.com/atom/ns#" term="Programming"/><title type='text'>Unbalanced Balances...</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqfZLmG3HMzqtvXkUUsS0u6_Kz5uDMZDVbUnZc6Rj9Os6IMnTTLeR2i6TtLFjK_orNiXPxbUBnVv3i09AR5HAhiEAc16QgvzXBjA64H4qRGXO7yAHN49KQLIi0p5WbQNBBpNHCfBSQ-3Gx/s1600/challenge.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqfZLmG3HMzqtvXkUUsS0u6_Kz5uDMZDVbUnZc6Rj9Os6IMnTTLeR2i6TtLFjK_orNiXPxbUBnVv3i09AR5HAhiEAc16QgvzXBjA64H4qRGXO7yAHN49KQLIi0p5WbQNBBpNHCfBSQ-3Gx/s320/challenge.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Once again, I found a challenge in a very common webpage that said the following: &lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;You have a room-full of balances and weights. Each balance weighs ten pounds and is considered perfectly balanced when the sum of weights on its left and right sides are exactly the same. You have placed some weights on some of the balances, and you have placed some of the balances on other balances. Given a description of how the balances are arranged and how much additional weight is on each balance, determine how to add weight to the balances so that they are all perfectly balanced.&lt;br /&gt;
&lt;br /&gt;
There may be more than one way to balance everything, but always choose the way that places additional weight on the lowest balances.&lt;br /&gt;
&lt;br /&gt;
The input file will begin with a single integer, N, specifying how many balances there are.&lt;br /&gt;
Balance 0 is specified by lines 1 and 2, balance 1 is specified by lines 3 and 4, etc...&lt;br /&gt;
Each pair of lines is formatted as follows:&lt;br /&gt;
&lt;br /&gt;
WL &amp;lt balances &amp;gt&lt;br /&gt;
WR &amp;lt balances &amp;gt&lt;br /&gt;
&lt;br /&gt;
WL and WR indicate the weight added to the left and right sides, respectively. &amp;lt balances &amp;gt is a space-delimited list of the other balance that are on that side of this balance. &amp;lt balances &amp;gt may contain zero or more elements.&lt;/blockquote&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYmVX0-UqbxY-CR9T1D0dOFfabAJ3DPVXhvaa62PP8y8Oaok6GEuRGObRQubOZPemmpvGCdXwpnol_RqQZyqS18uCRf8PCjW90Zf1L7uT6vSEi3PUp-j6gzmuJIfrgTwrLAWQmEfxpe2qk/s1600/Weight_Balance_BST01.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYmVX0-UqbxY-CR9T1D0dOFfabAJ3DPVXhvaa62PP8y8Oaok6GEuRGObRQubOZPemmpvGCdXwpnol_RqQZyqS18uCRf8PCjW90Zf1L7uT6vSEi3PUp-j6gzmuJIfrgTwrLAWQmEfxpe2qk/s320/Weight_Balance_BST01.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Then, I took this example and developed an approach using Haskell, which of course, you can find the whole source code in &lt;a href=&quot;https://github.com/rhvall/Haskell/blob/master/BalanceTheBalance.hs&quot;&gt;Github&lt;/a&gt;. Now let explain what is happening starting in the main:&lt;br /&gt;
&lt;br /&gt;
&lt;pre style=&quot;background-image: URL(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDcLzOu68WD23doPIL1hcHvui3PV91vF_jVyFuN8oSOBz2BT4pWEgJPomHs2Zk-c1BVA71ID8VhWoIqpKUySz-Ixq5bxIJU431ktIkL-vURX0KNxnt7BHwmM_W-4CO3UAuWXL6OgHsOOwV/s320/codebg.gif); background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;&quot;&gt;&lt;code style=&quot;color: black; word-wrap: normal;&quot;&gt;
main = do
    zz &lt;- readFile &quot;input001.txt&quot;
--    zz &lt;- getLine
    print zz
    let z = map strToInt $ tail $ lines zz
    print z
--    let inc = increment z
--    print inc
--    let x = missing z
    let allBalances = clasifyBalance 0 z
    print $ map showBalance allBalances
    let x = orderBalance allBalances allBalances 
    print x 
--    writeFile &quot;output.txt&quot; $ show x

&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
Using the same schematic procedure as &lt;a href=&quot;http://mittrasw.blogspot.com/2013/11/first-haskell-published-program.html&quot;&gt;before&lt;/a&gt;, we read from the file &lt;b&gt;&quot;input001.txt&quot;&lt;/b&gt; and set parse it to the variable &lt;b&gt;zz&lt;/b&gt;, then we split it in &lt;b&gt;lines&lt;/b&gt;, cut the first element, then transform the remainder into an array with a list of integers. After that, we transform the raw data into a more structured form: (balance #, WL, WR, Index Left, Index Right) : ...&lt;br /&gt;
&lt;br /&gt;
So, a balance is structured this way, the first value will represent its place in the whole list, then the weights in each side, and a list of indexes to which balances are being put on each side. This structure is not efficient at all, because it requires to provide the list every single time one balance is analyzed, but it worked for learning purposes.&lt;br /&gt;
&lt;br /&gt;
And the following line does what the program is expected to do, call a function that orders all the balances from the input file. The function &lt;b&gt;orderBalance&lt;/b&gt; takes two list of organized balances and provides back the list with all of them perfectly weighted, if a balance has this structure: (4, 3, 0, [], [1]):(1,0,0,[],[]), it means that it has assigned the number four, on its left side has weights for 3 pounds and the right side carries the balance number 1. A perfectly weighted object would be: (4, 7, 0, [], []), because we would want this balance to have the same proportion, then adding 7 to the left side would equilibrate the problem. Then we analyze &lt;b&gt;orderBalance&lt;/b&gt;:&lt;br /&gt;
&lt;br /&gt;
&lt;pre style=&quot;background-image: URL(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDcLzOu68WD23doPIL1hcHvui3PV91vF_jVyFuN8oSOBz2BT4pWEgJPomHs2Zk-c1BVA71ID8VhWoIqpKUySz-Ixq5bxIJU431ktIkL-vURX0KNxnt7BHwmM_W-4CO3UAuWXL6OgHsOOwV/s320/codebg.gif); background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;&quot;&gt;&lt;code style=&quot;color: black; word-wrap: normal;&quot;&gt;
orderBalance :: [Balance] -&gt; [Balance] -&gt; [Balance]
orderBalance [] _ = []
orderBalance _ [] = []
orderBalance ordered balances = balanceTheBalance 
         (headZeroBal ordered) balances : 
           orderBalance (tailZero ordered) balances

&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
Simple, if you have an ordered balance array, distribute the weight of the first element, and continue with the remaining in the list. If it is is empty in either side, just return that emptiness to the caller. Then we arrive to the interesting method to analyze, &lt;b&gt;balanceTheBalance&lt;/b&gt;:&lt;br /&gt;
&lt;br /&gt;
&lt;pre style=&quot;background-image: URL(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDcLzOu68WD23doPIL1hcHvui3PV91vF_jVyFuN8oSOBz2BT4pWEgJPomHs2Zk-c1BVA71ID8VhWoIqpKUySz-Ixq5bxIJU431ktIkL-vURX0KNxnt7BHwmM_W-4CO3UAuWXL6OgHsOOwV/s320/codebg.gif); background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;&quot;&gt;&lt;code style=&quot;color: black; word-wrap: normal;&quot;&gt;
balanceTheBalance :: Balance -&gt; [Balance] -&gt; Balance
balanceTheBalance (num,x,y,xs,ys) bals =
    if (leftWeight == rightWeight)
    then (num,x,y,xs,ys) 
    else        
        if (leftWeight &gt; rightWeight)
        then (num, 0, difference, xs, ys)
        else (num, difference, 0, xs, ys)   
    where
        leftWeight = (x + totalBalance xs bals)
        rightWeight = (y + totalBalance ys bals)
        difference = abs (leftWeight - rightWeight)

&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
Here, if your sides have the same value, then return yourself, if not, verify which side is causing troubles ¿left?¿right? and from there calculate how much is missing and return that difference back to the caller, simple, isn&#39;t it?? Of course, at the time of this writing, I spotted a problem, if your balance is like (1,3,3,[2],[4,5]), this function would fail, because the balance is not necessarily balanced, even if 4 and 5 do not have anything on their own, we would still have 13 on one side and 23 on the other side, but this trouble could be fixed in a 1.1v of this program.&lt;br /&gt;
&lt;br /&gt;
</content><link rel='replies' type='application/atom+xml' href='http://mittrasw.blogspot.com/feeds/3460841837632262062/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mittrasw.blogspot.com/2013/11/unbalanced-balances.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5416507646115832994/posts/default/3460841837632262062'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5416507646115832994/posts/default/3460841837632262062'/><link rel='alternate' type='text/html' href='http://mittrasw.blogspot.com/2013/11/unbalanced-balances.html' title='Unbalanced Balances...'/><author><name>Mittra Software</name><uri>http://www.blogger.com/profile/09954375852101781488</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNOlduh3N2owDQr9ycxnooumei02qLd3Qe1gjwUfRboNE_va3p3fjZfKxdJB1CXQHPIs03R-OGEuB1wgNR8unWjwqtx1t2vrULIZ2Ure1mJ2J9XaKzvfAeViXoRIy_6g/s113/LogoMittra2.png'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqfZLmG3HMzqtvXkUUsS0u6_Kz5uDMZDVbUnZc6Rj9Os6IMnTTLeR2i6TtLFjK_orNiXPxbUBnVv3i09AR5HAhiEAc16QgvzXBjA64H4qRGXO7yAHN49KQLIi0p5WbQNBBpNHCfBSQ-3Gx/s72-c/challenge.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5416507646115832994.post-3649537440310242677</id><published>2013-11-02T21:57:00.000-06:00</published><updated>2013-11-02T21:58:20.606-06:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Github"/><category scheme="http://www.blogger.com/atom/ns#" term="Haskell"/><category scheme="http://www.blogger.com/atom/ns#" term="Math"/><category scheme="http://www.blogger.com/atom/ns#" term="Programming"/><title type='text'>First Haskell Published Program: Arithmetic Progression</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhOGaQUjgcxWnzGCBh8hIhAmIAuQkZRD3EOSG3c2fsQOZMK1Tb323kSLTdZCp7HufJTaDtIDkdm86kADvPhcX0FAYvBal8GGtJD53NwWvKrZ0FEYoKMRx82WsbgGo39e9sIGu30P5ZLfb_o/s1600/Screen+Shot+2013-11-02+at+22.35.47.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhOGaQUjgcxWnzGCBh8hIhAmIAuQkZRD3EOSG3c2fsQOZMK1Tb323kSLTdZCp7HufJTaDtIDkdm86kADvPhcX0FAYvBal8GGtJD53NwWvKrZ0FEYoKMRx82WsbgGo39e9sIGu30P5ZLfb_o/s320/Screen+Shot+2013-11-02+at+22.35.47.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
I find Haskell a challenging language, one that let you express yourself in different ways as procedural or object oriented programming allows you to do it. I knew about it quite a few months ago, but I have never had the time to concentrate to develop any example using it. As I found in the &lt;a href=&quot;http://bit.ly/oUHI4G&quot;&gt;Facebook challenge example&lt;/a&gt;, I considered was a good opportunity to create a program with the current knowledge of Haskell (minimal) and still learn a lot using what I take for granted in other languages (C++ or Objective C).&lt;br /&gt;
&lt;br /&gt;
At first, it is really a change of paradigm to start thinking about functions instead of variables that you declare at the beginning and use them as the program executes. Here those do not exist in the same way, as it does for loops (while or for) and the list are fundamental for data manipulation, you will notice my tries to force the language to behave as a procedural language, which I am aware it is not the best practice, but for the first steps I consider it is ok.&lt;br /&gt;
&lt;br /&gt;
The statement of the test is the following:&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;blockquote&gt;The first line contains an Integer N, which is the number of terms which will be provided as input.&lt;br /&gt;
This is followed by N consecutive Integers, with a space between each pair of integers. All of these are on one line, and they are in AP (other than the point where an integer is missing).&lt;br /&gt;
&lt;br /&gt;
Sample Input&lt;br /&gt;
5&lt;br /&gt;
1 3 5 9 11  &lt;br /&gt;
&lt;br /&gt;
Sample Output&lt;br /&gt;
7&lt;br /&gt;
&lt;br /&gt;
Explanation&lt;br /&gt;
You are provided with 5 integers. As you can can observe, they have been picked from a series, in which the starting term is 1 and the common difference is 2. The only abberration, i.e. the missing term (7), occurs between 5 and 9. This is the missing element which you need to find.&lt;br /&gt;
&lt;br /&gt;
Constraints&lt;br /&gt;
3 &amp;lt;= N &amp;lt;= 2500 All integers in the series will lie in the range [-10^6,+10^6].&lt;/blockquote&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi28Le2rCaa7cEeMV7vjRqwaHp7AbW2f86CbWE0G-7Vvuczj63YlgrLOC5hiuWriAi-wwooWOm8nrHjlyIgUUiASxJViFBgBvlfN9bYq1ePdd_ZivRR-01Adb-LfVRue8wWlECSSilW1qx-/s1600/obile_image.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi28Le2rCaa7cEeMV7vjRqwaHp7AbW2f86CbWE0G-7Vvuczj63YlgrLOC5hiuWriAi-wwooWOm8nrHjlyIgUUiASxJViFBgBvlfN9bYq1ePdd_ZivRR-01Adb-LfVRue8wWlECSSilW1qx-/s320/obile_image.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Initially, the allowed time frame lies under 45min, but it took me around 5 hours to figure out a solution, having considered that I learned how to read files, read form STD, write (all with monads); recursions, &quot;where&quot; clauses, list comprehension, pattern matching and a little refresh of arithmetic progressions :), if you are interested in the full solution, the code is &lt;a href=&quot;https://github.com/rhvall/Haskell/blob/master/ArithProg.hs&quot;&gt;here&lt;/a&gt;. Let&#39;s start explaining function by function:&lt;br /&gt;
&lt;br /&gt;
&lt;pre style=&quot;background-image: URL(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDcLzOu68WD23doPIL1hcHvui3PV91vF_jVyFuN8oSOBz2BT4pWEgJPomHs2Zk-c1BVA71ID8VhWoIqpKUySz-Ixq5bxIJU431ktIkL-vURX0KNxnt7BHwmM_W-4CO3UAuWXL6OgHsOOwV/s320/codebg.gif); background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;&quot;&gt;&lt;code style=&quot;color: black; word-wrap: normal;&quot;&gt;
main = do
--    zz &lt;- readFile &quot;input.txt&quot;
    zz &lt;- getLine
    let z = strToInt zz
--    print z
--    let inc = increment z
--    print inc
    let x = missing z
    print x 
--    writeFile &quot;output.txt&quot; $ show x
&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
The main, as in many other languages, is going to be the starting execution point. The &quot;do&quot; keyword states that what comes next is going to have IO actions, as &quot;getLine&quot; does: retrieve all input from the STDIO, then &quot;bind&quot; whatever comes from it to the &quot;variable&quot; (which is not exactly a variable but a ¿function?). The &quot;let&quot; keyword allows to &quot;transform&quot; the &quot;IO String&quot; to a simple &quot;String&quot; and &quot;Purify&quot; the IO action to a more common argument that takes place into the &quot;strToIn&quot; function. Lastly, &quot;z&quot; becomes the input of the function &quot;missing&quot; which is in charge of finding the missing number in the progression. &lt;br /&gt;
&lt;br /&gt;
&lt;pre style=&quot;background-image: URL(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDcLzOu68WD23doPIL1hcHvui3PV91vF_jVyFuN8oSOBz2BT4pWEgJPomHs2Zk-c1BVA71ID8VhWoIqpKUySz-Ixq5bxIJU431ktIkL-vURX0KNxnt7BHwmM_W-4CO3UAuWXL6OgHsOOwV/s320/codebg.gif); background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;&quot;&gt;&lt;code style=&quot;color: black; word-wrap: normal;&quot;&gt;
strToInt :: String -&amp;gt; [Int]
strToInt = (map read) . tail . words

&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
As a simple explanation, the function &quot;strToInt&quot; transforms an String into a list of Integers doing &quot;Function Composition&quot; (cascade of input - output function calls). First it takes the implicit argument and splits it into words, which will be determined by a space, then discards the first element of the list, because in the challenge the input has first the number of elements and then the full progression. Then the resulting list is going to be mapped to the function read and transform each element into an integer, simple and concise, right??&lt;br /&gt;
&lt;br /&gt;
&lt;pre style=&quot;background-image: URL(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDcLzOu68WD23doPIL1hcHvui3PV91vF_jVyFuN8oSOBz2BT4pWEgJPomHs2Zk-c1BVA71ID8VhWoIqpKUySz-Ixq5bxIJU431ktIkL-vURX0KNxnt7BHwmM_W-4CO3UAuWXL6OgHsOOwV/s320/codebg.gif); background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;&quot;&gt;&lt;code style=&quot;color: black; word-wrap: normal;&quot;&gt;
initial :: (Int, Int)
initial = (0, 1)

missing :: [Int] -&amp;gt; Int
missing [] = 0
missing ys = (head ys) + (snd val - 1) * (fst val)
        where 
            val = pairSum ys initial

&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
Now, initial is just a simple macro that defines a tuple that works as a starting point of saying (difference, position). Missing is going to be recursive function over a list of integers that returns the missing value in the progression, which first checks, is this an empty list, then the value is 0, otherwise I will apply the general formula of progression once I know the (difference, position) tuple from pairSum using the initial macro.&lt;br /&gt;
&lt;br /&gt;
&lt;pre style=&quot;background-image: URL(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDcLzOu68WD23doPIL1hcHvui3PV91vF_jVyFuN8oSOBz2BT4pWEgJPomHs2Zk-c1BVA71ID8VhWoIqpKUySz-Ixq5bxIJU431ktIkL-vURX0KNxnt7BHwmM_W-4CO3UAuWXL6OgHsOOwV/s320/codebg.gif); background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;&quot;&gt;&lt;code style=&quot;color: black; word-wrap: normal;&quot;&gt;
pairSum :: [Int] -&amp;gt; (Int, Int) -&amp;gt; (Int, Int)
pairSum [] _ = (0, 0)
pairSum (x:[]) (u, v) = (u, v)
pairSum (x:y:ys) (u, v) = 
    if (u /= 0 &amp;amp;&amp;amp; diff /= u)
    then
        if (v &amp;gt; 2)
        then
            (u, v + 1)
        else
            (diff, v)
    else
        pairSum (y:ys) (diff, v + 1)
    where
        diff = abs(x - y)

&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
Here some cases take place. Are you an empty list, then return a tuple of 0&#39;s. If you only have a list of one element, then we are not looking anymore for any pair of values. Then, the list can be decomposed into three elements, the head (x), the next element (y) and the rest of the list (ys); with this we are going to verify that at least we calculate a difference (u /= 0) and that previous and next difference match in order to continue searching, when this case does not happen, we see if the position of the missing number (v) is not in the second position of the list, in order to return the tuple &quot;(difference, missing element position)&quot;.&lt;br /&gt;
&lt;br /&gt;
This approach allows the algorithm to loop the list just once, determine where the missing element is and then calculate it using the general formula; this would create a complexity of O(n-m) where n is the number of elements in the list and m the position of the missing element, with a worst case of O(n) and best of O(1) if the element is in the first position of the list.</content><link rel='replies' type='application/atom+xml' href='http://mittrasw.blogspot.com/feeds/3649537440310242677/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mittrasw.blogspot.com/2013/11/first-haskell-published-program.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5416507646115832994/posts/default/3649537440310242677'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5416507646115832994/posts/default/3649537440310242677'/><link rel='alternate' type='text/html' href='http://mittrasw.blogspot.com/2013/11/first-haskell-published-program.html' title='First Haskell Published Program: Arithmetic Progression'/><author><name>Mittra Software</name><uri>http://www.blogger.com/profile/09954375852101781488</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNOlduh3N2owDQr9ycxnooumei02qLd3Qe1gjwUfRboNE_va3p3fjZfKxdJB1CXQHPIs03R-OGEuB1wgNR8unWjwqtx1t2vrULIZ2Ure1mJ2J9XaKzvfAeViXoRIy_6g/s113/LogoMittra2.png'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhOGaQUjgcxWnzGCBh8hIhAmIAuQkZRD3EOSG3c2fsQOZMK1Tb323kSLTdZCp7HufJTaDtIDkdm86kADvPhcX0FAYvBal8GGtJD53NwWvKrZ0FEYoKMRx82WsbgGo39e9sIGu30P5ZLfb_o/s72-c/Screen+Shot+2013-11-02+at+22.35.47.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5416507646115832994.post-2701049892388101825</id><published>2013-10-29T21:43:00.002-06:00</published><updated>2013-11-20T21:31:49.555-06:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="C++"/><category scheme="http://www.blogger.com/atom/ns#" term="Deferred Lighting"/><category scheme="http://www.blogger.com/atom/ns#" term="Development"/><category scheme="http://www.blogger.com/atom/ns#" term="GCM"/><category scheme="http://www.blogger.com/atom/ns#" term="Nvidia"/><category scheme="http://www.blogger.com/atom/ns#" term="Programming"/><category scheme="http://www.blogger.com/atom/ns#" term="PS3"/><title type='text'>Deferred Lighting: The backdoor, Part 2</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzrmeTSytWTiJ-EL903nG3RGvInSC6CZ979TS38ROz6HNt0THLw6HXwbDD5xux8O2EhU2LkDg5xP5f0xOET5dTYS88eg8Qa_Z8FFoxXA1Wob1f4FCCsYtLZx7EKtkF5XjaOkrEf8sszSqt/s1600/DSalpha-A.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzrmeTSytWTiJ-EL903nG3RGvInSC6CZ979TS38ROz6HNt0THLw6HXwbDD5xux8O2EhU2LkDg5xP5f0xOET5dTYS88eg8Qa_Z8FFoxXA1Wob1f4FCCsYtLZx7EKtkF5XjaOkrEf8sszSqt/s320/DSalpha-A.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
In the &lt;a href=&quot;http://mittrasw.blogspot.com/2013/10/deferred-lighting-backdoor.html&quot;&gt;first part&lt;/a&gt; of this article, we covered the a little theory of what this technique means as well as we set the foundations of code that started its execution on main. Now, the functional parts that are needed to create magic are going to be explained as follows.&lt;br /&gt;
&lt;br /&gt;
When the Renderer class is allocated, also the constructor method is called, and here many preparations take place; in the following order: load each necessary CG shader, initialize the sphere lights (8) and place them across the heightmap, create the projection matrix and the root scene node to render objects, load the splash screen as a mesh, and set some configuration of the GCM. It is important to have considered the mesh &quot;Sphere&quot;, this object will be the one in charge of draw into the scene the values of each light, in other words, the light will affect only on the area this sphere is colliding with, nothing else, process that differs from a ray tracing procedure. The code for what was explained before is &lt;a href=&quot;https://github.com/rhvall/PS3DeferredLighting/blob/master/Renderer.cpp&quot;&gt;here&lt;/a&gt;: &lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;
&lt;pre style=&quot;background-image: URL(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDcLzOu68WD23doPIL1hcHvui3PV91vF_jVyFuN8oSOBz2BT4pWEgJPomHs2Zk-c1BVA71ID8VhWoIqpKUySz-Ixq5bxIJU431ktIkL-vURX0KNxnt7BHwmM_W-4CO3UAuWXL6OgHsOOwV/s320/codebg.gif); background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;&quot;&gt;&lt;code style=&quot;color: black; word-wrap: normal;&quot;&gt;Renderer::Renderer(void)
{
        rotation = 0.0f;

        lightVert = new VertexShader(LIGHT_VERTEX_SHADER);
        lightFrag = new FragmentShader(LIGHT_FRAGMENT_SHADER);

        basicVert = new VertexShader(BASIC_VERTEX_SHADER);
        basicFrag = new FragmentShader(BASIC_FRAGMENT_SHADER);

        skyboxVert = new VertexShader(SKYBOX_VERTEX_SHADER);
        skyboxFrag = new FragmentShader(SKYBOX_FRAGMENT_SHADER);

        sceneVert = new VertexShader(SCENE_VERTEX_SHADER);
        sceneFrag = new FragmentShader(SCENE_FRAGMENT_SHADER);
        
        pointLightVert = new VertexShader(POINT_VERTEX_SHADER);
        pointLightFrag = new FragmentShader(POINT_FRAGMENT_SHADER);
        
        combineVert = new VertexShader(COMBINE_VERTEX_SHADER);
        combineFrag = new FragmentShader(COMBINE_FRAGMENT_SHADER);
        
        texturedVert = new VertexShader(TEXTURED_VERTEX_SHADER);
        texturedFrag = new FragmentShader(TEXTURED_FRAGMENT_SHADER);

        this-&amp;gt;SetCurrentShader(*basicVert,*basicFrag);

    light = new Light[LIGHTS * LIGHTS];
    for(int x = 0; x &amp;lt; LIGHTS; ++x)
    {
        for(int z = 0; z &amp;lt; LIGHTS; ++z)
        {
            Light &amp;amp;l = light[(x * LIGHTS) + z];
            float xPos = (RAW_WIDTH * HEIGHTMAP_X
                         / ( LIGHTS - 1)) * x;
            float zPos = (RAW_HEIGHT * HEIGHTMAP_Z 
                        / ( LIGHTS - 1)) * z;
            l.position = Vector3(xPos, 200.0f, zPos);

            float r = 0.5f + (float)(rand()%129) / 128.0f;
            float g = 0.5f + (float)(rand()%129) / 128.0f;
            float b = 0.5f + (float)(rand()%129) / 128.0f;
            l.colour = Vector4(r, g, b, 1.0f);
            l.radius = (RAW_WIDTH * HEIGHTMAP_X / LIGHTS);
        }
    }

        projMatrix = Matrix4::perspective(
                     0.7853982, screen_ratio, 1.0f, 10000.0f);

        root = new SceneNode();
        root-&amp;gt;SetTransform(Matrix4::identity());

        initMesh = Mesh::GenerateQuad();
        CellGcmTexture *initScreen = 
                        GCMRenderer::LoadTGA(INIT_SCREEN, false);
        initMesh-&amp;gt;SetDefaultTexture(*initScreen);

        sphere = new OBJMesh(SPHERE_OBJ);
        
        cellGcmSetDepthTestEnable(CELL_GCM_TRUE);
        cellGcmSetCullFaceEnable(CELL_GCM_TRUE);
        cellGcmSetBlendEnable(CELL_GCM_TRUE);
        cellGcmSetDepthFunc(CELL_GCM_LESS);

        
        cellGcmSetDitherEnable(CELL_GCM_TRUE);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
After the initialization, every time a new frame is processed, the RenderScene method is executed to perform all calculations. It is simple, but it implies some technique. First, it refresh the aspect ratio and screen space on the &quot;&lt;b&gt;set_viewport()&lt;/b&gt;&quot; method. After, all the buffers are cleared and set to 0, this is to remove all the information from the previous frame or to flush any garbage data that comes at initialization. The &quot;&lt;b&gt;drawSkybox()&lt;/b&gt;&quot; function generates a huge cube that encloses the scene and gives the illusion of a background. The last method listed, &quot;&lt;b&gt;swap_buffers()&lt;/b&gt;&quot; removes the current frame on screen and replaces it with an updated frame. Then the three methods in the middle that take place are:&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;- fillBuffers():&lt;/b&gt; This is just a simple pass, where all the objects are drawn as normal, with no affect of light whatsoever; the output of this calculation is transformed into a texture and used in the combine phase.&lt;br /&gt;
&lt;b&gt;- drawPointLights(): &lt;/b&gt;Here all lights are drawn considering variables as radiance or specular, but also the normals and depths that took place in the previous stage. Consider again that each light will only affect the area of the sphere mesh.&lt;br /&gt;
&lt;b&gt;- combineBuffers(): &lt;/b&gt;The color of the lights and the positions of the objects are combined to form the final screen image. Special consideration takes place with the matrices, that are set to identity because the input data is used as &quot;textures&quot;, only having the projection matrix as ortographic to have everything managed as plane objects.&lt;br /&gt;
&lt;br /&gt;
&lt;pre style=&quot;background-image: URL(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDcLzOu68WD23doPIL1hcHvui3PV91vF_jVyFuN8oSOBz2BT4pWEgJPomHs2Zk-c1BVA71ID8VhWoIqpKUySz-Ixq5bxIJU431ktIkL-vURX0KNxnt7BHwmM_W-4CO3UAuWXL6OgHsOOwV/s320/codebg.gif); background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;&quot;&gt;&lt;code style=&quot;color: black; word-wrap: normal;&quot;&gt;void Renderer::RenderScene()
{
        set_viewport();
        clear_buffer();

        drawSkybox();

        fillBuffers();
        drawPointLights();
        combineBuffers();
        
        swap_buffers();
}
&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
The method textureFromSurface deserves special consideration, because of how the PS3 manages frame objects, this function transforms into a texture a GCM surface or, in OpenGL words, frame buffer. As you can see, it is used in many places in the class to transform the output of the first pass to information that can be used in the second and the third pass.&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://mittrasw.blogspot.com/feeds/2701049892388101825/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mittrasw.blogspot.com/2013/10/deferred-lighting-backdoor-part-2.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5416507646115832994/posts/default/2701049892388101825'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5416507646115832994/posts/default/2701049892388101825'/><link rel='alternate' type='text/html' href='http://mittrasw.blogspot.com/2013/10/deferred-lighting-backdoor-part-2.html' title='Deferred Lighting: The backdoor, Part 2'/><author><name>Mittra Software</name><uri>http://www.blogger.com/profile/09954375852101781488</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNOlduh3N2owDQr9ycxnooumei02qLd3Qe1gjwUfRboNE_va3p3fjZfKxdJB1CXQHPIs03R-OGEuB1wgNR8unWjwqtx1t2vrULIZ2Ure1mJ2J9XaKzvfAeViXoRIy_6g/s113/LogoMittra2.png'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzrmeTSytWTiJ-EL903nG3RGvInSC6CZ979TS38ROz6HNt0THLw6HXwbDD5xux8O2EhU2LkDg5xP5f0xOET5dTYS88eg8Qa_Z8FFoxXA1Wob1f4FCCsYtLZx7EKtkF5XjaOkrEf8sszSqt/s72-c/DSalpha-A.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5416507646115832994.post-7598872289310329789</id><published>2013-10-25T22:52:00.001-05:00</published><updated>2013-10-29T20:42:53.035-06:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="C++"/><category scheme="http://www.blogger.com/atom/ns#" term="Deferred Lighting"/><category scheme="http://www.blogger.com/atom/ns#" term="Development"/><category scheme="http://www.blogger.com/atom/ns#" term="GCM"/><category scheme="http://www.blogger.com/atom/ns#" term="Nvidia"/><category scheme="http://www.blogger.com/atom/ns#" term="Programming"/><category scheme="http://www.blogger.com/atom/ns#" term="PS3"/><title type='text'>Deferred Lighting: The backdoor, Part 1</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2g9hHy6MwWVz255ltx61wp2hR6DYu0lUdhMePqkGGVdWv4APL3D-Is2fc2lCjBGbd5dWiBQ_UCMs2vzvSrCSfH8tnxcWwGyyqigkwIzT9_WwU8XrTRvJig6VwDf4IDFJi65xkfv_cBEdK/s1600/deferred-shading.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;220&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2g9hHy6MwWVz255ltx61wp2hR6DYu0lUdhMePqkGGVdWv4APL3D-Is2fc2lCjBGbd5dWiBQ_UCMs2vzvSrCSfH8tnxcWwGyyqigkwIzT9_WwU8XrTRvJig6VwDf4IDFJi65xkfv_cBEdK/s320/deferred-shading.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Today, I was asked about the theory behind the &lt;a href=&quot;http://mittrasw.blogspot.com/2012/03/after-almost-4-weeks-trying-to-work-out.html&quot;&gt;Deferred Lighting&lt;/a&gt; procedure, of which, to be honest, I was starting to forget (too much Functional programming lately); but what is well learned, is never forgotten.&lt;br /&gt;
&lt;br /&gt;
The main idea behind this technique is to delay as much as possible the calculations of light over the objects on the scene, only those that deserve to be rendered will be performed, otherwise will be discarded. This also relies on &quot;several&quot; passes, which also means, the first time an scene is going to be rendered as normal: vertex positions, its normals and the material for each surface and instead of sending it to the screen it is transformed into a &quot;texture&quot; with information of the depth, normals and specular. This last texture becomes the input for the next step, where lighting takes place using the information from the variables from the previous phase. And then one &quot;last&quot; pass calculates all objects in the scene once again but this time it combines the color from the texture with the emissive and ambient light. The image below shows graphically how they are all added:&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8YOJzmwpAF9QJcvR1CjhuXlodCpBhOP-GmFylrEz2Z5VRsC_rVH2DD3sCumTPC5dZgSt32c9oSXPVA887hNRbjjEZ7Lkp2glnAJ_60gtD4xnJuHPO1vz0ciseMYZ270qAYuO_ajRwB5K_/s1600/rendering_deferredlighting.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8YOJzmwpAF9QJcvR1CjhuXlodCpBhOP-GmFylrEz2Z5VRsC_rVH2DD3sCumTPC5dZgSt32c9oSXPVA887hNRbjjEZ7Lkp2glnAJ_60gtD4xnJuHPO1vz0ciseMYZ270qAYuO_ajRwB5K_/s320/rendering_deferredlighting.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
I would like to publish the whole project, but due to NDA constraints that I signed with the university in order to be able to access the SCE SDK, I will only release the main and renderer classes that I used on the PS3 SDK. Those files can be found in here: &lt;a href=&quot;https://github.com/rhvall/PS3DeferredLighting&quot;&gt;https://github.com/rhvall/PS3DeferredLighting&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
I am going to explain some parts of the code that are important and that could be useful for others, if there are questions, that what comments are for :).&lt;br /&gt;
&lt;br /&gt;
&lt;pre style=&quot;background-image: URL(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDcLzOu68WD23doPIL1hcHvui3PV91vF_jVyFuN8oSOBz2BT4pWEgJPomHs2Zk-c1BVA71ID8VhWoIqpKUySz-Ixq5bxIJU431ktIkL-vURX0KNxnt7BHwmM_W-4CO3UAuWXL6OgHsOOwV/s320/codebg.gif); background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;&quot;&gt;&lt;code style=&quot;color: black; word-wrap: normal;&quot;&gt;       SceneNode *root = renderer.getRootNode();
#ifdef DEFERRED_LIGHTING
        Physics *physx = new Physics(root);
#endif
        HeightMap *heightMap = new HeightMap(HEIGHTMAP_RAW);
        heightMap-&amp;gt;setDefaultTexture(HEIGHTMAP_TEXTURE);
        heightMap-&amp;gt;setBumpTexture(HEIGHTMAP_BUMPMAP);
        SceneNode *heightMapNode = new SceneNode(heightMap, 
                Vector3(1), Vector3(1), HEIGHTMAP);
        heightMapNode-&amp;gt;invInertia = Matrix4(0);
        heightMapNode-&amp;gt;mass = 1000.0f;
        root-&amp;gt;AddChild(*heightMapNode);
        renderer.height = heightMapNode;
&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
General initialization is performed, first the root node, which is the one that is going to help us manage any object on the scene as well as make the respective calls to be rasterized when appropriate. The Physics is the part of the engine in charge of any collision detection as well as the forces calculating repulsion, mostly with the HeightMap, which also has textures, a position and physics variables. As any object in the scene, is referenced to the root node.&lt;br /&gt;
&lt;br /&gt;
&lt;pre style=&quot;background-image: URL(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDcLzOu68WD23doPIL1hcHvui3PV91vF_jVyFuN8oSOBz2BT4pWEgJPomHs2Zk-c1BVA71ID8VhWoIqpKUySz-Ixq5bxIJU431ktIkL-vURX0KNxnt7BHwmM_W-4CO3UAuWXL6OgHsOOwV/s320/codebg.gif); background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;&quot;&gt;&lt;code style=&quot;color: black; word-wrap: normal;&quot;&gt;        OBJMesh *aSheep = new OBJMesh(SHEEP_OBJ);
        aSheep-&amp;gt;setDefaultTexture(SHEEP_TEXTURE);
        aSheep-&amp;gt;setBumpTexture(SHEEP_BUMPMAP);

        static unsigned short NUMBER_OF_SHEEP = 3;
        SceneNode *sheepsArray[NUMBER_OF_SHEEP];

        for(int i = 0; i &amp;lt; NUMBER_OF_SHEEP; i++)
        {
                SceneNode *sphereNode = 
                        new SceneNode(aSheep, 
          HEIGHTMAP_MIDDLE + Vector3(i * 100.0f, 200.0f, i * 50.0f),
          Vector3(100.0f, 100.0f, 100.0f), SPHERE);
                sphereNode-&amp;gt;collisionable = true;
                sheepsArray[i] = sphereNode;
                root-&amp;gt;AddChild(*sphereNode);
        }

        Input::SetPadFunction(INPUT_CROSS, crossButton, 
                static_cast&lt;void&gt;(&amp;amp;(sheepsArray[0]-&amp;gt;force)));

        OBJMesh *aCube = new OBJMesh(CUBE_OBJ);
        //aCube-&amp;gt;setDefaultTexture(&quot;/Resources/CubeTexture.tga&quot;);
        SceneNode *cubeNode = new SceneNode(aCube, 
                HEIGHTMAP_MIDDLE, CUBE_SCALE, CUBE);
        cubeNode-&amp;gt;invInertia = Matrix4(0);
        cubeNode-&amp;gt;mass = 1000.0f;
        cubeNode-&amp;gt;boundingRadius = 1;
        root-&amp;gt;AddChild(*cubeNode);
&lt;/void&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
This section create two things: the sheeps on the screen that interact with the user, and the classic transparent wall that 99.99% of the games use to prevent a character to fall from within allowed limits. Also, we send function pointers to the Input class to perform an action when a push on a button is detected (coff coff Delegates coff coff).&lt;br /&gt;
&lt;br /&gt;
&lt;pre style=&quot;background-image: URL(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDcLzOu68WD23doPIL1hcHvui3PV91vF_jVyFuN8oSOBz2BT4pWEgJPomHs2Zk-c1BVA71ID8VhWoIqpKUySz-Ixq5bxIJU431ktIkL-vURX0KNxnt7BHwmM_W-4CO3UAuWXL6OgHsOOwV/s320/codebg.gif); background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;&quot;&gt;&lt;code style=&quot;color: black; word-wrap: normal;&quot;&gt;                Input::UpdateJoypad();        
                float msec = (float)gameTime.GetTimedMS();
                renderer.rotation = msec * 0.005f;
                physx-&amp;gt;update(msec);
                root-&amp;gt;Update(msec);
                renderer.RenderScene();
&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
Everything before this piece of code is less relevant, because it takes charge of playing a sound and initialize a threaded network server to receive notifications from the desktop version. Later on, there are stages where the main screen is shown and waits for the user to continue the execution. But what is really interesting is the loop which repeats every frame, and that one is above: first, receive any notification from the joypad and execute the functions that we set previously. Get the time from the system, perform a little rotation on the lights (which will matter later on), update the physics engine according to the passed mili seconds, update the objects in the scene according to their position and lastly render everything once more. &lt;br /&gt;
&lt;br /&gt;
Up until now, nothing had to be with the deferred lighting technique, everything was about initialization and later on the render loop. The real magic is built in the Renderer class, the one in charge of setting the puzzle altogether, lights and shaders calls, calculating everything per pixel/vertex. It seems like a good time to go for a chocolate and then come back to the number 2 of these articles; meanwhile, you can appreciate the video here:&lt;br /&gt;
&lt;br /&gt;
&lt;iframe allowfullscreen=&quot;&quot; frameborder=&quot;0&quot; height=&quot;320&quot; src=&quot;//www.youtube.com/embed/J5lWzbFfQWQ&quot; width=&quot;480&quot;&gt;&lt;/iframe&gt;&lt;br /&gt;
&lt;br /&gt;
To know more about this technique:&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://docs.unity3d.com/Documentation/Components/RenderTech-DeferredLighting.html&quot;&gt;Deferred Lighting Rendering Path&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://en.wikipedia.org/wiki/Deferred_shading&quot;&gt;Deferred shading&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;!--
&lt;pre style=&quot;background-image: URL(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDcLzOu68WD23doPIL1hcHvui3PV91vF_jVyFuN8oSOBz2BT4pWEgJPomHs2Zk-c1BVA71ID8VhWoIqpKUySz-Ixq5bxIJU431ktIkL-vURX0KNxnt7BHwmM_W-4CO3UAuWXL6OgHsOOwV/s320/codebg.gif); background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;&quot;&gt;&lt;code style=&quot;color: black; word-wrap: normal;&quot;&gt; &lt;br /&gt;
&lt;/code&gt;&lt;/pre&gt;--&gt;&lt;br /&gt;
&lt;br /&gt;
</content><link rel='replies' type='application/atom+xml' href='http://mittrasw.blogspot.com/feeds/7598872289310329789/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mittrasw.blogspot.com/2013/10/deferred-lighting-backdoor.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5416507646115832994/posts/default/7598872289310329789'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5416507646115832994/posts/default/7598872289310329789'/><link rel='alternate' type='text/html' href='http://mittrasw.blogspot.com/2013/10/deferred-lighting-backdoor.html' title='Deferred Lighting: The backdoor, Part 1'/><author><name>Mittra Software</name><uri>http://www.blogger.com/profile/09954375852101781488</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNOlduh3N2owDQr9ycxnooumei02qLd3Qe1gjwUfRboNE_va3p3fjZfKxdJB1CXQHPIs03R-OGEuB1wgNR8unWjwqtx1t2vrULIZ2Ure1mJ2J9XaKzvfAeViXoRIy_6g/s113/LogoMittra2.png'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2g9hHy6MwWVz255ltx61wp2hR6DYu0lUdhMePqkGGVdWv4APL3D-Is2fc2lCjBGbd5dWiBQ_UCMs2vzvSrCSfH8tnxcWwGyyqigkwIzT9_WwU8XrTRvJig6VwDf4IDFJi65xkfv_cBEdK/s72-c/deferred-shading.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5416507646115832994.post-3280996640017843653</id><published>2013-10-09T21:14:00.003-05:00</published><updated>2013-10-09T21:17:17.071-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Shell"/><category scheme="http://www.blogger.com/atom/ns#" term="SSH"/><category scheme="http://www.blogger.com/atom/ns#" term="TCP/IP"/><category scheme="http://www.blogger.com/atom/ns#" term="Ubuntu"/><title type='text'>SSH and Sudoers</title><content type='html'>After I had set up the server to connect to my internet source, the next step to cover was a way to communicate to it without using the User Interface. As there are many solutions, one of the most common, safe and secure is the SSH protocol (Secure SHell).&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGk7UVh3rnIITdLWIjKUTTXQddrQtrOKu2hN3mWRssgsKQCnXoLjiifVJjzBc2EirTyNS2TYaWeGEOeVstKRhm_rTXkD8J14tJ9cSDvN9-GCWD_0KMCahr20ZSWRFNydCf_AEftuB-9nAp/s1600/ssh-tunnel.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGk7UVh3rnIITdLWIjKUTTXQddrQtrOKu2hN3mWRssgsKQCnXoLjiifVJjzBc2EirTyNS2TYaWeGEOeVstKRhm_rTXkD8J14tJ9cSDvN9-GCWD_0KMCahr20ZSWRFNydCf_AEftuB-9nAp/s320/ssh-tunnel.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
In order to archive this in the Ubuntu Server, I followed this &lt;a href=&quot;https://help.ubuntu.com/12.04/serverguide/openssh-server.html&quot;&gt;tutorial:&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;pre style=&quot;background-image: URL(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDcLzOu68WD23doPIL1hcHvui3PV91vF_jVyFuN8oSOBz2BT4pWEgJPomHs2Zk-c1BVA71ID8VhWoIqpKUySz-Ixq5bxIJU431ktIkL-vURX0KNxnt7BHwmM_W-4CO3UAuWXL6OgHsOOwV/s320/codebg.gif); background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;&quot;&gt;&lt;code style=&quot;color: black; word-wrap: normal;&quot;&gt; # sudo apt-get install openssh-client openssh-server 
&lt;/code&gt;&lt;/pre&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
Just one command line does the job, but that is not enough. Because I knew which computers were going to connect, also I set up the SSH to trust those connections coming from a certified key, also I followed this &lt;a href=&quot;https://help.ubuntu.com/community/SSH/OpenSSH/Keys&quot;&gt;tutorial&lt;/a&gt;. Those are easy steps, first create a certificate on the client (1), transfer the public key from the client to the server (2) and add the definition to the file of &quot;Authorized keys&quot; (3) &lt;br /&gt;
&lt;br /&gt;
&lt;pre style=&quot;background-image: URL(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDcLzOu68WD23doPIL1hcHvui3PV91vF_jVyFuN8oSOBz2BT4pWEgJPomHs2Zk-c1BVA71ID8VhWoIqpKUySz-Ixq5bxIJU431ktIkL-vURX0KNxnt7BHwmM_W-4CO3UAuWXL6OgHsOOwV/s320/codebg.gif); background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;&quot;&gt;&lt;code style=&quot;color: black; word-wrap: normal;&quot;&gt; (1) Client # ssh-keygen -t rsa
 (2) C -&amp;gt; S # CP rsa_pub -&amp;gt; ~/.ssh/
 (3) Server # cat rsa_pub &amp;gt;&amp;gt; authorized_keys 
&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
With that, the next time you are trying to authenticate, if everything went right, it will automatically prompt the console of the remote server. &lt;br /&gt;
&lt;br /&gt;
With this in place, the only missing part was to have a script that automatically reseted the Wlan0 everytime it would (re)start the OS. To archive this, I started searching for the SUDOers and how to execute scripts on init, this is what I &lt;a href=&quot;https://help.ubuntu.com/community/Sudoers&quot;&gt;found:&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;pre style=&quot;background-image: URL(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDcLzOu68WD23doPIL1hcHvui3PV91vF_jVyFuN8oSOBz2BT4pWEgJPomHs2Zk-c1BVA71ID8VhWoIqpKUySz-Ixq5bxIJU431ktIkL-vURX0KNxnt7BHwmM_W-4CO3UAuWXL6OgHsOOwV/s320/codebg.gif); background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;&quot;&gt;&lt;code style=&quot;color: black; word-wrap: normal;&quot;&gt; # sudo nano /etc/sudoers
 (TO THE END OF THE FILE)

- Cmnd_Alias SHUTDOWN_CMDS = /sbin/shutdown, 
      /sbin/halt, /sbin/reboot
- USER_NAME ALL=(ALL) NOPASSWD: SHUTDOWN_CMDS
# The user can the control machine&#39;s reset/shutdown
- USER_NAME ALL=(ALL) NOPASSWD: /etc/network/wlanStart.sh  
# The script on this folder can be SUDOer
 
&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
And then set up the script to run on &lt;a href=&quot;http://askubuntu.com/questions/132419/how-to-autostart-a-sh-after-login&quot;&gt;startup&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Easy, not??&lt;br /&gt;
&lt;br /&gt;
Sources:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://help.ubuntu.com/12.04/serverguide/openssh-server.html&quot;&gt;OpenSSH Server&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://help.ubuntu.com/community/SSH/OpenSSH/Keys&quot;&gt;SSH/OpenSSH/Keys&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://help.ubuntu.com/community/Sudoers&quot;&gt;Sudoers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://sites.google.com/site/installationubuntu/tweaking-ubuntu/automate-sudo-commands-at-startup&quot;&gt;Automate SUDO commands at startup e.g. for enabling WIFI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://askubuntu.com/questions/132419/how-to-autostart-a-sh-after-login&quot;&gt;How to autostart a .sh after login?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://askubuntu.com/questions/2271/how-to-harden-an-ssh-server&quot;&gt;How to harden an SSH server?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content><link rel='replies' type='application/atom+xml' href='http://mittrasw.blogspot.com/feeds/3280996640017843653/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mittrasw.blogspot.com/2013/10/ssh-and-sudoers.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5416507646115832994/posts/default/3280996640017843653'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5416507646115832994/posts/default/3280996640017843653'/><link rel='alternate' type='text/html' href='http://mittrasw.blogspot.com/2013/10/ssh-and-sudoers.html' title='SSH and Sudoers'/><author><name>Mittra Software</name><uri>http://www.blogger.com/profile/09954375852101781488</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNOlduh3N2owDQr9ycxnooumei02qLd3Qe1gjwUfRboNE_va3p3fjZfKxdJB1CXQHPIs03R-OGEuB1wgNR8unWjwqtx1t2vrULIZ2Ure1mJ2J9XaKzvfAeViXoRIy_6g/s113/LogoMittra2.png'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGk7UVh3rnIITdLWIjKUTTXQddrQtrOKu2hN3mWRssgsKQCnXoLjiifVJjzBc2EirTyNS2TYaWeGEOeVstKRhm_rTXkD8J14tJ9cSDvN9-GCWD_0KMCahr20ZSWRFNydCf_AEftuB-9nAp/s72-c/ssh-tunnel.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5416507646115832994.post-2729267752959403727</id><published>2013-08-04T15:31:00.001-05:00</published><updated>2013-08-04T15:35:08.526-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="DNS"/><category scheme="http://www.blogger.com/atom/ns#" term="Linux"/><category scheme="http://www.blogger.com/atom/ns#" term="Network"/><category scheme="http://www.blogger.com/atom/ns#" term="OpenDNS"/><category scheme="http://www.blogger.com/atom/ns#" term="Ubuntu"/><title type='text'>DNSCrypt on Ubuntu</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1K8VqYo7yNS1F9krxs4uTga4kCugRSNbW-V6OwYXcp3nb5OdQsByhDi07pQNWka1fm36tlJPadrS9StK6dV_uA3-FhKeYVbWZRJIeLsf5mB7hnuNJ42222MmvaVrVi4PiAYQlJeN8Uoxc/s1600/dns.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1K8VqYo7yNS1F9krxs4uTga4kCugRSNbW-V6OwYXcp3nb5OdQsByhDi07pQNWka1fm36tlJPadrS9StK6dV_uA3-FhKeYVbWZRJIeLsf5mB7hnuNJ42222MmvaVrVi4PiAYQlJeN8Uoxc/s320/dns.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
After setting up a &lt;a href=&quot;http://mittrasw.blogspot.com/2013/07/configure-ubuntu-gateway.html&quot;&gt;shared wireless connection&lt;/a&gt;, I started to be worried about the &quot;plainness&quot; of the transmissions, that everything which would go through the air and the router could be simply read by another received and use that information to another purpose. Of course, there is the always reliable &lt;a href=&quot;https://www.torproject.org/&quot;&gt;TOR&lt;/a&gt; network, but due to a quite high latency already increased, then I decided to skip it. Nonetheless, I still wanted something running on every request and that would increase a little the privacy, then I found DNSCryopt. In other words: &lt;br /&gt;
&lt;blockquote&gt;DNSCrypt encrypts all DNS traffic between your computer and the OpenDNS servers (so you&#39;ll be using OpenDNS) and can protect you from man-in-the-middle attacks, spying, resolver impersonation, can prevent Internet service providers from blocking various websites and more.&lt;/blockquote&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
But theory is boring, let&#39;s go practice, first Download the package from internet, at the time of writing the lastest version was 1.3.2, but better check them &lt;a href=&quot;http://download.dnscrypt.org/dnscrypt-proxy/&quot;&gt;here&lt;/a&gt;, also it depends on &lt;a href=&quot;https://github.com/jedisct1/libsodium&quot;&gt;Libsodium 0.42&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;pre style=&quot;background-image: URL(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDcLzOu68WD23doPIL1hcHvui3PV91vF_jVyFuN8oSOBz2BT4pWEgJPomHs2Zk-c1BVA71ID8VhWoIqpKUySz-Ixq5bxIJU431ktIkL-vURX0KNxnt7BHwmM_W-4CO3UAuWXL6OgHsOOwV/s320/codebg.gif); background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;&quot;&gt;&lt;code style=&quot;color: black; word-wrap: normal;&quot;&gt; # wget http://download.dnscrypt.org/dnscrypt-proxy/dnscrypt-proxy-1.3.2.tar.gz 
 # wget http://download.libsodium.org/libsodium/releases/libsodium-0.4.2.tar.gz
 # sudo apt-get update &amp;amp; sudo apt-get upgrade
 # tar -xvzf libsodium-0.4.2.tar.gz
 # cd libsodium-0.4.2/ &amp;amp;&amp;amp; ./configure &amp;amp;&amp;amp; make &amp;amp;&amp;amp; make install
 # sudo ldconfig
 # cd..
 # tar -xvzf dnscrypt-proxy-1.3.2.tar.gz
 # cd dnscrypt-proxy-1.3.2/ &amp;amp;&amp;amp; ./configure &amp;amp;&amp;amp; make &amp;amp;&amp;amp; make install
&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
With all the commands before, DNSCryot should be installed and ready to run in the folder &lt;b&gt;/usr/local/sbin/dnscrypt-proxy&lt;/b&gt; by default. Then it is time to configure it. First we edit the the DNS file:&lt;br /&gt;
&lt;br /&gt;
&lt;pre style=&quot;background-image: URL(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDcLzOu68WD23doPIL1hcHvui3PV91vF_jVyFuN8oSOBz2BT4pWEgJPomHs2Zk-c1BVA71ID8VhWoIqpKUySz-Ixq5bxIJU431ktIkL-vURX0KNxnt7BHwmM_W-4CO3UAuWXL6OgHsOOwV/s320/codebg.gif); background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;&quot;&gt;&lt;code style=&quot;color: black; word-wrap: normal;&quot;&gt; # cd /etc/resolvconf/resolv.conf.d
 # sudo cp -p head head.orig  # &quot;backup copy, always do this&quot;
 # sudo nano head
Add this to the end of the file: nameserver 127.0.0.2
 # sudo resolvconf -u
&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
This should append this new direction at which we will forward all request. Then, to profit out of the convenience methods used by the &quot;service&quot; command, &lt;a href=&quot;http://webupd8.googlecode.com/files/dnscrypt-0.2.tar.gz&quot;&gt;here was an script&lt;/a&gt; created in the WebUp8 Blog that I modified in order to help us call the command and initiate the application when the server restarts:&lt;br /&gt;
&lt;br /&gt;
&lt;pre style=&quot;background-image: URL(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDcLzOu68WD23doPIL1hcHvui3PV91vF_jVyFuN8oSOBz2BT4pWEgJPomHs2Zk-c1BVA71ID8VhWoIqpKUySz-Ixq5bxIJU431ktIkL-vURX0KNxnt7BHwmM_W-4CO3UAuWXL6OgHsOOwV/s320/codebg.gif); background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;&quot;&gt;&lt;code style=&quot;color: black; word-wrap: normal;&quot;&gt; description &quot;dnscrypt startup script&quot;

start on (local-filesystems and started dbus and stopped udevtrigger)
stop on runlevel [016]

script
        exec dnscrypt-proxy -a 127.0.0.2 --daemonize --pidfile=/run/dnscrypt-proxy.pid --edns-payload-size=4096
end script
&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
And with the file saved, then everything is moved to the right place:&lt;br /&gt;
&lt;br /&gt;
&lt;pre style=&quot;background-image: URL(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDcLzOu68WD23doPIL1hcHvui3PV91vF_jVyFuN8oSOBz2BT4pWEgJPomHs2Zk-c1BVA71ID8VhWoIqpKUySz-Ixq5bxIJU431ktIkL-vURX0KNxnt7BHwmM_W-4CO3UAuWXL6OgHsOOwV/s320/codebg.gif); background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;&quot;&gt;&lt;code style=&quot;color: black; word-wrap: normal;&quot;&gt; # sudo cp dnscrypt.conf /etc/init/
 # sudo ln -s /lib/init/upstart-job /etc/init.d/dnscrypt
 # sudo service start dnscrypt
&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
If everything worked as expected, then at the end you will be able to visit the webpage of &lt;a href=&quot;http://www.opendns.com/welcome/&quot;&gt;OpenDNS&lt;/a&gt; and see this screen:&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8_nVj4VX2SdAAcfGOArL9A-3TEwkS6OwIEi2hjjdQfaTua-UOzRG7KuHAaGSEoSC93CTlq8DDNoGOqj20NbmXVdx-luWV6vdyFADhN_Mk8QJP178zB00ppwjv7mAtrxeyFhG8TdXKoxoI/s1600/Screen+Shot+2013-08-04+at+15.52.56.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8_nVj4VX2SdAAcfGOArL9A-3TEwkS6OwIEi2hjjdQfaTua-UOzRG7KuHAaGSEoSC93CTlq8DDNoGOqj20NbmXVdx-luWV6vdyFADhN_Mk8QJP178zB00ppwjv7mAtrxeyFhG8TdXKoxoI/s320/Screen+Shot+2013-08-04+at+15.52.56.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
At the end, you can follow these instructions to see how the packages are encrypted: &lt;a href=&quot;http://askubuntu.com/questions/105366/how-to-check-if-dns-is-encrypted&quot;&gt;How to check if DNS is encrypted?&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Sources:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;http://www.webupd8.org/2012/02/encrypt-dns-traffic-in-linux-with.html&quot;&gt;Encrypt DNS Traffic In Linux With DNSCrypt (Via OpenDNS)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://dnscrypt.org/&quot;&gt;DNSCrypt&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.opendns.com/technology/dnscrypt/&quot;&gt;Introducing DNSCrypt&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.perseosblog.com/en/posts/security-encrypt-all-our-traffic-with-dnscrypt-in-ubuntu-mint-and-elementary%20os/&quot;&gt;Security: Encrypt all our traffic with DNSCrypt in Ubuntu, Mint and elementary OS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://askubuntu.com/questions/130452/how-do-i-add-a-dns-server-via-resolv-conf&quot;&gt;How do I add a DNS server via resolv.conf?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><link rel='replies' type='application/atom+xml' href='http://mittrasw.blogspot.com/feeds/2729267752959403727/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mittrasw.blogspot.com/2013/08/dnscrypt-on-ubuntu.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5416507646115832994/posts/default/2729267752959403727'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5416507646115832994/posts/default/2729267752959403727'/><link rel='alternate' type='text/html' href='http://mittrasw.blogspot.com/2013/08/dnscrypt-on-ubuntu.html' title='DNSCrypt on Ubuntu'/><author><name>Mittra Software</name><uri>http://www.blogger.com/profile/09954375852101781488</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNOlduh3N2owDQr9ycxnooumei02qLd3Qe1gjwUfRboNE_va3p3fjZfKxdJB1CXQHPIs03R-OGEuB1wgNR8unWjwqtx1t2vrULIZ2Ure1mJ2J9XaKzvfAeViXoRIy_6g/s113/LogoMittra2.png'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1K8VqYo7yNS1F9krxs4uTga4kCugRSNbW-V6OwYXcp3nb5OdQsByhDi07pQNWka1fm36tlJPadrS9StK6dV_uA3-FhKeYVbWZRJIeLsf5mB7hnuNJ42222MmvaVrVi4PiAYQlJeN8Uoxc/s72-c/dns.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5416507646115832994.post-3005373697589311402</id><published>2013-07-16T23:20:00.000-05:00</published><updated>2013-07-17T22:03:53.657-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="DHCP"/><category scheme="http://www.blogger.com/atom/ns#" term="IPTABLES"/><category scheme="http://www.blogger.com/atom/ns#" term="Linux"/><category scheme="http://www.blogger.com/atom/ns#" term="Network"/><category scheme="http://www.blogger.com/atom/ns#" term="Ubuntu"/><category scheme="http://www.blogger.com/atom/ns#" term="Wireless"/><title type='text'>Configure an Ubuntu &quot;Gateway&quot;</title><content type='html'>The original title was going to be:&lt;br /&gt;
&lt;br /&gt;
Configure an Ubuntu &quot;Gateway&quot; using two wireless devices and one server&lt;br /&gt;
&lt;br /&gt;
But it was going to be long and boring. Ok, everything started because I have moved to a new location and I was not going to have internet in a long time nor willing to get a two year contract with a company again. So, connection from my supporting neighbor was provided, the only thing I had to do is to create an extension to his wireless AP. Easily enough I could had bought a WiFi extender, but no fun was going to be out of there and of course, if he would like to sniff what was going trough, well you know the history.&lt;br /&gt;
&lt;br /&gt;
Fortunately I have this hardware ready to be set up: &lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://www.via.com.tw/en/products/embedded/artigo/a1000/&quot;&gt; VIA ARTiGO Pico-ITX Builder Kit A1000&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://www.alfa.com.tw/products_show.php?pc=34&amp;amp;ps=21&quot;&gt;Alfa AWUS036NH &lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://www.edslab.com/goods_cat.php?act=view&amp;amp;no=4&quot;&gt;WiDrive DX325&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
I could explain the network, but better seen graphically:&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2UOcD4fR73gf5WEklPhkpVYoPwb5WUdWRYmHddLQLTmPpDSD7Saz6qXeADIIiA3SKaAOOgOwdUFEtSDLCyKtIgGzL8fHUAe2Xr5HUR4qM3Y9AajSyrmMBGzDGS9YOKUT3pYtL_7JOvd9-/s1600/NetworkArtigo.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2UOcD4fR73gf5WEklPhkpVYoPwb5WUdWRYmHddLQLTmPpDSD7Saz6qXeADIIiA3SKaAOOgOwdUFEtSDLCyKtIgGzL8fHUAe2Xr5HUR4qM3Y9AajSyrmMBGzDGS9YOKUT3pYtL_7JOvd9-/s320/NetworkArtigo.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
It still needs an explanation: There is an Access Point (AP) in the neighbor house connected to internet, for this case the name will be NAP01 with a WEP key abcde12345. The Alpha AWUS036NH connects directly to this AP as normal, then it is assigned an IP address with the number 192.168.2.7. The Via Artigo receives all data through one USB 2.0 port and then shares its connection to the ethernet port, in other words wlan0 -&amp;gt;&amp;gt; eth0. After this, the WiDrive receives its connection from the eth0 to its WAN port and creates another AP called &quot;Internal&quot; with a WPA key &quot;abcabc&quot;.&lt;br /&gt;
&lt;br /&gt;
In summary:&lt;br /&gt;
&lt;br /&gt;
wlan0 - 192.168.1.5 (DHCP)&lt;br /&gt;
eth0 - 192.168.10.2 (STATIC)&lt;br /&gt;
wan - 192.168.10.5 (STATIC)&lt;br /&gt;
&lt;br /&gt;
With everything prepared in the hardware side, let&#39;s get our hands dirty.&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;&lt;b&gt;Get internet in the Artigo&lt;/b&gt;&lt;/li&gt;

As classy as always, connect to the access point using the network manager or by command line: 
&lt;pre style=&quot;background-image: URL(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDcLzOu68WD23doPIL1hcHvui3PV91vF_jVyFuN8oSOBz2BT4pWEgJPomHs2Zk-c1BVA71ID8VhWoIqpKUySz-Ixq5bxIJU431ktIkL-vURX0KNxnt7BHwmM_W-4CO3UAuWXL6OgHsOOwV/s320/codebg.gif); background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;&quot;&gt;&lt;code style=&quot;color: black; word-wrap: normal;&quot;&gt; # ifconfig wlan0 up  
 # iwlist wlan0 scan
 # iwconfig wlan0 essid NAP01 key abcde12345   
 # dhclient3 wlan0&lt;/code&gt;
&lt;/pre&gt;Of course, you need admin rights on the computer to execute any of the commands above, and most of the following as well. At the end the device wlan0 will have the following configuration: 
&lt;pre style=&quot;background-image: URL(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDcLzOu68WD23doPIL1hcHvui3PV91vF_jVyFuN8oSOBz2BT4pWEgJPomHs2Zk-c1BVA71ID8VhWoIqpKUySz-Ixq5bxIJU431ktIkL-vURX0KNxnt7BHwmM_W-4CO3UAuWXL6OgHsOOwV/s320/codebg.gif); background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;&quot;&gt;&lt;code style=&quot;color: black; word-wrap: normal;&quot;&gt; # ifconfig wlan0
wlan0     Link encap:Ethernet  HWaddr 00:01:01:01:01:01  
          inet addr:192.168.1.7  Bcast:192.168.1.255  
          Mask:255.255.255.0&lt;/code&gt;
&lt;/pre&gt;
&lt;li&gt;&lt;b&gt;Set Static IP for the eth0 port&lt;/b&gt;&lt;/li&gt;

Once we know we are receiving internet from the USB device wlan0, we set the IP of the eth0 static and with &quot;DIFFERENT&quot; network in comparison with the one that the DHCP from the router assigns. The commands are: 
&lt;pre style=&quot;background-image: URL(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDcLzOu68WD23doPIL1hcHvui3PV91vF_jVyFuN8oSOBz2BT4pWEgJPomHs2Zk-c1BVA71ID8VhWoIqpKUySz-Ixq5bxIJU431ktIkL-vURX0KNxnt7BHwmM_W-4CO3UAuWXL6OgHsOOwV/s320/codebg.gif); background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;&quot;&gt;&lt;code style=&quot;color: black; word-wrap: normal;&quot;&gt; # sudo nano /etc/network/interfaces&lt;/code&gt;
&lt;/pre&gt;Then edit this document with your details, mine is as follows: 
&lt;pre style=&quot;background-image: URL(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDcLzOu68WD23doPIL1hcHvui3PV91vF_jVyFuN8oSOBz2BT4pWEgJPomHs2Zk-c1BVA71ID8VhWoIqpKUySz-Ixq5bxIJU431ktIkL-vURX0KNxnt7BHwmM_W-4CO3UAuWXL6OgHsOOwV/s320/codebg.gif); background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;&quot;&gt;&lt;code style=&quot;color: black; word-wrap: normal;&quot;&gt;auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
        address 192.168.10.2
        network 192.168.10.0 # different network
        netmask 255.255.255.0
        broadcast 192.160.10.255
        gateway 192.168.1.7  
# take especial consideration to the gateway
# because it is the same IP address that was 
# assigned by the router to the
# wlan0&lt;/code&gt;
&lt;/pre&gt;If by any means the DHCP client interferes with the config of the network port, then run this code to uninstall the package, and then restart the network interface. 
&lt;pre style=&quot;background-image: URL(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDcLzOu68WD23doPIL1hcHvui3PV91vF_jVyFuN8oSOBz2BT4pWEgJPomHs2Zk-c1BVA71ID8VhWoIqpKUySz-Ixq5bxIJU431ktIkL-vURX0KNxnt7BHwmM_W-4CO3UAuWXL6OgHsOOwV/s320/codebg.gif); background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;&quot;&gt;&lt;code style=&quot;color: black; word-wrap: normal;&quot;&gt; # sudo apt-get remove dhcp-client
 # sudo /etc/init.d/networking restart&lt;/code&gt;
&lt;/pre&gt;
&lt;li&gt;&lt;b&gt;Set Up the Internet Sharing using IPTables&lt;/b&gt;&lt;/li&gt;

Ok, at this point, we are going to forward everything that enters from the wlan0 to the eth0 and backwards as well, it is done with the following commands: 
&lt;pre style=&quot;background-image: URL(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDcLzOu68WD23doPIL1hcHvui3PV91vF_jVyFuN8oSOBz2BT4pWEgJPomHs2Zk-c1BVA71ID8VhWoIqpKUySz-Ixq5bxIJU431ktIkL-vURX0KNxnt7BHwmM_W-4CO3UAuWXL6OgHsOOwV/s320/codebg.gif); background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;&quot;&gt;&lt;code style=&quot;color: black; word-wrap: normal;&quot;&gt; # sudo iptables -A FORWARD -o wlan0 -i eth0 \
 -s 192.168.10.0/24 -m conntrack --ctstate NEW -j ACCEPT
 # sudo iptables -A FORWARD -m conntrack \
 --ctstate ESTABLISHED,RELATED -j ACCEPT
 # sudo iptables -t nat -A POSTROUTING  \
 -s 192.168.10.0/24 -o wlan0 -j MASQUERATE
 # sudo iptables -t nat -A POSTROUTING \
 -o wlan0 -j MASQUERADE&lt;/code&gt;
&lt;/pre&gt;The two initial rules tells IPTables to take as input eth0 with the IP range from 192.168.10.0 through 24 and communicate to the output port wlan0 every new connexion as well as forward any packet. The last two tells quite the same but backwards and using NAT rules. Now we must make these changes last between sessions and/or reboot. So we save the rules in the file &quot;iptables.sav&quot; and edit the rc.local to execute the restore tool of the rules:   &lt;pre style=&quot;background-image: URL(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDcLzOu68WD23doPIL1hcHvui3PV91vF_jVyFuN8oSOBz2BT4pWEgJPomHs2Zk-c1BVA71ID8VhWoIqpKUySz-Ixq5bxIJU431ktIkL-vURX0KNxnt7BHwmM_W-4CO3UAuWXL6OgHsOOwV/s320/codebg.gif); background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;&quot;&gt;&lt;code style=&quot;color: black; word-wrap: normal;&quot;&gt; # sudo iptables-save | sudo tee /etc/iptables.sav
 # sudo nano /etc/rc.local&lt;/code&gt;
&lt;/pre&gt;And before the last command &quot;exit 0&quot; in the file &quot;rc.local&quot; we add the following line:  &lt;pre style=&quot;background-image: URL(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDcLzOu68WD23doPIL1hcHvui3PV91vF_jVyFuN8oSOBz2BT4pWEgJPomHs2Zk-c1BVA71ID8VhWoIqpKUySz-Ixq5bxIJU431ktIkL-vURX0KNxnt7BHwmM_W-4CO3UAuWXL6OgHsOOwV/s320/codebg.gif); background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;&quot;&gt;&lt;code style=&quot;color: black; word-wrap: normal;&quot;&gt;iptables-restore &lt; /etc/iptables.sav&lt;/code&gt;
&lt;/pre&gt;The last step of this section is to enable the ip forwarding but in &quot;hardware&quot;, as well as edit the file &quot;sysctl.conf&quot; to set the flags enabled to port forwarding:  &lt;pre style=&quot;background-image: URL(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDcLzOu68WD23doPIL1hcHvui3PV91vF_jVyFuN8oSOBz2BT4pWEgJPomHs2Zk-c1BVA71ID8VhWoIqpKUySz-Ixq5bxIJU431ktIkL-vURX0KNxnt7BHwmM_W-4CO3UAuWXL6OgHsOOwV/s320/codebg.gif); background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;&quot;&gt;&lt;code style=&quot;color: black; word-wrap: normal;&quot;&gt; # sudo sh -c &quot;echo 1 &gt; /proc/sys/net/ipv4/ip_forward&quot;
 # sudo nano /etc/sysctl.conf&lt;/code&gt;
&lt;/pre&gt;Search for the lines or add them at the end of the file in case they do not exist already:  &lt;pre style=&quot;background-image: URL(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDcLzOu68WD23doPIL1hcHvui3PV91vF_jVyFuN8oSOBz2BT4pWEgJPomHs2Zk-c1BVA71ID8VhWoIqpKUySz-Ixq5bxIJU431ktIkL-vURX0KNxnt7BHwmM_W-4CO3UAuWXL6OgHsOOwV/s320/codebg.gif); background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;&quot;&gt;&lt;code style=&quot;color: black; word-wrap: normal;&quot;&gt;net.ipv4.ip_forward=1
net.ipv4.conf.all.forwarding=1
net.ipv4.conf.default.forwarding=1&lt;/code&gt;
&lt;/pre&gt;A whole system restart would be good or also a network one could take place:  &lt;pre style=&quot;background-image: URL(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDcLzOu68WD23doPIL1hcHvui3PV91vF_jVyFuN8oSOBz2BT4pWEgJPomHs2Zk-c1BVA71ID8VhWoIqpKUySz-Ixq5bxIJU431ktIkL-vURX0KNxnt7BHwmM_W-4CO3UAuWXL6OgHsOOwV/s320/codebg.gif); background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;&quot;&gt;&lt;code style=&quot;color: black; word-wrap: normal;&quot;&gt; # sudo /etc/init.d/networking restart&lt;/code&gt;
&lt;/pre&gt;
&lt;li&gt;&lt;b&gt;Set an Static IP for the WAN port&lt;/b&gt;&lt;/li&gt;

Once we have set everything behind scenes, then the WAN port in the WiDrive is going to be assigned statically in order to avoid network interferences and being able to use any kind of ethernet wire, I used the small one that came with the package. So we need to enter to the web interface of the WiDrive. In my case, I have it configured to be the address 192.168.1.2.  &lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-1vkbxnQXhYeUBrHq8NiY0FPKBQBExtTB7WoJ1miwAdT0XrCAI5YCOTxx55c1JXNHC-jMtiM2oFHRRFNS6FhBlJ5ETKedpbvo1ecdzW25wcFgRKAw845xHtA-XtwM3ArgD_kurmv-TyMK/s1600/Screen+Shot+2013-07-17+at+00.03.24.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-1vkbxnQXhYeUBrHq8NiY0FPKBQBExtTB7WoJ1miwAdT0XrCAI5YCOTxx55c1JXNHC-jMtiM2oFHRRFNS6FhBlJ5ETKedpbvo1ecdzW25wcFgRKAw845xHtA-XtwM3ArgD_kurmv-TyMK/s320/Screen+Shot+2013-07-17+at+00.03.24.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAbOYs-dn_U18zYAfG08CBhj8LNeEwO2DkFj3NITPZzNQiSkzY1z1ZhYBma_dB0ULUlWLUIVTc4u5As8kbXONFknJMVu9Z_tXOGhsBWVZjwStyxHMUu3UWy4hedRWu9E0jyICnpt2-f7zH/s1600/Screen+Shot+2013-07-17+at+00.03.33.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAbOYs-dn_U18zYAfG08CBhj8LNeEwO2DkFj3NITPZzNQiSkzY1z1ZhYBma_dB0ULUlWLUIVTc4u5As8kbXONFknJMVu9Z_tXOGhsBWVZjwStyxHMUu3UWy4hedRWu9E0jyICnpt2-f7zH/s320/Screen+Shot+2013-07-17+at+00.03.33.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjybeNSFZZlExSMIJpnA03H_SoHc5h_GfIMLaRec9NimqTObfBUbI0IsFiHcb5Xk17aqAn2INKzdk5uXQQhyphenhyphen4yZmvM1rrzhfkMuCCvMuyszPlu_UsYj_UrtN4lWFgWiIlUgX4nDvTP0pesu/s1600/Screen+Shot+2013-07-17+at+00.04.11.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjybeNSFZZlExSMIJpnA03H_SoHc5h_GfIMLaRec9NimqTObfBUbI0IsFiHcb5Xk17aqAn2INKzdk5uXQQhyphenhyphen4yZmvM1rrzhfkMuCCvMuyszPlu_UsYj_UrtN4lWFgWiIlUgX4nDvTP0pesu/s320/Screen+Shot+2013-07-17+at+00.04.11.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;As the last image shows, the WAN port has been configured using the same network as the eth0 (192.168.10.0/24), same broadcast in all cases but different ip from the one used in the eth0.  After this, all clients that connect to the WiDrive will be able to get internet access as well as the shared content from the hard drive inside this device. &lt;/ol&gt;&lt;br /&gt;
This last command might help in case you have this error: &quot;status: Unknown parameter: INTERFACE&quot; when trying to query the network interfaces:&lt;br /&gt;
&lt;br /&gt;
&lt;pre style=&quot;background-image: URL(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDcLzOu68WD23doPIL1hcHvui3PV91vF_jVyFuN8oSOBz2BT4pWEgJPomHs2Zk-c1BVA71ID8VhWoIqpKUySz-Ixq5bxIJU431ktIkL-vURX0KNxnt7BHwmM_W-4CO3UAuWXL6OgHsOOwV/s320/codebg.gif); background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;&quot;&gt;&lt;code style=&quot;color: black; word-wrap: normal;&quot;&gt; # service network-interface restart INTERFACE=eth0&lt;/code&gt;
&lt;/pre&gt;&lt;br /&gt;
The last part is the important bit. And I almost forgot, here are the links of the references that helped me create these steps:&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://www.howtogeek.com/howto/ubuntu/change-ubuntu-server-from-dhcp-to-a-static-ip-address/&quot;&gt;How to Geek - Assign an static IP&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://help.ubuntu.com/community/Internet/ConnectionSharing&quot;&gt;Help Ubuntu - Internet Sharing&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://thebeautifullmind.com/2012/09/19/sharing-internet-over-wifi-between-ubuntu-and-android/&quot;&gt;Geek Peek - Sharing WiFi&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://lindesk.com/2007/04/internet-connection-sharing-using-iptables/&quot;&gt;Lindesk - Enable IP Forwarding&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://trac.mcs.anl.gov/projects/bcfg2/ticket/946&quot;&gt;BCFG - status: Unknown parameter: INTERFACE&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://mittrasw.blogspot.com/feeds/3005373697589311402/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mittrasw.blogspot.com/2013/07/configure-ubuntu-gateway.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5416507646115832994/posts/default/3005373697589311402'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5416507646115832994/posts/default/3005373697589311402'/><link rel='alternate' type='text/html' href='http://mittrasw.blogspot.com/2013/07/configure-ubuntu-gateway.html' title='Configure an Ubuntu &quot;Gateway&quot;'/><author><name>Mittra Software</name><uri>http://www.blogger.com/profile/09954375852101781488</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNOlduh3N2owDQr9ycxnooumei02qLd3Qe1gjwUfRboNE_va3p3fjZfKxdJB1CXQHPIs03R-OGEuB1wgNR8unWjwqtx1t2vrULIZ2Ure1mJ2J9XaKzvfAeViXoRIy_6g/s113/LogoMittra2.png'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2UOcD4fR73gf5WEklPhkpVYoPwb5WUdWRYmHddLQLTmPpDSD7Saz6qXeADIIiA3SKaAOOgOwdUFEtSDLCyKtIgGzL8fHUAe2Xr5HUR4qM3Y9AajSyrmMBGzDGS9YOKUT3pYtL_7JOvd9-/s72-c/NetworkArtigo.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5416507646115832994.post-4837220219040020781</id><published>2013-04-10T22:19:00.000-05:00</published><updated>2013-07-16T23:22:13.206-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="C++"/><category scheme="http://www.blogger.com/atom/ns#" term="PS3"/><category scheme="http://www.blogger.com/atom/ns#" term="Sockets"/><category scheme="http://www.blogger.com/atom/ns#" term="TCP/IP"/><title type='text'>Scalability and consistency in Server Based Network Gaming</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_dpu_4RGT5K16dZynsarzgQA0bkXzeFWW1NQTGHu6GWJodLe7haWLs3onIwhLV3TLEv_b6jjkwT1gqOXpITBfU72Sjft8zyJ1zZjpUvY90aEyx0ydFmQGnehaWd5pajU0sgbfDTPGFgxg/s1600/Ps3Grid.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;214&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_dpu_4RGT5K16dZynsarzgQA0bkXzeFWW1NQTGHu6GWJodLe7haWLs3onIwhLV3TLEv_b6jjkwT1gqOXpITBfU72Sjft8zyJ1zZjpUvY90aEyx0ydFmQGnehaWd5pajU0sgbfDTPGFgxg/s320/Ps3Grid.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
While I was doing the MSc in Newcastle, we needed to create an academic paper for the Game Networking module. So, now I am doing it public so other people, and specially researchers, can see that I have strong academic background and I am able to write papers. Of course, I am open to comments and always learning new ways to do it better ;)&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;This paper describes the capabilities of a Server based communication between two or many PS3 consoles as a way to efficiently transfer data using the TCP/IP protocols with the hardware embedded (Ethernet Cable and Wireless 802.11G). Also, it coves the common problems arising with the inclusion of more systems in the same network in order to keep communication consistency as well as some performance efficacy under different scenarios where low and high data transfer is required in between systems, whilst just one active server socket is kept open. When low demand applications are running and as highly bandwidth consuming case both are presented, in order to estimate how many consoles could be brought into the same network without a hit on game accomplishment.&lt;/blockquote&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;Playstation 3 (PS3) systems are computer machines designed by Sony Computer Entertainment to serve as a video game console as well as a multimedia center, capable of displaying various media content from standard to full definition (video, images), as well as stay connected to a network using the standard stack protocols TCP/IP, resulting in a continuously communicated device not only in a local scope, also internet is considered as a content provider (PlayStation Network, HTML Browser or DLNA servers, among others).&lt;/blockquote&gt;¿¿More?? Find the full report here:&amp;nbsp;http://es.scribd.com/doc/135278843/Scalability-and-Consistency-in-Peer-To-Peer-Based-Network-Gaming</content><link rel='replies' type='application/atom+xml' href='http://mittrasw.blogspot.com/feeds/4837220219040020781/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mittrasw.blogspot.com/2013/04/scalability-and-consistency-in-server.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5416507646115832994/posts/default/4837220219040020781'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5416507646115832994/posts/default/4837220219040020781'/><link rel='alternate' type='text/html' href='http://mittrasw.blogspot.com/2013/04/scalability-and-consistency-in-server.html' title='Scalability and consistency in Server Based Network Gaming'/><author><name>Mittra Software</name><uri>http://www.blogger.com/profile/09954375852101781488</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNOlduh3N2owDQr9ycxnooumei02qLd3Qe1gjwUfRboNE_va3p3fjZfKxdJB1CXQHPIs03R-OGEuB1wgNR8unWjwqtx1t2vrULIZ2Ure1mJ2J9XaKzvfAeViXoRIy_6g/s113/LogoMittra2.png'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_dpu_4RGT5K16dZynsarzgQA0bkXzeFWW1NQTGHu6GWJodLe7haWLs3onIwhLV3TLEv_b6jjkwT1gqOXpITBfU72Sjft8zyJ1zZjpUvY90aEyx0ydFmQGnehaWd5pajU0sgbfDTPGFgxg/s72-c/Ps3Grid.png" height="72" width="72"/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5416507646115832994.post-6962353990702121031</id><published>2013-03-17T16:47:00.000-06:00</published><updated>2013-03-17T16:47:40.000-06:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="AI"/><category scheme="http://www.blogger.com/atom/ns#" term="CSP"/><category scheme="http://www.blogger.com/atom/ns#" term="Haskell"/><category scheme="http://www.blogger.com/atom/ns#" term="Programming"/><title type='text'>Constraint Functional Programming using Heterogenous Architectures</title><content type='html'>What a fancy name for just do this:&lt;br /&gt;
&lt;br /&gt;
Have a Constraint Satisfaction Problem, then program it using Haskell and exploit multicore capabilities, what I mean with this, that user should not worry if they have 1, 10 or 1000 processing units, he/she would see an automatic performance increase just by running on a platform where more resources are available.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQHNEx-UDHHmClIbAcJbd7v2avPA1SCLwy-qK6SGr2FPTYz5mrpi04phlz3JMK4dZccC5oajy0iN2xJ-1y-ievT4wevJFvWpdnZdKemnkXxWPm-9wEy7RuCq3HJnMqfVXLEWIeOWZcd4no/s1600/csp.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;189&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQHNEx-UDHHmClIbAcJbd7v2avPA1SCLwy-qK6SGr2FPTYz5mrpi04phlz3JMK4dZccC5oajy0iN2xJ-1y-ievT4wevJFvWpdnZdKemnkXxWPm-9wEy7RuCq3HJnMqfVXLEWIeOWZcd4no/s320/csp.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;But you might wonder, why use Haskell if there are thousands of libraries already written for C++ or other languages?? Well the only reason is because functional programming is a high level - abstract approach to implement any mathematical statement, and due to AI heavily reling on logic, then it is a good start.&lt;br /&gt;
&lt;br /&gt;
If you would like to see it further, here is the preliminary draft of the document that states which would be the outcome of such research. And yes, I would like to study a PhD program ;)&lt;br /&gt;
&lt;br /&gt;
http://es.scribd.com/doc/130920180/PhD-Proposal-CFProg</content><link rel='replies' type='application/atom+xml' href='http://mittrasw.blogspot.com/feeds/6962353990702121031/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mittrasw.blogspot.com/2013/03/constraint-functional-programming-using.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5416507646115832994/posts/default/6962353990702121031'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5416507646115832994/posts/default/6962353990702121031'/><link rel='alternate' type='text/html' href='http://mittrasw.blogspot.com/2013/03/constraint-functional-programming-using.html' title='Constraint Functional Programming using Heterogenous Architectures'/><author><name>Mittra Software</name><uri>http://www.blogger.com/profile/09954375852101781488</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNOlduh3N2owDQr9ycxnooumei02qLd3Qe1gjwUfRboNE_va3p3fjZfKxdJB1CXQHPIs03R-OGEuB1wgNR8unWjwqtx1t2vrULIZ2Ure1mJ2J9XaKzvfAeViXoRIy_6g/s113/LogoMittra2.png'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQHNEx-UDHHmClIbAcJbd7v2avPA1SCLwy-qK6SGr2FPTYz5mrpi04phlz3JMK4dZccC5oajy0iN2xJ-1y-ievT4wevJFvWpdnZdKemnkXxWPm-9wEy7RuCq3HJnMqfVXLEWIeOWZcd4no/s72-c/csp.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5416507646115832994.post-6333169908229586293</id><published>2013-03-02T16:59:00.001-06:00</published><updated>2013-03-02T17:06:39.526-06:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="3D"/><category scheme="http://www.blogger.com/atom/ns#" term="C++"/><category scheme="http://www.blogger.com/atom/ns#" term="iOS"/><category scheme="http://www.blogger.com/atom/ns#" term="Newcastle"/><category scheme="http://www.blogger.com/atom/ns#" term="PS3"/><title type='text'>Voxel Render Engine for PS3 SDK</title><content type='html'>Hello Everyone!!&lt;br /&gt;
&lt;br /&gt;
Long time I have not been here, not even to check if someone is trying to spam comments all around. Well, the good news it is that today I wanted to release my Master Thesis, which was about a way to display voxelized models using the PS3 SDK.&lt;br /&gt;
&lt;br /&gt;
I did not do it before because I was &quot;under NDA&quot;, an agreement between Newcastle University and SCE Europe. however I think by this time, they do not care anymore about releasing key points and ideas about what my document is about.&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-Qqjgx0WgiV-Y6lP2Cbs43HAhvT4avVAK7Hu5fXfGeagFgeyDSZJdMevyQlJvMSaJuOosuOm0q8XrvmYPKYZ2Ov0ZUDKo1NoaEjJtPL-fo8h9PBsuhkcSCWcSWlQjK4Vi6APfVtE5JN5Q/s1600/1SheepMesh.PNG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;111&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-Qqjgx0WgiV-Y6lP2Cbs43HAhvT4avVAK7Hu5fXfGeagFgeyDSZJdMevyQlJvMSaJuOosuOm0q8XrvmYPKYZ2Ov0ZUDKo1NoaEjJtPL-fo8h9PBsuhkcSCWcSWlQjK4Vi6APfVtE5JN5Q/s320/1SheepMesh.PNG&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Another motivation of doing it was my pursuit towards a PhD program; this way if you are a researcher, you would be able to get an sneak peak of what I did during the program (1 year) the time of dissertation (3 months) and with a publishable format (10 - 15 pages).&lt;br /&gt;
&lt;br /&gt;
And to get you not bored, here are some images that are related to it and how I was able to deploy it as well in other platforms (Windows, iOS)&lt;br /&gt;
&lt;br /&gt;
Cheers!! (as NCL used to say)&lt;br /&gt;
&lt;br /&gt;
Dissertation&lt;br /&gt;
&lt;a href=&quot;http://www.openthesis.org/documents/Sparse-Voxel-Octree-Rendering-Engine-601379.html&quot;&gt;http://www.openthesis.org/documents/Sparse-Voxel-Octree-Rendering-Engine-601379.html&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRc0po6sMWQluulhWl2RfYf-MvwgpZE3J3iGUt1zZhBUrcWyDqsU649abmf3G50Y0lPCEFzml3mjDMRQT_oh9o3GE7OZ-F5_fp_ov1QthP3aKErIlhMFH-1jFWUaCh15WeJf6s4lpks4gl/s1600/iOSGipshand322.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRc0po6sMWQluulhWl2RfYf-MvwgpZE3J3iGUt1zZhBUrcWyDqsU649abmf3G50Y0lPCEFzml3mjDMRQT_oh9o3GE7OZ-F5_fp_ov1QthP3aKErIlhMFH-1jFWUaCh15WeJf6s4lpks4gl/s320/iOSGipshand322.png&quot; width=&quot;247&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
iOS Simulator&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9jlsV39_n1C8lgLqPOaz9Hjh6uwr2A2d6JrX4tC4dTXnDDJWCwxRQ2b2FbkhyphenhyphenmXsNu0trlFymoUTLD_7rEVJYw-TieYA7H2IXilV_zdP5zmjItB7R_LctNinLUARw_P87awMVt1XxQxs3/s1600/ChevalierB512.PNG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;180&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9jlsV39_n1C8lgLqPOaz9Hjh6uwr2A2d6JrX4tC4dTXnDDJWCwxRQ2b2FbkhyphenhyphenmXsNu0trlFymoUTLD_7rEVJYw-TieYA7H2IXilV_zdP5zmjItB7R_LctNinLUARw_P87awMVt1XxQxs3/s320/ChevalierB512.PNG&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
PS3 Screen&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhllGQao47OE3MS_YaNXZ0u6nqqaqy6VbKKJd1TMeZIsB2fYYbLtmMzt0XFKlRUyxVDaX7Xo4eSAw3AhklrGe1Cw_84DoBd4uBMSo5crvI7i1iwRCdR2v3R8YXPtsK8i6UBwInR_cCLRLNP/s1600/WinNecropolis.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;241&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhllGQao47OE3MS_YaNXZ0u6nqqaqy6VbKKJd1TMeZIsB2fYYbLtmMzt0XFKlRUyxVDaX7Xo4eSAw3AhklrGe1Cw_84DoBd4uBMSo5crvI7i1iwRCdR2v3R8YXPtsK8i6UBwInR_cCLRLNP/s320/WinNecropolis.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
Windows OpenGL&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://mittrasw.blogspot.com/feeds/6333169908229586293/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mittrasw.blogspot.com/2013/03/voxel-render-engine-for-ps3-sdk.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5416507646115832994/posts/default/6333169908229586293'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5416507646115832994/posts/default/6333169908229586293'/><link rel='alternate' type='text/html' href='http://mittrasw.blogspot.com/2013/03/voxel-render-engine-for-ps3-sdk.html' title='Voxel Render Engine for PS3 SDK'/><author><name>Mittra Software</name><uri>http://www.blogger.com/profile/09954375852101781488</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNOlduh3N2owDQr9ycxnooumei02qLd3Qe1gjwUfRboNE_va3p3fjZfKxdJB1CXQHPIs03R-OGEuB1wgNR8unWjwqtx1t2vrULIZ2Ure1mJ2J9XaKzvfAeViXoRIy_6g/s113/LogoMittra2.png'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-Qqjgx0WgiV-Y6lP2Cbs43HAhvT4avVAK7Hu5fXfGeagFgeyDSZJdMevyQlJvMSaJuOosuOm0q8XrvmYPKYZ2Ov0ZUDKo1NoaEjJtPL-fo8h9PBsuhkcSCWcSWlQjK4Vi6APfVtE5JN5Q/s72-c/1SheepMesh.PNG" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5416507646115832994.post-2588372381223818637</id><published>2012-03-23T18:11:00.000-06:00</published><updated>2012-03-23T18:12:23.870-06:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="C++"/><category scheme="http://www.blogger.com/atom/ns#" term="Development"/><category scheme="http://www.blogger.com/atom/ns#" term="Nvidia"/><category scheme="http://www.blogger.com/atom/ns#" term="Programming"/><category scheme="http://www.blogger.com/atom/ns#" term="PS3"/><title type='text'>Deferred Lighting on PS3</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHREsx1SR5yemmobDDu65iS9vO_IwB0XpgpuDobasNHzYwcSkgoAfKouWioXD9fY0cGyuLoJ_tQxhcix1B4vSVCTTupNeeXPRBC1TWFO698ZvIynaAxxIuLZ6RWWFmT3_5suG-kC7h16Fi/s1600/deferredbump0.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;181&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHREsx1SR5yemmobDDu65iS9vO_IwB0XpgpuDobasNHzYwcSkgoAfKouWioXD9fY0cGyuLoJ_tQxhcix1B4vSVCTTupNeeXPRBC1TWFO698ZvIynaAxxIuLZ6RWWFmT3_5suG-kC7h16Fi/s320/deferredbump0.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
After almost 4 weeks trying to work out Deferred lighting on the PS3, we did it!! Thanks to the help and knowledge of almighty &lt;a href=&quot;http://richdavison.co.uk/&quot;&gt;Richard&lt;/a&gt;, we were able to render to multiple phases and output the results on a PS3, something quite similar to what is shown on the initial image.&lt;br /&gt;
&lt;br /&gt;
But less words, more action:&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;iframe allowfullscreen=&quot;&quot; frameborder=&quot;0&quot; height=&quot;320&quot; src=&quot;http://www.youtube.com/embed/J5lWzbFfQWQ&quot; width=&quot;480&quot;&gt;&lt;/iframe&gt;&lt;br /&gt;
&lt;br /&gt;
As explained in &lt;a href=&quot;http://research.ncl.ac.uk/game/mastersdegree/modulegraphicsforgames/deferredrendering/Tutorial%2015%20-%20Deferred%20Rendering.pdf&quot;&gt;Richard&#39;s tutorial&lt;/a&gt;, the deferred lighting for the PS3 uses the same idea but instead of OpenGL, we use GCM, so changes from FrameBuffers to Surfaces or GLSL to Nvidia&#39;s CG language where among few inconveniences we encounter to make this demo work, but we never gave up.&lt;br /&gt;
&lt;br /&gt;
I&#39;ll make another post with more details about many experiences we had during development.</content><link rel='replies' type='application/atom+xml' href='http://mittrasw.blogspot.com/feeds/2588372381223818637/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mittrasw.blogspot.com/2012/03/after-almost-4-weeks-trying-to-work-out.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5416507646115832994/posts/default/2588372381223818637'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5416507646115832994/posts/default/2588372381223818637'/><link rel='alternate' type='text/html' href='http://mittrasw.blogspot.com/2012/03/after-almost-4-weeks-trying-to-work-out.html' title='Deferred Lighting on PS3'/><author><name>Mittra Software</name><uri>http://www.blogger.com/profile/09954375852101781488</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNOlduh3N2owDQr9ycxnooumei02qLd3Qe1gjwUfRboNE_va3p3fjZfKxdJB1CXQHPIs03R-OGEuB1wgNR8unWjwqtx1t2vrULIZ2Ure1mJ2J9XaKzvfAeViXoRIy_6g/s113/LogoMittra2.png'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHREsx1SR5yemmobDDu65iS9vO_IwB0XpgpuDobasNHzYwcSkgoAfKouWioXD9fY0cGyuLoJ_tQxhcix1B4vSVCTTupNeeXPRBC1TWFO698ZvIynaAxxIuLZ6RWWFmT3_5suG-kC7h16Fi/s72-c/deferredbump0.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5416507646115832994.post-7365800560607372883</id><published>2012-03-19T18:04:00.000-06:00</published><updated>2012-03-20T06:52:31.141-06:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Development"/><category scheme="http://www.blogger.com/atom/ns#" term="Games"/><category scheme="http://www.blogger.com/atom/ns#" term="Graphics"/><category scheme="http://www.blogger.com/atom/ns#" term="iPad"/><category scheme="http://www.blogger.com/atom/ns#" term="Newcastle"/><category scheme="http://www.blogger.com/atom/ns#" term="Programming"/><title type='text'>MSc in Computer Game Engineering @ NCL</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNLK624z9tUOev_KqzacX6U0LRJkLI78fvsmnf7k_RFOEX_dP1DzGiJRpIpZMl0HZzLqdPTPmwZl-Xe4baHc9g60lANaewPh77liitQXwGHRElVENeK5S0CxX4Cme7ysa-QYknoRmgfBO4/s1600/DSC09368.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;300&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNLK624z9tUOev_KqzacX6U0LRJkLI78fvsmnf7k_RFOEX_dP1DzGiJRpIpZMl0HZzLqdPTPmwZl-Xe4baHc9g60lANaewPh77liitQXwGHRElVENeK5S0CxX4Cme7ysa-QYknoRmgfBO4/s400/DSC09368.JPG&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
Hello Everyone!!&lt;br /&gt;
&lt;br /&gt;
I know I&#39;ve been far away from blogging in a long time, more precisely since September 9 2011, when today it&#39;s March 19, 2012. Before you get angrier with me, let me explain why I&#39;ve been so faraway lately:&lt;br /&gt;
&lt;br /&gt;
In late September I started master degree program in the United Kingdom, at the &lt;a href=&quot;http://www.ncl.ac.uk/&quot;&gt;Newcastle University&lt;/a&gt;, then right now I&#39;m studying &lt;a href=&quot;http://www.ncl.ac.uk/computing/current/postgrad/5152/&quot;&gt;MSc in Computer Game Engineering&lt;/a&gt;, where I&#39;ve learnt so much about programming in C++, OpenGL, Maths for Graphics, Memory Management, even how to program for the PS3 using the Sony Official SDK, isn&#39;t it so exciting??&lt;br /&gt;
&lt;br /&gt;
That&#39;s my main reason for being so distant from my blog, another was the overhear that was moving from México City to Newcastle Upon Tyne: baggages, computers, clothes and almost my entire life, however I forgot &lt;a href=&quot;http://en.wikipedia.org/wiki/File:FiveFingersKSOside.jpg&quot;&gt;my tennis shoes back home&lt;/a&gt;.&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTfuJbFs4eQqmgUzwHNcuUdwhmFx_-GkJhlfyk7rd8oleyPS_TUnVweVR6PyQz0D0ICmMTJOJaR7tTWqAifw1R4CGIy4JDi7TMiHwrKmRxPZB5AadjLHXO3QF2wgTWVbx6VmWB5DrLkP_8/s1600/University-of-Newcastle,-lo.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;233&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTfuJbFs4eQqmgUzwHNcuUdwhmFx_-GkJhlfyk7rd8oleyPS_TUnVweVR6PyQz0D0ICmMTJOJaR7tTWqAifw1R4CGIy4JDi7TMiHwrKmRxPZB5AadjLHXO3QF2wgTWVbx6VmWB5DrLkP_8/s320/University-of-Newcastle,-lo.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Just as simple like this: if you want to start developing the core engine of video games, this master program is such a really good start!!, not only you will learn how to program for real, also you will have the experience of real academia from research and industry as their best flavors, if you don&#39;t believe me, look at these profiles: &lt;a href=&quot;https://sites.google.com/site/grahammorgan/&quot;&gt;Graham Morgan&lt;/a&gt;, &lt;a href=&quot;http://www.ncl.ac.uk/computing/staff/profile/gary.ushaw&quot;&gt;Gary Ushaw&lt;/a&gt;, &lt;a href=&quot;http://www.ncl.ac.uk/computing/staff/student/richard.davison4&quot;&gt;Richard Davison&lt;/a&gt;, this last one such a real guru in graphics and programming.&lt;br /&gt;
&lt;br /&gt;
And for you to believe me, here are two videos that execute code using part of Richard&#39;s framework into the PS3 Dev Kit:&lt;br /&gt;
&lt;br /&gt;
&lt;iframe allowfullscreen=&quot;&quot; frameborder=&quot;0&quot; height=&quot;320&quot; src=&quot;http://www.youtube.com/embed/xnGVRqkE5sA&quot; width=&quot;480&quot;&gt;&lt;/iframe&gt;&lt;br /&gt;
&lt;br /&gt;
This was the first demo that I did:&lt;br /&gt;
&lt;br /&gt;
&lt;iframe width=&quot;480&quot; height=&quot;320&quot; src=&quot;http://www.youtube.com/embed/GzgZaLvtdtI&quot; frameborder=&quot;0&quot; allowfullscreen&gt;&lt;/iframe&gt;&lt;br /&gt;
&lt;br /&gt;
Not to forget the coursework that I did for Graphics in, of course, an iPad!!:&lt;br /&gt;
&lt;br /&gt;
&lt;iframe width=&quot;480&quot; height=&quot;320&quot; src=&quot;http://www.youtube.com/embed/hnDvsDQPboU&quot; frameborder=&quot;0&quot; allowfullscreen&gt;&lt;/iframe&gt;&lt;br /&gt;
&lt;br /&gt;
And also a physics simulation for the Tech subject:&lt;br /&gt;
&lt;br /&gt;
&lt;iframe width=&quot;480&quot; height=&quot;320&quot; src=&quot;http://www.youtube.com/embed/jLD2sqbhQ-8&quot; frameborder=&quot;0&quot; allowfullscreen&gt;&lt;/iframe&gt;&lt;br /&gt;
&lt;br /&gt;
Also you could visit the webpage we did for our team project in the semester two:&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEju6DS3uIMSZiwge1y0KVrp3P9mL7f7j83MDQsaqf8GVwkunC2ikoiRfc1LmfYOP0mL-OLC9UyczV8wm5nlu2B9_SLwDbetOW9Q_ZDu8uo8fZVQcBcPppxM49FwlJKom8dItxTTy09m-G33/s1600/menu_background_high.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;180&quot; width=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEju6DS3uIMSZiwge1y0KVrp3P9mL7f7j83MDQsaqf8GVwkunC2ikoiRfc1LmfYOP0mL-OLC9UyczV8wm5nlu2B9_SLwDbetOW9Q_ZDu8uo8fZVQcBcPppxM49FwlJKom8dItxTTy09m-G33/s320/menu_background_high.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;a href=&quot;http://homepages.cs.ncl.ac.uk/2011-12/csc8506-Team5/index.html&quot;&gt;http://homepages.cs.ncl.ac.uk/2011-12/csc8506-Team5/index.html&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
By the way, I am searching for projects to do in summer, sending CV&#39;s to many companies, if you&#39;d like to know more about my work, &lt;a href=&quot;mailto:rhvall@gmail.com&quot;&gt;email me&lt;/a&gt; and I&#39;ll try to get back as soon as possible.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://mittrasw.blogspot.com/feeds/7365800560607372883/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mittrasw.blogspot.com/2012/03/hello-everyone-i-know-ive-been-far-away.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5416507646115832994/posts/default/7365800560607372883'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5416507646115832994/posts/default/7365800560607372883'/><link rel='alternate' type='text/html' href='http://mittrasw.blogspot.com/2012/03/hello-everyone-i-know-ive-been-far-away.html' title='MSc in Computer Game Engineering @ NCL'/><author><name>Mittra Software</name><uri>http://www.blogger.com/profile/09954375852101781488</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNOlduh3N2owDQr9ycxnooumei02qLd3Qe1gjwUfRboNE_va3p3fjZfKxdJB1CXQHPIs03R-OGEuB1wgNR8unWjwqtx1t2vrULIZ2Ure1mJ2J9XaKzvfAeViXoRIy_6g/s113/LogoMittra2.png'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNLK624z9tUOev_KqzacX6U0LRJkLI78fvsmnf7k_RFOEX_dP1DzGiJRpIpZMl0HZzLqdPTPmwZl-Xe4baHc9g60lANaewPh77liitQXwGHRElVENeK5S0CxX4Cme7ysa-QYknoRmgfBO4/s72-c/DSC09368.JPG" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5416507646115832994.post-4007025060370802847</id><published>2011-09-09T19:05:00.000-05:00</published><updated>2011-09-09T19:05:47.305-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Cellphone"/><category scheme="http://www.blogger.com/atom/ns#" term="Development"/><category scheme="http://www.blogger.com/atom/ns#" term="Mobile"/><category scheme="http://www.blogger.com/atom/ns#" term="Tips"/><title type='text'>11 Tips for Mobile Software Development</title><content type='html'>&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYOZWk2m1Cve1K2e_Q4ZQrg4BGdnis6slkVIFz88NIn8pyrLa2zoIdXzmEVokN9iLXMH6sBYMa5_0lecLmzs3TC9ZMhNvzMEun_vyA1tTAP3k56fl0ZceqZkEROU_eBYnKS2GNmnP-5x7D/s1600/phones.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;284&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYOZWk2m1Cve1K2e_Q4ZQrg4BGdnis6slkVIFz88NIn8pyrLa2zoIdXzmEVokN9iLXMH6sBYMa5_0lecLmzs3TC9ZMhNvzMEun_vyA1tTAP3k56fl0ZceqZkEROU_eBYnKS2GNmnP-5x7D/s320/phones.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
More than 99 million smartphones shipped in just the first quarter of this year, says analyst firm IDC. Many of them are winding up in the hands of business users, including your employees and business partners. That trend means, sooner or later, you’ll have to develop smartphone apps. Here are 11 tips:&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;1. Track market shares.&lt;/b&gt;&lt;br /&gt;
It’s critical to keep up with trends in smartphone platforms, where the only constant is change. Sure, BlackBerry has long been synonymous with business, but it now lags both Android and Apple’s iOS in the race for market share, which affects what your company uses. In fact, Android is a case study in how quickly a platform’s fortunes can change: Between late 2009 and late 2010, Android’s market share grew 615 percent -- enough to leapfrog into first place, says analyst firm Canalys.&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggw2UeQfUzzbSJ7fruVWYrrn97QidWdtxq7b-lkTNtPUSmz6DQxN8ltjPGiMmioPRA1v7pFJ4XZue1N3Q_wiXdEL9PqLLakdCzlFol6aDDzAOTB7na3rg_9ja0gzjcpEwvU1BrHNHHG__5/s1600/Cell-Phone-Market-Share.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;172&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggw2UeQfUzzbSJ7fruVWYrrn97QidWdtxq7b-lkTNtPUSmz6DQxN8ltjPGiMmioPRA1v7pFJ4XZue1N3Q_wiXdEL9PqLLakdCzlFol6aDDzAOTB7na3rg_9ja0gzjcpEwvU1BrHNHHG__5/s320/Cell-Phone-Market-Share.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
MeeGo and Windows Mobile are two other platforms to monitor. And don’t overlook Symbian, especially if your company has a lot of employees based outside of North America.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;2. Learn the language.&lt;/b&gt;&lt;br /&gt;
Platform companies try to build market share by using programming languages and equipment that developers already know. For example, Windows Mobile lets developers reuse their existing Visual Studio and .NET development skills and server infrastructure to extend their applications to mobile devices. Meanwhile, iOS requires Objective-C development. Partnerships and outsourcing are two ways to develop for platforms that use unfamiliar languages.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNmQoAK1g5ExI1ohfCmBRoTfK6CEFAuJ62c0igSsnE3KiEM3pe7JQ2XjSd5A0fGUbLIYQZ0nArVZMPSu-u6gqJGoJW266Tvm6VhvQHOL3ZMnteWdPZae2hgxSOgmctfzazczbjFF24NQBQ/s1600/EvolutionOfComputerlanguages.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;227&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNmQoAK1g5ExI1ohfCmBRoTfK6CEFAuJ62c0igSsnE3KiEM3pe7JQ2XjSd5A0fGUbLIYQZ0nArVZMPSu-u6gqJGoJW266Tvm6VhvQHOL3ZMnteWdPZae2hgxSOgmctfzazczbjFF24NQBQ/s320/EvolutionOfComputerlanguages.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;b&gt;3. Develop for multiple platforms.&lt;/b&gt;&lt;br /&gt;
Cross-platforming requires time and resources, but it ensures that your app’s fate isn’t tied to a single platform. One obvious way is by creating a separate app for each platform. But some developers say it can be cheaper, easier and faster to use CSS to recode Web apps to fit small screens, and then use JavaScript to control the events. The downside is that you might lose access to some of the device’s features, such as an accelerometer.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhOHjtXvRIb-dV4s78AcIC043L6CI3MaVopIbT8cSlXtXxhvhBL-tn-RA3n75kHmzumty-HCYb_GoPbRhJIHLZteUBdOk_UnQU_IC__JchT_gwFpmQZo8rN3h9sS2RSod_VfYrg-oKGVe5K/s1600/cfricke2.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;247&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhOHjtXvRIb-dV4s78AcIC043L6CI3MaVopIbT8cSlXtXxhvhBL-tn-RA3n75kHmzumty-HCYb_GoPbRhJIHLZteUBdOk_UnQU_IC__JchT_gwFpmQZo8rN3h9sS2RSod_VfYrg-oKGVe5K/s320/cfricke2.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;b&gt;4. Look beyond smartphones.&lt;/b&gt;&lt;br /&gt;
Android and iOS now run on tablets too. The good news is that apps originally developed for smartphones can typically run on tablets without modification. But be aware that tablet users increasingly expect developers to create versions that take advantage of their devices’ larger screens and often faster processors. So identify tablet-specific features and leverage those when developing a tablet-only version of your app.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjw68KeKrXdPS6StJcEsimFYm_kN9j3XD3eawOil97-PqKbNvIVwJM7GwEgBxQcuni7QXQF7ljjBqLaCOKW7xxCGReFAWBNARH2KDsaOGns0Z1v6pdxhc6WEytv3cc2AK0_iI_AHvMX3HqB/s1600/tablets.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;200&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjw68KeKrXdPS6StJcEsimFYm_kN9j3XD3eawOil97-PqKbNvIVwJM7GwEgBxQcuni7QXQF7ljjBqLaCOKW7xxCGReFAWBNARH2KDsaOGns0Z1v6pdxhc6WEytv3cc2AK0_iI_AHvMX3HqB/s320/tablets.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;b&gt;5. Strive for consistency.&lt;/b&gt;&lt;br /&gt;
It can be challenging to develop an app so it has the same look and feel across all Android or BlackBerry devices, let alone across multiple platforms or across both smartphones and tablets. But it’s still a goal worth pursuing, because most enterprises have a mix of devices. For starters, create a database of all of your company’s approved devices and their features -- particularly screen size, resolution and aspect ratio -- and whether they have a physical or virtual keyboard. Then, design your app to ensure that every function provides at least a basic, user-friendly experience for each device’s user group.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsGL9JtLryezHXO35Jw4h_hRDbEJrmiY7YpVyp9aBKV753hSCW7AItp8PLCi6q6UToDw6pwthwbZUkK7r4z1asN_4AzK4jHUgZx3whO6oxP5zZ9YUPU-BrRmWjmY_uqWFva6gdRqilKOGE/s1600/Consistency.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;273&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsGL9JtLryezHXO35Jw4h_hRDbEJrmiY7YpVyp9aBKV753hSCW7AItp8PLCi6q6UToDw6pwthwbZUkK7r4z1asN_4AzK4jHUgZx3whO6oxP5zZ9YUPU-BrRmWjmY_uqWFva6gdRqilKOGE/s320/Consistency.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;b&gt;6. Identify integration needs.&lt;/b&gt;&lt;br /&gt;
If your app needs to tap into another system, such as your company’s CRM and other back-office systems, it’s never too early to figure out how your app will get that access. Just as important, ensure that it gets access in a way that doesn’t leave data in the open and doesn’t create back doors for hackers. Once you’ve got a beta app, test it to verify that the integration works.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg14WwX22VU4A3SOTEmUDI7KglLJQOLaryFgLsnLm4wTytajKfHKGf7Ul3qfxH1RWyAIb5k1_Q555Y3a9QktG0Fr1DAs8xWl3bGsXIUxtoLrUM5LMExX8bnmhztw3Iv3nJQ1Xskp-CoMKat/s1600/permissionbasedsms.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;211&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg14WwX22VU4A3SOTEmUDI7KglLJQOLaryFgLsnLm4wTytajKfHKGf7Ul3qfxH1RWyAIb5k1_Q555Y3a9QktG0Fr1DAs8xWl3bGsXIUxtoLrUM5LMExX8bnmhztw3Iv3nJQ1Xskp-CoMKat/s320/permissionbasedsms.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;b&gt;7. Don’t hog the CPU and memory.&lt;/b&gt;&lt;br /&gt;
Sure, many of today’s smartphones have 1 GHz or faster processors and are connected to networks with speeds north of 1 Mbps. But many don’t, so it’s important to develop apps that provide a good user experience even on midrange handsets and older, slower networks. Most of today’s mobile platforms now support some level of multitasking, meaning your app will likely compete with several others for processing, memory and battery power. But be aware that no two platforms support multitasking quite the same way. For example, check whether a platform allows your app to do everything you need it to when it’s running in the background.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhv2v5_5AKI1xY45i8qIW4A9YiDEkgBc8_N_olDk9cLmB9GGmOS2YKhDQuH8_l0PIWLxrRXswpmTCEyVQhS5TxcGRuUMxqC1eGokTXShNB_RZ0ZACfxD3zDJsLefphfrYUEHp1Ta_vpJVB8/s1600/hotcpusmiley_bijoy.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhv2v5_5AKI1xY45i8qIW4A9YiDEkgBc8_N_olDk9cLmB9GGmOS2YKhDQuH8_l0PIWLxrRXswpmTCEyVQhS5TxcGRuUMxqC1eGokTXShNB_RZ0ZACfxD3zDJsLefphfrYUEHp1Ta_vpJVB8/s1600/hotcpusmiley_bijoy.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;b&gt;8. Be aware of carrier restrictions.&lt;/b&gt;&lt;br /&gt;
Wireless carriers have the power to block apps, such as those that compete with their fee-based services, or use what they deem as excessive amounts of bandwidth. Learn about these concerns and respect them rather than trying to do an end run. Be aware that even low-bandwidth apps can clog up cellular networks -- and sap batteries -- by constantly generating unnecessary signaling traffic. For example, an overly chatty IM app almost single-handedly crashed T-Mobile’s network in 2009.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKFuM2NsHXvGJZahHS5At_Ar7gsdY_s4aQFujCI5K8FUYAiQYO_prlZDYxyqruW18d8DbvVzWYgIpgz_db8z7Y8koYK736T7S-9JII7I6tR5s4T67Rvk0h3PCNa-I6V5HF6h0OTl-A6pc8/s1600/restrictions.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;200&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKFuM2NsHXvGJZahHS5At_Ar7gsdY_s4aQFujCI5K8FUYAiQYO_prlZDYxyqruW18d8DbvVzWYgIpgz_db8z7Y8koYK736T7S-9JII7I6tR5s4T67Rvk0h3PCNa-I6V5HF6h0OTl-A6pc8/s200/restrictions.png&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;b&gt;9. Respect enterprise concerns.&lt;/b&gt;&lt;br /&gt;
Design apps so they use bandwidth sparingly, which helps users stay under their rate plan’s monthly usage cap and avoids the need for putting all mobile employees on a pricey unlimited-use plan. Bandwidth efficiency also helps extend battery life. Ideally, your app should not be the reason why a tablet or smartphone can’t go an entire workday before it needs charging.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMWYFlKU3XIbv0mLAdRH5O6hNeViSezG4Kiwo1WAK4N0PKdkCddvzQwl8UAZt1X6ouO5-OA-AthKgNxKP5RrM8yiFpjIMEaEa59tEPiiE6gtjZUB7kh4g-J0kwgbx8dvxlf8jXrtEZMNeo/s1600/falling-dominoes.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMWYFlKU3XIbv0mLAdRH5O6hNeViSezG4Kiwo1WAK4N0PKdkCddvzQwl8UAZt1X6ouO5-OA-AthKgNxKP5RrM8yiFpjIMEaEa59tEPiiE6gtjZUB7kh4g-J0kwgbx8dvxlf8jXrtEZMNeo/s1600/falling-dominoes.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;b&gt;10. Register with app stores and developer networks.&lt;/b&gt;&lt;br /&gt;
Registering with developer networks gets you access to their SDKs, while registering as a publisher ensures you get paid. Even if you’re outsourcing development, you can still register as the publisher so you can manage the sales revenue.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7RuuXA6zHX-SN6Hmxy3h3pZnDVTCC7CdQxOvs6Cm5G4ASG5pPTVf8HDqJVUAJHwgd8DT9d6Zx-fFqj-MkNE1kZA_NOdXvqj2g-B9_nMgRTp8Pl4_A7ndqx9ZKbL5C144b7bpuzvFq6alu/s1600/Aplicaciones-iPad.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;256&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7RuuXA6zHX-SN6Hmxy3h3pZnDVTCC7CdQxOvs6Cm5G4ASG5pPTVf8HDqJVUAJHwgd8DT9d6Zx-fFqj-MkNE1kZA_NOdXvqj2g-B9_nMgRTp8Pl4_A7ndqx9ZKbL5C144b7bpuzvFq6alu/s320/Aplicaciones-iPad.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;b&gt;11. Certify.&lt;/b&gt;&lt;br /&gt;
Some app stores require certification, a process that includes vetting at both the platform and network usage levels. Certification often takes longer than developers expect, so don’t build your business model around the assumption that your app will be ready for employees the day after it’s finished.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCGjxx_4guBRm2mxG66buKt42QwN8Q_86D_ThLH7v6bJ3rxw92Eu0tcrlXnuiURl9qmA7Iel1Oo0opxRFkmfAkJ8gpQd0A8eMmjmPF3_uiSn4TjwhOkrqg7XRpyW6dxtCJ1tMy6zJ1R0-5/s1600/6a0120a85dcdae970b0128776ff992970c.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCGjxx_4guBRm2mxG66buKt42QwN8Q_86D_ThLH7v6bJ3rxw92Eu0tcrlXnuiURl9qmA7Iel1Oo0opxRFkmfAkJ8gpQd0A8eMmjmPF3_uiSn4TjwhOkrqg7XRpyW6dxtCJ1tMy6zJ1R0-5/s1600/6a0120a85dcdae970b0128776ff992970c.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;a href=&quot;http://www.intelligenceinsoftware.com/feature/sw_dev_tools_and_tips/mobile_software_development/index.html#.Tl_T5HMlLqA&quot;&gt;By: Tim Kridel&lt;/a&gt;&lt;br /&gt;
</content><link rel='replies' type='application/atom+xml' href='http://mittrasw.blogspot.com/feeds/4007025060370802847/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mittrasw.blogspot.com/2011/09/11-tips-for-mobile-software-development.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5416507646115832994/posts/default/4007025060370802847'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5416507646115832994/posts/default/4007025060370802847'/><link rel='alternate' type='text/html' href='http://mittrasw.blogspot.com/2011/09/11-tips-for-mobile-software-development.html' title='11 Tips for Mobile Software Development'/><author><name>Mittra Software</name><uri>http://www.blogger.com/profile/09954375852101781488</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNOlduh3N2owDQr9ycxnooumei02qLd3Qe1gjwUfRboNE_va3p3fjZfKxdJB1CXQHPIs03R-OGEuB1wgNR8unWjwqtx1t2vrULIZ2Ure1mJ2J9XaKzvfAeViXoRIy_6g/s113/LogoMittra2.png'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYOZWk2m1Cve1K2e_Q4ZQrg4BGdnis6slkVIFz88NIn8pyrLa2zoIdXzmEVokN9iLXMH6sBYMa5_0lecLmzs3TC9ZMhNvzMEun_vyA1tTAP3k56fl0ZceqZkEROU_eBYnKS2GNmnP-5x7D/s72-c/phones.png" height="72" width="72"/><thr:total>1</thr:total><georss:featurename>Juventino Rosas 195, Peralvillo, Cuauhtémoc, Mexico City, Distrito Federal, Mexico</georss:featurename><georss:point>19.4604216399471 -99.139702320098877</georss:point><georss:box>19.4585501399471 -99.142169820098871 19.4622931399471 -99.137234820098882</georss:box></entry><entry><id>tag:blogger.com,1999:blog-5416507646115832994.post-2825832454436960683</id><published>2011-09-08T20:23:00.000-05:00</published><updated>2011-09-08T20:23:06.109-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="3D"/><category scheme="http://www.blogger.com/atom/ns#" term="Cellphone"/><category scheme="http://www.blogger.com/atom/ns#" term="Hardware"/><category scheme="http://www.blogger.com/atom/ns#" term="LG"/><title type='text'>LG Optimus 3D: Tri-dual</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtJJ4hmv0cIgT_abI8_eHkPMmPHK3SPdH1LDYXVgtQSKb3CiCWzRHHrbthEwUiI434_W33DTfxkveLG8iWZkR07dcwmnQV2HlLZZEnaA4sCbfVlIW-zEA0qO3PL65mEmLCMG2eM6omyJVF/s1600/optimus3d-6.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;229&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtJJ4hmv0cIgT_abI8_eHkPMmPHK3SPdH1LDYXVgtQSKb3CiCWzRHHrbthEwUiI434_W33DTfxkveLG8iWZkR07dcwmnQV2HlLZZEnaA4sCbfVlIW-zEA0qO3PL65mEmLCMG2eM6omyJVF/s320/optimus3d-6.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
LG Electronics (LG) today officially launched the long-awaited LG Optimus 3D, an innovative new smartphone featuring second generation dual core technology and an advanced &quot;Tri-Dual&quot; architecture. First unveiled at Mobile World Congress (MWC) in Barcelona in February, the LG Optimus 3D offers a full 3D experience -- recording, viewing, sharing -- in a smartphone form factor.
&lt;br /&gt;
&lt;br /&gt;
The LG Optimus 3D takes the smartphone experience into new territory with its Tri-Dual configuration -- dual-core, dual-channel and dual-memory -- which allows for improved performance when multi-tasking, enjoying a movie or playing graphicsintensive games. This LG smartphone is also a major step forward in the utilization of full 3D functionality in everyday life - users can record and immediately view content in 3D without the need for special glasses.&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&quot;Tri-Dual architecture opens up a whole new world in smartphone performance,&quot; said Dr. Jong-seok Park, President and CEO of LG Mobile Communications Company. &quot;As the latest offering in our Optimus line-up, we expect there will be significant interest from those who seek the very latest in smartphone technology and are excited about 3D as the next big frontier in mobile devices.&quot; As always, here are the Technical Specifications of this cellphone:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Quad-band GSM and 3G support&lt;/li&gt;
&lt;li&gt;21 Mbps HSDPA and 5.76 Mbps HSUPA
4.3″&lt;/li&gt;
&lt;li&gt;16M-color capacitive LCD stereoscopic touchscreen of WVGA resolution (480 x 800 pixels)&lt;/li&gt;
&lt;li&gt;Android OS v2.2 Froyo with LG 3D UI (Gingerbread upgrade coming around October)&lt;/li&gt;
&lt;li&gt;Dual-core 1GHz ARM Cortex-A9 proccessor, PowerVR SGX540 GPU, TI OMAP4430 chipset&lt;/li&gt;
&lt;li&gt;512 MB RAM&lt;/li&gt;
&lt;li&gt;8GB internal storage&lt;/li&gt;
&lt;li&gt;Dual 5 MP autofocus cameras, LED flash; stereoscopic 3 MP pictures, face detection and geotagging&lt;/li&gt;
&lt;li&gt;1080p@30fps video recording, stereoscopic 720p@30fps videos&lt;/li&gt;
&lt;li&gt;Wi-Fi b/g/n and DLNA
GPS with A-GPS&lt;/li&gt;
&lt;li&gt;MicroSD slot up to 32GB&lt;/li&gt;
&lt;li&gt;Accelerometer, proximity sensor and an auto-brightness sensor&lt;/li&gt;
&lt;li&gt;Front facing camera with video calls&lt;/li&gt;
&lt;li&gt;Standard 3.5 mm audio jack
microUSB port (charging) and stereo Bluetooth v3.0&lt;/li&gt;
&lt;li&gt;microHDMI port&lt;/li&gt;
&lt;li&gt;Smart dialing, voice dialing
DivX/XviD video support&lt;/li&gt;
&lt;li&gt;Office document editor&lt;/li&gt;
&lt;li&gt;Innovative gesture controls&lt;/li&gt;
&lt;li&gt;Adobe Flash 10.3 support&lt;/li&gt;
&lt;li&gt;Dolby Mobile and SRS sound enhancement&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;iframe width=&quot;480&quot; height=&quot;320&quot; src=&quot;http://www.youtube.com/embed/NnHykOcWKAg&quot; frameborder=&quot;0&quot; allowfullscreen&gt;&lt;/iframe&gt;
&lt;br /&gt;
More info:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://benchmarkreviews.com/index.php?option=com_content&amp;amp;task=view&amp;amp;id=15574&amp;amp;Itemid=47&quot;&gt;Benchmark Reviews&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://technology.emr8.com/lg-optimus-3d-a-look-into-the-tri-dual-technology/&quot;&gt;EMR8&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content><link rel='replies' type='application/atom+xml' href='http://mittrasw.blogspot.com/feeds/2825832454436960683/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mittrasw.blogspot.com/2011/09/lg-optimus-3d-tri-dual.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5416507646115832994/posts/default/2825832454436960683'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5416507646115832994/posts/default/2825832454436960683'/><link rel='alternate' type='text/html' href='http://mittrasw.blogspot.com/2011/09/lg-optimus-3d-tri-dual.html' title='LG Optimus 3D: Tri-dual'/><author><name>Mittra Software</name><uri>http://www.blogger.com/profile/09954375852101781488</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNOlduh3N2owDQr9ycxnooumei02qLd3Qe1gjwUfRboNE_va3p3fjZfKxdJB1CXQHPIs03R-OGEuB1wgNR8unWjwqtx1t2vrULIZ2Ure1mJ2J9XaKzvfAeViXoRIy_6g/s113/LogoMittra2.png'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtJJ4hmv0cIgT_abI8_eHkPMmPHK3SPdH1LDYXVgtQSKb3CiCWzRHHrbthEwUiI434_W33DTfxkveLG8iWZkR07dcwmnQV2HlLZZEnaA4sCbfVlIW-zEA0qO3PL65mEmLCMG2eM6omyJVF/s72-c/optimus3d-6.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5416507646115832994.post-4666152472382605464</id><published>2011-09-01T23:04:00.000-05:00</published><updated>2011-09-01T23:04:20.246-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Development"/><category scheme="http://www.blogger.com/atom/ns#" term="iPad"/><category scheme="http://www.blogger.com/atom/ns#" term="Kinnect"/><category scheme="http://www.blogger.com/atom/ns#" term="Reality"/><title type='text'>iPad + Kinnect = Augmented Reality</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLHcqIaiGq_leOOKwnb6eOQe8R_1B5_YH5FlSluM5VtUURqmAcYSicnRYFLKmXQQPj9VuiBBDG7R1J0Q9FW7l6LziJd1A_OWW0CDfPa5khJv1Rl-z_kQarKVK-E7NOEXjt4a9N3vYBffNu/s1600/augmented-reality-hud.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;240&quot; width=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLHcqIaiGq_leOOKwnb6eOQe8R_1B5_YH5FlSluM5VtUURqmAcYSicnRYFLKmXQQPj9VuiBBDG7R1J0Q9FW7l6LziJd1A_OWW0CDfPa5khJv1Rl-z_kQarKVK-E7NOEXjt4a9N3vYBffNu/s320/augmented-reality-hud.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
According to Apple this is the year of the iPhone 2, for many of us there is no doubt about it. However, the tablet is not the only technological character of our time, because it must share the stage with other products that are making a breakthrough regarding interactions with electronic devices. Augmented reality, the three dimensions and Kinect are other geek device working to be kings of the universe today. What if they all join in a single experiment?&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;iframe width=&quot;480&quot; height=&quot;320&quot; src=&quot;http://www.youtube.com/embed/R8tiHXDiqsw&quot; frameborder=&quot;0&quot; allowfullscreen&gt;&lt;/iframe&gt;&lt;br /&gt;
&lt;br /&gt;
As you can see, that&#39;s what the guys of &lt;a href=&quot;http://labs.laan.com/&quot;&gt;Laan Labs&lt;/a&gt; have done, a company that develops applications for the IOS (&lt;a href=&quot;http://itunes.apple.com/app/tap-dj-mix-scratch-your-music/id405088414?mt=8&quot;&gt;DJ Tap&lt;/a&gt; is one of his creations). They happened to record a three-dimensional video recognition system using Microsoft&#39;s Kinect and then used it to display the recorded video on the iPad using augmented reality. Cool huh??&lt;br /&gt;
&lt;br /&gt;
</content><link rel='replies' type='application/atom+xml' href='http://mittrasw.blogspot.com/feeds/4666152472382605464/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mittrasw.blogspot.com/2011/09/ipad-kinnect-augmented-reality.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5416507646115832994/posts/default/4666152472382605464'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5416507646115832994/posts/default/4666152472382605464'/><link rel='alternate' type='text/html' href='http://mittrasw.blogspot.com/2011/09/ipad-kinnect-augmented-reality.html' title='iPad + Kinnect = Augmented Reality'/><author><name>Mittra Software</name><uri>http://www.blogger.com/profile/09954375852101781488</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNOlduh3N2owDQr9ycxnooumei02qLd3Qe1gjwUfRboNE_va3p3fjZfKxdJB1CXQHPIs03R-OGEuB1wgNR8unWjwqtx1t2vrULIZ2Ure1mJ2J9XaKzvfAeViXoRIy_6g/s113/LogoMittra2.png'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLHcqIaiGq_leOOKwnb6eOQe8R_1B5_YH5FlSluM5VtUURqmAcYSicnRYFLKmXQQPj9VuiBBDG7R1J0Q9FW7l6LziJd1A_OWW0CDfPa5khJv1Rl-z_kQarKVK-E7NOEXjt4a9N3vYBffNu/s72-c/augmented-reality-hud.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5416507646115832994.post-9031024554753927492</id><published>2011-08-26T12:18:00.001-05:00</published><updated>2011-08-26T12:20:49.036-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Android"/><category scheme="http://www.blogger.com/atom/ns#" term="Infograph"/><category scheme="http://www.blogger.com/atom/ns#" term="iOS"/><title type='text'>Droid vs iOS</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxt6mLTV7gtlijB6ontDYf6HEWX6B1sx5z27uVKOPaWbUwePvpwuytgGEKm3JtLug1yuYtr4isipiKOezVW1s88S-kTwtcnuxZ14Yrwy3_pEiI5VsECHJ-pnT2M29iFOin_ZgIgveFSGUp/s1600/android-ios-battle-funny.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;200&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxt6mLTV7gtlijB6ontDYf6HEWX6B1sx5z27uVKOPaWbUwePvpwuytgGEKm3JtLug1yuYtr4isipiKOezVW1s88S-kTwtcnuxZ14Yrwy3_pEiI5VsECHJ-pnT2M29iFOin_ZgIgveFSGUp/s320/android-ios-battle-funny.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Technology history has always been full of constant friction between users of different platforms, programming languages​​, operating systems, etc. And mobile technology has no exception, and is currently users of iOS and Android keep a dispute &quot;according to each&quot; who owns the best and most popular mobile operating system at the time.&lt;br /&gt;
&lt;br /&gt;
We can see those discussions on forums, social networks, websites, always favor some comments about the other carrying the stereotypes of each and making a mockery of the weaknesses of each operating system. But really what does it say the operating system you use you? This is what we try to solve the following graphics by &lt;a href=&quot;http://blog.hunch.com/?p=51781&quot;&gt;Hunch&lt;/a&gt;.&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh3kl89qKnuBqiyz2HJGwQWahyqB9lN-_3g7IWuzEBlnzH9fEqDl_BEGdpgbOtBurzjj4W_SYyqpisLVucR101S3I2vVCaQbN5pvVQYnqQ69t-OhPti7Vov_WJcJArWGJLmRCplyNDh8XZ4/s1600/droid-vs-ios.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh3kl89qKnuBqiyz2HJGwQWahyqB9lN-_3g7IWuzEBlnzH9fEqDl_BEGdpgbOtBurzjj4W_SYyqpisLVucR101S3I2vVCaQbN5pvVQYnqQ69t-OhPti7Vov_WJcJArWGJLmRCplyNDh8XZ4/s1600/droid-vs-ios.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
</content><link rel='replies' type='application/atom+xml' href='http://mittrasw.blogspot.com/feeds/9031024554753927492/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mittrasw.blogspot.com/2011/08/droid-vs-ios.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5416507646115832994/posts/default/9031024554753927492'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5416507646115832994/posts/default/9031024554753927492'/><link rel='alternate' type='text/html' href='http://mittrasw.blogspot.com/2011/08/droid-vs-ios.html' title='Droid vs iOS'/><author><name>Mittra Software</name><uri>http://www.blogger.com/profile/09954375852101781488</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNOlduh3N2owDQr9ycxnooumei02qLd3Qe1gjwUfRboNE_va3p3fjZfKxdJB1CXQHPIs03R-OGEuB1wgNR8unWjwqtx1t2vrULIZ2Ure1mJ2J9XaKzvfAeViXoRIy_6g/s113/LogoMittra2.png'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxt6mLTV7gtlijB6ontDYf6HEWX6B1sx5z27uVKOPaWbUwePvpwuytgGEKm3JtLug1yuYtr4isipiKOezVW1s88S-kTwtcnuxZ14Yrwy3_pEiI5VsECHJ-pnT2M29iFOin_ZgIgveFSGUp/s72-c/android-ios-battle-funny.png" height="72" width="72"/><thr:total>0</thr:total></entry></feed>