domingo, 5 de dezembro de 2010

Atualizando Samsung Galaxy S I9000B para Android Froyo

Para atualizar seu  Samsung Galaxy S I9000B para Android Froyo voce precisará:
  1. Verifique, desconectado do computador, se vc consegue ligar o celular com a sequencia VOLDOWN+HOME+POWER, deve aparecer uma tela de download em amarelo, se ok, continue, se não, google...
  2. Execute o Odin como Administrator
  3. Selecione PIT e o arquivo "s1_odin_20100512.pit"
  4. Selecione PDA e o arquivo "JPA_JP3_JPA"
  5. NÃO DEIXE SELECIONADO REPARTITION
  6. Conecte AGORA o celular que deve estar na tela de download em amarelo
  7. Selecione START
  8. SUCESSO? Espero que sim. Se não tiver tido, como eu, continue...
  9. Desligue o aparelho, ligue com a sequencia VOLUP+HOME+POWER
  10. Selecione Reset Data * VAI APAGAR TODOS OS DADOS DO CELULAR
  11. SUCESSO? Espero que sim. Se não tiver tido, google...
E se voce tiver feito a besteira, que eu fiz, de ter deixa o REPARTITION SELECIONADO, faça:
  1. Ligue o celular com a sequencia VOLDOWN+HOME+POWER, deve aparecer uma tela de download em amarelo
  2. Execute o Odin como Administrator
  3. Selecione PIT e o arquivo "s1_odin_20100512.pit"
  4. Selecione PDA e o arquivo "ADD" (Arquivo do link da ROM antiga)
  5. DEIXE SELECIONADO REPARTITION
  6. Conecte AGORA o celular que deve estar na tela de download em amarelo
  7. Selecione START
  8. O celular deve ligar, na versão ECLAIR
  9. Execute o procedimento para atualizar para FROYO * NAO ESQUEÇA DE NÃO DEIXAR SELECIONADO O REPARTITION *
Boa sorte!

* atualizando 06/12/2010: Meu celular é VIVO e a ROM seria original VIVO a ser lançada.
--
Bruno Kunioshi

sexta-feira, 19 de novembro de 2010

Deletando sub-diretorios vazios

Executar no diretório raiz:

for /f "delims=" %%d in ('dir /s /b /ad ^| sort /r') do rd "%%d"

quinta-feira, 18 de novembro de 2010

OpenXML

Tenho o seguinte XML no campo xmlFuncionalidades:


codigo0
grupo0 | subgrupo0
nome0
url0


codigo1
grupo0 | subgrupo1
nome1
url1






Utilizando OpenXML, foi possivel ler o XML e fazer um SELECT direto no SQL:

DECLARE @idoc int
DECLARE @doc varchar(8000)
SELECT @doc=xmlFuncionalidades FROM UserSettings WHERE usersettingsid=191

EXEC sp_xml_preparedocument @idoc OUTPUT, @doc

SELECT *
FROM OPENXML (@idoc, 'ArrayOfFuncionalidade/Funcionalidade',2)
WITH (grupo VARCHAR(1000),codigo VARCHAR(1000),nomeExibicao VARCHAR(1000),url VARCHAR(1000))

EXEC sp_xml_removedocument @idoc

quinta-feira, 11 de novembro de 2010

Usando HttpWebRequest, lidando com Autenticações (NTLM e Forms) e Cookies



