Pedro Schneider

Um pouco sobre minha vida, trabalhos, estudos, diversões entre outros!

Descobrindo a codificação de uma string

Depois de muito dar socos na mesa e pesqusiar no meu amigo Google, chegou a hora do triste veredicto: caí em uma built-in function (funções que já vêm na linguagem). Nossa função se chama mb_detect_encoding() e, infelizmente, não irá funcionar a contento se não tiver um dedinho brasileiro ali.
A função só terá um resultado satisfatório se forem observados dos detalhes:

1. O segundo parâmetro da função (encoding list) deverá ser rigorosamente passado, contendo os dois encodes possíveis, a saber: UTF-8 e ISO-8859-1.
2. O último caractere da string não pode ser acentuado, para tanto utilizaremos um “método alternativo de eficácia momentânea” (vide Wikipédia: Gambiarra).

Mas e então, como fica? Vamos meter a mão na massa!

Vamos montar uma funçãozinha bacana e bem simples, chamada codificacao() que irá retornar o charset de uma dada string. Talvez você perceba algo bizarro neste snippet, mas eu explico logo abaixo:

function codificacao( $string ) {
return mb_detect_encoding( $string . 'x', 'UTF-8, ISO-8859-1' );
}

Agora você me pergunta: O que raios aquele “x” está fazendo ali?
A resposta é muito simples. Lembra que eu comentei que a string não pode terminar em caractere acentuado? (Hahahahahahahahahaha!)
Procura no manual do PHP que foi um um francês que sugeriu essa implementação (que mesmo após o PHP corrigir o bug, a função continuará funcionando do mesmo jeito) e eu gostei. :)

posted by correaschneider in Desenv,Dicas,PHP and have No Comments

TagCloud para site!

Olá!

Hoje vou mostrar e disponibilizar aqui, uma library de TagCloud para CodeIgniter!

Como senti dificuldade para achar tag cloud para site, usando flash, comecei a desenvolver uma classe, como utilizo CodeIgniter, fiz uma para CodeIgniter. Podendo ser modificada para outras plataformas!

Bom vamos ao código!

Coloco os arquivos nos seus devidos lugares!

No Controller eu faço load da library, e como vou utilizar em todos os métodos, faço o load no construtor da classe Controller!