Num determinado projeto precisei fazer requisições diretamente via código, e me deparei com alguns problemas: Autenticações (NTLM e Forms) e Cookies.
Consegui resolver a autenticação NTLM forçando o tipo de Credential, e em autenticação Forms, fiz um post com os dados de login. Além, fiz a manipulação do cookie para não ter que fazer a autenticação toda hora. Segue pedaço do código:

   85         private HttpWebResponse WebRequestHandler(string url)
   86         {
   87             HttpWebRequest objRequest = (HttpWebRequest)WebRequest.Create(url);
   88 
   89             if (ADAuthentication)
   90             {
   91                 CredentialCache cc = new CredentialCache();
   92                 cc.Add(new Uri(url), "NTLM", CredentialCache.DefaultNetworkCredentials);
   93                 objRequest.Credentials = cc;
   94                 objRequest.Method = "GET";
   95             }
   96             else
   97             {
   98                 if (firstRun)
   99                 {
  100                     //Efetua Login na primeira tentativa de conexão com o site
  101                     string _postString = "";
  102                     byte[] _postData;
  103 
  104                     Dictionary<string, string> _postParams = new Dictionary<string, string>();
  105                     _postParams.Add("Login1$LoginButton", "Entrar");
  106                     _postParams.Add("Login1$Password", "");
  107                     _postParams.Add("Login1$UserName", "system");
  108                     _postParams.Add("Login1$drpCulture", "");
  109                     _postParams.Add("__EVENTTARGET", "Login1$LoginButton");
  110 
  111                     foreach (KeyValuePair<string, string> pair in _postParams)
  112                     {
  113                         _postString += "&" + pair.Key + "=" + pair.Value;
  114                     }
  115 
  116                     _postData = new System.Text.ASCIIEncoding().GetBytes(_postString.Substring(1));
  117 
  118                     objRequest.ContentType = "application/x-www-form-urlencoded";
  119                     objRequest.ContentLength = _postData.Length;
  120                     objRequest.Referer = "http://" + domain + "/cmspages/logon.aspx";
  121                     objRequest.Method = "POST";
  122 
  123                     System.IO.Stream _outStream = objRequest.GetRequestStream();
  124                     _outStream.Write(_postData, 0, _postData.Length);
  125 
  126                     _outStream.Close();
  127 
  128                 }
  129                 else
  130                 {
  131                     objRequest.Method = "GET";
  132                 }
  133             }
  134 
  135             objRequest.AllowAutoRedirect = false;
  136             objRequest.KeepAlive = true;
  137             objRequest.Timeout = 60000; // 60 segundos.
  138             objRequest.CookieContainer = cookieContainer;
  139 
  140             HttpWebResponse objResponse = (HttpWebResponse)objRequest.GetResponse();
  141 
  142             if (firstRun)
  143             {
  144                 //seta variavel para cookie ser reutilizado.
  145                 cookieContainer.Add(objResponse.Cookies);
  146                 firstRun = false;
  147             }
  148 
  149             return objResponse;
  150         }






--
Bruno Kunioshi

terça-feira, 2 de novembro de 2010

Controles Dinâmicos com Event Handler e AJAX

Para controles criados dinâmicamente, além de codificar o EventHandler necessário, devesse adicionar o controle no UpdatePanel para que funcione o AJAX:

mUpdatePanel.ContentTemplateContainer.Controls.Add(controle);


Utilizei classe anônima para codificar o delegate dinâmicamente em runtime para cada controle:


DropDownList controle = (DropDownList)FindControl(propriedadeControle[0].ToString());
controle.SelectedIndexChanged += delegate(System.Object o, System.EventArgs e)
    {
      DropDownList controleDependente = (DropDownList)FindControl(propriedadeControle[1].ToString());
      controleDependente.Items.Add("asdfasdfasdf");
    };


Array de Objetos para Dataset

Estava trabalhando com um webservice e me deparei com um Array de Objetos, pesquisando, encontrei esta solução de Nilang Sah, ele serializou o Array, e depois carregou dentro de um DataSet. Utíl!

Abordagem diferente para if/cases

Ao inves do usual if/cases, normalmente usados, como:

public class SomeController
{
 public ActionResult TheAction(string whichButton, UserData userData)
 {
  if(whichButton == "Back")
  {
   // do the back action
  }
  else if(whichButton == "Next")
  {
   // do the next action
  }
  else if(whichButton == "Save")
  {
   // do the save action
  }
 
  throw Exception("");
 }
}

Encontrei este artigo de Mark Needham, que utiliza um Dictionary e uso de Generics:

public class SomeController
{
 private Dictionary<string, Func<UserData,ActionResult>> handleAction = 
  new Dictionary<string, Func<UserData,ActionResult>>
{ { "Back", SaveAction },
    { "Next", NextAction },
    { "Save", SaveAction } };
 
 public ActionResult TheAction(string whichButton, UserData userData)
 {
  if(handleAction.ContainsKey(whichButton))
  {
   return handleAction[whichButton](userData);
  }
 
  throw Exception("");
 }
 
 private ActionResult NextAction(UserData userData)
 {
  // do cool stuff
 }
}