<?php
	class TagCloud extends CI_Controller {
		public function __construct() {
			parent::__construct();
 
			$this->load->library( 'TagCloud' );
		}

Após, crio os métodos para criar e configurar a TagCloud. O Exemplo aqui é uma das maneiras de montar o TagCloud!

		public function metodo3() {
			$tags = array(
					array( 'TagID' => '1', 'Tag' => 'Google', 'Url' => 'http://www.google.com.br/', 'Count' => '15' )
					, array( 'TagID' => '2', 'Tag' => 'Terra', 'Url' => 'http://www.terra.com.br/', 'Count' => '5' )
					, array( 'TagID' => '3', 'Tag' => 'UOL', 'Url' => 'http://www.uol.com.br/', 'Count' => '1' )
				);
 
			$this->tagcloud->setCampo( 'TagID' );
			$this->tagcloud->setLabel( 'Tag' );
			$this->tagcloud->setUrl( 'Url' );
 
			$this->tagcloud->setTags( $tags );
 
			$this->tagcloud->setUrlSite( 'http://www.phcs.com.br/' );
			$this->tagcloud->setUrlSite( site_url() );
			$this->tagcloud->setWidth( 270 );
			$this->tagcloud->setHeight( 270 );
			echo $this->tagcloud->mostrar();
		}

Os dados podem ser trazidos de banco, como mostra do Exemplo seguinte!

		public function metodo1() {
			echo $this->tagcloud->carregar( 'site_tag', 'TagID', 'Tag', 'Url', 'site_conteudo_site_tag' )->setUrlSite( 'http://www.phcs.com.br/' )->setPreUrl( 'http://www.phcs.com.br/tag/' )->setWidth( 270 )->setHeight( 270 )->mostrar();
		}

No zip, contém outras duas formas de configurar o TagClod!

Espero que tenha sido util!

Para fazer o download da classe, clique aqui!

posted by correaschneider in Desenv,Dicas,Javascript,MySQL,PHP and have No Comments

[SOLVED] “Could not reliably determine the server’s fully qualified domain name, using … for ServerName”

Provavelmente você já enfrentou o seguinte erro enquanto você reiniciar o servidor Apache no Ubuntu.

$ sudo /etc/init.d/apache2 restart
* Restarting web server apache2
apache2: Could not reliably determine the server’s fully qualified domain name, using 127.0.1.1 for ServerName
… waiting apache2: Could not reliably determine the server’s fully qualified domain name, using 127.0.1.1 for ServerName

Para corrigir esse problema, você precisa editar o arquivo httpd.conf. Abra o terminal e digite,

$ sudo gedit /etc/apache2/httpd.conf

O httpd.conf pro padrão ficará em branco. Agora, basta adicionar a seguinte linha ao arquivo.

ServerName localhost

Salve o arquivo e saia do gedit.

E por fim reiniciar o servidor.

$ sudo /etc/init.d/apache2 restart
posted by correaschneider in Desenv,Dicas,Linux,PHP and have No Comments

Outro da serie: “Queria que fosse filme!”

posted by correaschneider in Dicas,História,Video and have No Comments

Ovo Curtido!

Tags: ,
posted by correaschneider in Dicas,Sem Categoria,Uncategorized and have No Comments

Android – Manifest (Faltou no post anterior)

Peço desculpas por ter esquicido de colocar o Manifest no post anterior ( Android – Login com HttpClient, HttpPost, JSONObject! ).

Por isso estou colocando agora!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="finanz.kontrolle"
      android:versionCode="1"
      android:versionName="1.0">
    <uses-sdk android:minSdkVersion="8" />
    <uses-permission android:name="android.permission.INTERNET"></uses-permission>
 
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".FinanzKontrolleDroidActivity"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
 
	<activity android:label="Menu" android:name="MenuActivity"></activity>
 
    </application>
</manifest>
posted by correaschneider in Android,Desenv,Dicas and have No Comments

Android – Login com HttpClient, HttpPost, JSONObject!

Olá nesse meu primeiro post sobre Android, vou falar sobre a tela de login do meu App financeiro!

Bom vamos começar pelas Strings!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    <?xml version="1.0" encoding="utf-8"?>
        <resources>
            <string name="hello">FinanzKontrolleDroid!</string>
            <string name="app_name">Finanz Kontrolle</string>
            <string name="txtNome">Nome</string>
            <string name="txtSenha">Senha</string>
            <string name="txtLogin">Login</string>
            <string name="btnLogar">Logar</string>
            <string name="msgSucessoLogin">Usuário logado! </string>
            <string name="msgPreenchaLogin">Preencha o Login</string>
            <string name="msgPreenchaSenha">Preencha a Senha</string>
            <string name="msgErroLogin">Erro ao logar!</string>
            <string name="msgErroConectar">Erro ao conectar ao servidor!</string>
            <string name="msgEmailSenhaInvalido">E-mail ou Senha inválido!</string>
            <string name="urlSite">http://10.1.1.2/Finanzkontrolle/Site/</string>
            <string name="urlLogin">android/login</string>
        </resources>

Criei essa tela, simples mas eficiente!

O xml é esse:

1
2
3
4
5
6
7
8
<?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:weightSum="1">
        <EditText android:layout_height="wrap_content" android:layout_width="match_parent" android:inputType="textEmailAddress" android:id="@+id/txtLogin" android:hint="E-mail" android:text="@string/tempLogin">
            <requestFocus/>
        </EditText>
        <EditText android:layout_height="wrap_content" android:layout_width="match_parent" android:inputType="textPassword" android:id="@+id/txtSenha" android:hint="Senha"></EditText>
        <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/btnLogar" android:id="@+id/btnLogin"></Button>
    </LinearLayout>

Esse é o Activity inicial deixei o código comentado

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
package finanz.kontrolle;
 
import finanz.kontrolle.Parametros;
 
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
 
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONException;
import org.json.JSONObject;
 
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
 
public class FinanzKontrolleDroidActivity extends Activity implements OnClickListener {
	private boolean logado = false;
 
	public void onCreate( Bundle savedInstanceState ) {
		super.onCreate( savedInstanceState );
		setContentView( R.layout.main );
 
		Button btnLogin = ( Button ) findViewById( R.id.btnLogin );
		btnLogin.setOnClickListener( this );
	}
 
	//Quando houver click na tela
	public void onClick( View arg0 ) {
		switch ( arg0.getId()  ) {
			// Verifica se é o botão de login
			case R.id.btnLogin:
					EditText txtLogin = ( EditText ) findViewById( R.id.txtLogin );
					EditText txtSenha = ( EditText ) findViewById( R.id.txtSenha );
 
					int mensagem = R.string.msgSucessoLogin;
 
					//Valida se os campos foram preenchidos
					if ( txtLogin.getText().length() <= 0 )
						 mensagem =  R.string.msgPreenchaLogin;
					else if ( txtSenha.getText().length() <= 0 )
						 mensagem =  R.string.msgPreenchaSenha;
					else //Em caso de sucesso, chama método logar
						mensagem = this.logar( txtLogin.getText().toString(), txtSenha.getText().toString() );
 
					//Mostra mensagem para usuário
					Toast t = Toast.makeText( this, mensagem, Toast.LENGTH_SHORT );
					t.setGravity( Gravity.CENTER, 0, 0 );
					t.show();
 
					if ( this.logado ) {
						//Se logado troca a tela
						Intent i = new Intent( FinanzKontrolleDroidActivity.this, MenuActivity.class );
						startActivity( i );
					}
				break;
		}
	}
 
	//Método para enviar o login para o PHP
	protected int logar( String mLogin, String mPassword ) {
		int mensagem = 0;
 
		String strUrl = getResources().getString( R.string.urlSite ) + getResources().getString( R.string.urlLogin );
 
		HttpClient httpclient = new DefaultHttpClient();
		HttpPost httppost = new HttpPost( strUrl  );
 
	    try {
	        List nameValuePairs = new ArrayList(2);
	        nameValuePairs.add(new BasicNameValuePair("Login", mLogin));
	        nameValuePairs.add(new BasicNameValuePair("Senha", mPassword));
	        httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
 
	        HttpResponse response = httpclient.execute(httppost);
 
	        StringBuilder retorno = this.inputStreamToString( response.getEntity().getContent() );
 
	        try {
				JSONObject jo = new JSONObject( retorno.toString() );
 
				 this.logado = false;
				if ( jo.getBoolean( "logged_in" ) ) {
					mensagem = R.string.msgSucessoLogin;
					this.logado = true;
 
					//Armazena o Nome e qual Banco do usuário
					Parametros par = Parametros.getInstance();
					par.setNome( jo.getString( "email" ) );
					par.setDatabase( jo.getInt( "banco" ) );
 
				} else if ( !jo.getBoolean( "logged_in" ) )
					mensagem = R.string.msgEmailSenhaInvalido ;
				else
					mensagem = R.string.msgErroConectar ;
			} catch (JSONException e) {
				mensagem = R.string.msgErroConectar;
			}
 
	    } catch (ClientProtocolException e) {
	    	mensagem = R.string.msgErroConectar;
	    } catch (IOException e) {
	    	mensagem = R.string.msgErroConectar;
	    }
 
	    return mensagem;
	}
 
	//Método que transforma InputStream para String
	private StringBuilder inputStreamToString(InputStream is) throws IOException {
	    String line = "";
	    StringBuilder total = new StringBuilder();
 
	    BufferedReader rd = new BufferedReader(new InputStreamReader(is));
 
	    while ((line = rd.readLine()) != null)
	        total.append(line);
 
	    return total;
	}
}
posted by correaschneider in Android,Desenv,Dicas and have Comments (5)

Group_Concat do SQLServer

Anteriormente foi falado em Relacionando Tabelas N:N na query de consulta. Só que só funciona em MySQL. Dai tu me pergunta:

– Como faz em SQLServer?

Te respondo assim:

DECLARE @x VARCHAR(8000)
SELECT @x = COALESCE(@x + ', ','') + ISNULL(CONVERT(VARCHAR,CampoTabela),'') FROM Tabela WHERE ChavePrimaria IN (1,2,3,4)
SELECT @x
posted by correaschneider in Desenv,Dicas,SQL and have No Comments

Dicas de CSS para IEs

Como pode haver tanta diferença entre CSS de IE para IE.

Tendo constantemente esse problema corri atrás de mais informações e veja o que encontrei!

http://goo.gl/oyyGA

Sabendo do problema os caras fizeram isso para ver se ajuda!

posted by correaschneider in Desenv,HTML + CSS and have No Comments

Conheça a diferença entre hacker e cracker!

Apesar de estarmos acostumados a ouvir casos de invasão de computadores praticados por hackers, a maioria destes ataques são, na realidade, realizadas pelos crackers. Atualmente a mídia impressa, eletrônica e audiovisual está utilizando o termo correto porque “hacker” transformou-se em uma profissão.

Os crackers são indivíduos que utilizam seu conhecimento para invadir computadores e roubar informações confidenciais. Geralmente essas informações são vendidas ou utilizadas para aplicar golpes na Internet.

Já o hacker é um indivíduo que utiliza seu conhecimento para testar os recursos de segurança instalados na empresa. Imagine a seguinte situação: você instalou um novo gerador de energia na sua empresa ou residência. É necessário testar este novo recurso contra a falta de energia elétrica. Você testa o novo gerador desligando a energia da sua empresa ou residência para verificar se o gerador é ativado e a energia é restabelecida. No mundo virtual o trabalho de um hacker é similar ao teste do gerador. Após a instalação de um controle de segurança, o hacker tenta realizar uma invasão ao sistema protegido para verificar se o controle de segurança foi instalado e configurado de forma correta. O hacker nunca invade um sistema com o intuito de causar danos.

O hacker é uma pessoa que tem um perfil autodidata. A maior parte das pessoas acredita que o hacker tem uma formação técnica. Ou seja, trata-se de uma pessoa que participou de cursos de graduação na área de tecnologia da informação ou formou-se em algum curso técnico relacionado a alguma tecnologia. Isso não é verdade! Por exemplo, o iPhone (smartphone desenvolvido pela Apple) foi lançado em 2007. Na época do seu lançamento a tecnologia foi considerada inovadora. A principio, só era possível utilizar a função de aparelho celular do iPhone em conjunto com a operadora AT&T nos Estados Unidos. O aparelho estava bloqueado para funcionar em outros países, incluindo o Brasil. Pouco tempo após o lançamento, o iPhone foi desbloqueado por brasileiros. Os responsáveis pelo desbloqueio não aprenderam na faculdade ou em cursos técnicos como desbloquear o iPhone. Isso ocorre porque os cursos não conseguem acompanhar o avanço da tecnologia.

O mercado reconhece o profissional rotulado como Hacker Ético pelo número de palestras que ministra, pelo número de artigos que publica, pelo número de cursos que ministra e pelo número de certificações obtidas. No meu ponto de vista as certificações são “títulos” exigidos pela sociedade. Na prática, o que diferencia o profissional é a sua capacidade de resolver problemas e interagir com a comunidade.

Existem equipes de Hackers Éticos nas instituições financeiras para testar a segurança dos recursos implementados no ambiente computacional do banco e na tecnologia de internet banking. Essas equipes são formadas por 3 ou mais profissionais. Todos os testes são gerenciados pelos profissionais responsáveis pelo sistema “alvo”. Ou seja, estamos falando de uma atividade interdepartamental. Isso ocorre porque um dos objetivos dos testes é verificar se o recurso disponibilizado pelo banco atende as leis, normas e boas práticas do mercado financeiro. Participam dos testes profissionais do departamento jurídico, recursos humanos, relações institucionais, marketing, tecnologia da informação, qualidade, etc.

Conclusão

O Hacker Ético irá avaliar a conformidade com a política de segurança, identificando ameaças e vulnerabilidades desconhecidas para a organização. O objetivo é minimizar o risco de crackers acessarem as informações confidencias da sua empresa.

Retirado de : http://under-linux.org

posted by correaschneider in Dicas,Diversos,Linux and have Comment (1)