quinta-feira, 3 de dezembro de 2015

Lista de imagens em Ionic

Faaala galera,

Tô trabalhando em projeto com Ionic para desenvolver uma app mobile híbrida e precisei exibir uma lista de imagens colocando 4 imagens por linhas...

Segue abaixo o código:

    <div ng-repeat="myObject in myList">
        <div class="row" ng-if="$index % 4 === 0">
            <div class="col col-25" ng-repeat="obj in [myList[$index], myList[$index + 1], myList[$index + 2], myList[$index + 3]]">
                 <img ng-src="{{obj.imgSrc}}" style="width: 100%;" />
            </div>
        </div>
    </div>

Para fazer isso me baseei nesse exemplo:

   <div ng-repeat="number in numbers"> 
        <div class="row" ng-if="$even">
            <div class="col col-50" ng-repeat="num in [numbers[$index],numbers[$index + 1]]">
                {{num}}
            </div>
        </div>
    </div>

Fonte: http://stackoverflow.com/questions/26688086/create-row-every-after-2-item-in-angular-ng-repeat-ionic-grid

Abraço!
Adriano Schmidt

quarta-feira, 4 de novembro de 2015

Instalar postgresql no ubuntu

Para instalar o postgresql no ubuntu vamos instalar também o pgadmin (cliente e gerenciador do postgres).

O pgadmin vamos instalar via interface gráfica:
- Procure por ubuntu software center na pesquisa do ubuntu
- Procure por pgadmin e o instale

Agora vá em um terminal e digite o comando abaixo para instalar o postgres
sudo apt-get install postgresql

Depois digite o comando abaixo para acessar o postgres que foi instalado utilizando o usuario default
sudo -u postgres psql

Depois altere a senha do usuário default:
ALTER USER postgres PASSWORD 'postgres';

Aperte Ctrl+D para sair do terminal psql

Agora volte no pgadmin, adicione uma nova conexão com localhost 5432 user postgres senha postgres

Pronto :D

Abraço!
Adriano Schmidt

Error: pg_config executable not found

Peguei um projeto com backend em phyton... e quando rodei o comando "pip install" deu o erro:

Collecting psycopg2 (from django-toolbelt==0.0.1->-r requirements.txt (line 7))
  Downloading psycopg2-2.6.1.tar.gz (371kB)
    100% |################################| 372kB 652kB/s
    Complete output from command python setup.py egg_info:
    running egg_info
    creating pip-egg-info\psycopg2.egg-info
    writing pip-egg-info\psycopg2.egg-info\PKG-INFO
    writing top-level names to pip-egg-info\psycopg2.egg-info\top_level.txt
    writing dependency_links to pip-egg-info\psycopg2.egg-info\dependency_links.txt
    writing manifest file 'pip-egg-info\psycopg2.egg-info\SOURCES.txt'
    warning: manifest_maker: standard file '-c' not found

    Error: pg_config executable not found.

    Please add the directory containing pg_config to the PATH
    or specify the full executable path with the option:

        python setup.py build_ext --pg-config /path/to/pg_config build ...

    or with the pg_config option in 'setup.cfg'.

    ----------------------------------------
Command "python setup.py egg_info" failed with error code 1 in C:\Users\Adriano\AppData\Local\Temp\pip-build-ihjedt2y\psycopg2

Eu já tinha o PostgreSQL instalado, caso você não tenha, instale-o.
Depois adicione no PATH (variável de ambiente) a pasta bin que fica dentro da pasta de instalação do PostgreSQL

Pronto, rode de novo o comando e funcionará :)

quarta-feira, 21 de outubro de 2015

Como pegar a localização atual no Android?

Hoje precisei fazer uma app que usava a localização atual, é muito simples!

O projeto inteiro está aqui: https://github.com/adrianoschmidt/android-location-sample

Mas o segredo está nesta classe: MainActivity.java

Basicamente você tem q seguir esses 6 passos:

1) Sua Activity deve implementar as classes GoogleApiClient.ConnectionCallbacks e GoogleApiClient.OnConnectionFailedListener

    public class MainActivity extends Activity implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener {

2) Criar um atributo do tipo GoogleApiClient

    private GoogleApiClient googleApiClient;

3) No onCreate ou na chamada de um botão você deve verificar se está tudo certo com a API que pega a localização e se estiver construir a API e se conectar nela.

        if (this.checkIfGooglePlayServicesAreAvailable()) {
            this.buildGoogleApiClient();
            this.mGoogleApiClient.connect();
        }

Verificando:

    private boolean checkIfGooglePlayServicesAreAvailable() {
        int errorCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this);
        if (errorCode != ConnectionResult.SUCCESS) {
            System.out.println("GooglePlayServices errorCode: " + errorCode);
            GooglePlayServicesUtil.getErrorDialog(errorCode, this, 0).show();
            return false;
        }
        return true;
    }


4) Implementar o método onConnected e pegar a localicação (aqui no exemplo seto em dois TextViews que tenho na minha tela)

    @Override
    public void onConnected(Bundle bundle) {
        TextView textViewLatitude = (TextView) findViewById(R.id.textViewLatitude);
        TextView textViewLongitude = (TextView) findViewById(R.id.textViewLongitude);

        Location mLastLocation = LocationServices.FusedLocationApi.getLastLocation(googleApiClient);
        if (mLastLocation != null) {
            textViewLatitude.setText("Lat: " + String.valueOf(mLastLocation.getLatitude()));
            textViewLongitude.setText("Lng: " + String.valueOf(mLastLocation.getLongitude()));
        }
    }

5) Implementar os métodos de suspensão e de falha:

    @Override
    public void onConnectionSuspended(int i) {
    }

    @Override
    public void onConnectionFailed(ConnectionResult connectionResult) {
    }

6) Solicitar a permissão no manifest

    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>

Basicamente é isso, qualquer coisa baixe o projeto no github ou comenta aqui no post.

Abraço!
Adriano Schmidt

quinta-feira, 15 de outubro de 2015

count com distinct

Opa..

Se eu faço uma query com distinct:

SELECT distinct o FROM tabela1 o JOIN tabela2

Quando eu faço count dela não vai bater:

SELECT distinct count (o) FROM tabela1 o JOIN tabela2

Pra resolver posso fazer assim:

SELECT count (distinct o) FROM tabela1 o JOIN tabela2

Obrigado ao meu chará Adriano de Souza pela dica!

Abraço!
Adriano Schmidt

Atalhos IntelliJ

Opa :)

Eu uso o Eclipse desde sempre... então quando fui usar o IntelliJ IDEA para desenvolver para Android (Android Studio) eu me perdia nos atalhos... então fiz essa tabelinha com os principais atalhos para não me perder :D

O quê 
Eclipse 
IntelliJ 
Deleta a linha 
Ctrl+D 
Ctrl+Y 
Procura por arquivo 
Ctrl+shift+R 
Ctrl+shift+N 
Troca linha de lugar 
Shift+Up/Down 
Alt+shift+Up/Down 
Duplica a linha 
Ctrl+shift+Down 
Ctrl+D 
Navegar entre abas 
Ctrl+PgUp/PgDn 
Alt+Left/Right 
Organizeimports 
Ctrl+Shift+O 
Ctrl+alt+O 
Format 
Ctrl+sfhit+F 
Ctrl+alt+L 

Tem algum atalho que você acha que devia estar nessa lista? Comenta aí :)

Abraço!!
Adriano Schmidt

segunda-feira, 12 de outubro de 2015

Executar comandos linux no Android

Fala galera, precisei executar comandos linux pela minha app Android, para isso usei o código abaixo.

Troque o "date" que é o comando para pegar a data da máquina pelo comando que você quer executar.

No final deste exemplo, peguei o valor retornado e o mostrei em um TextView.

        try {
            String commandLine = "date";
            Process process = Runtime.getRuntime().exec(commandLine);
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
            String value = bufferedReader.readLine();

            TextView dateTextView = (TextView) findViewById(R.id.text_info_line_6);
            dateTextView.setText(value);
        } catch (IOException e) {
            e.printStackTrace();
        }

No GitHub: https://gist.github.com/adrianoschmidt/8c83f972c20358a098a4

Caso você não queira fazer isso programaticamente pode usar o ADB Shell https://developer.android.com/tools/help/shell.html
É bem simples, basta acessar o terminal e ir até a pasta plataform-tools dentro da pasta do SDK do Android "cd <sdk_folder>\platform-tools"
Digite "adb devices" e tendo um dispositivo na lista basta digitar "adb shell" e você já pode digitar os comandos linux.

Vaaleu!
Adriano Schmidt

domingo, 11 de outubro de 2015

Android NDK - Hello World

O NDK é o Native Devolpment Kit e permite você escrever para android usando código nativo através de C ou C++

Geralmente se faz isso para obter mais performance (como é necessário no desenvolvimento de jogos por exemplo)

Mais detalhes em: https://developer.android.com/ndk/index.html

Eu estou usando para ver se consigo acessar recursos de telefonia para fazer uma conference... Mas enfim, segue um Hello World:

Faça o download do NDK: https://developer.android.com/ndk/downloads/index.html

Crie um novo projeto normalmente (File > New > New Project > dê um nome/domínio > Next > Next > Blank/Empty Activity > Finish)

No arquivo local.properties adicione uma linha com o caminho do seu NDK:

        ndk.dir=C\:\\android\\ndk\\android-ndk-r10e

No arquivo gradle.properties adicione isso:
android.useDeprecatedNdk=true

No arquivo build.gradle (da app) adicione em defaultConfig isso:

        ndk {
            moduleName "MyLib"
        }

Verifique se a MainActivity está estendendo diretamente a classe Activity, se não estiver, ajuste.

Na sua activity crie um método assim:
public native String getStringFromNative();

Vá em Build > Make

Depois vá no Terminal do Android Visual Studio e rode esse comando:

cd app\src\main

Depois rode esse comando (Não esquece de trocar as partes em negrito):

javah -d jni -classpath C:\android\sdk\platforms\android-23\android.jar;..\..\build\intermediates\classes\
debug br.com.localhost8080.ndksample.MainActivity

Isso vai criar uma pasta chamada jni com um arquivo .h nela

Crie nessa pasta jni um arquivo chamado main.c com o conteúdo abaixo (não esqueça de trocar os br_com_localhost8080_ndksample_MainActivity)

#include "br_com_localhost8080_ndksample_MainActivity.h"

JNIEXPORT jstring JNICALL Java_br_com_localhost8080_ndksample_MainActivity_getStringFromNative
        (JNIEnv * env, jobject obj)
  {
    return (*env)->NewStringUTF(env, "Hello from JNI!");
  }

Cria na mesma pasta um arquivo vazio chamado util.c (isso é necessário pois sem ele dá bug no gradle)

Depois dê um Build > Make

No activity_main.xml adicione um id no TextView:

android:id="@+id/my_textview"

Coloque na sua Activity

    static {
        System.loadLibrary("MyLib");
    }

No final do onCreate coloque:

        TextView tv = (TextView) findViewById(R.id.my_textview);
        tv.setText(getStringFromNative());

Dê um play e veja seu lindo HelloWorld escrito em C



Fontes no meu github: https://github.com/adrianoschmidt/ndk-sample

Para fazer esse hello world eu segui esse vídeo-tutorial (eh um pouco antigo, então peguei uns bugs que não apareceram no vídeo, e está em inglês): https://software.intel.com/en-us/videos/using-the-ndk-with-android-studio

Abraço!
Adriano Schmidt

Permissions no Android

Pessoal, hoje, na minha app Android, eu estava tentando fazer uma ligação. Dessa forma:

    private void callPhone() {
        Intent intent = new Intent(Intent.ACTION_CALL);
        intent.setData(Uri.parse("tel:456"));
        startActivity(intent);
    }


Mas deu o erro:

Caused by: java.lang.SecurityException: Permission Denial: starting Intent { act=android.intent.action.CALL dat=tel:xxx cmp=com.android.server.telecom/.components.UserCallActivity } from ProcessRecord{3e464e1 3861:br.com.localhost8080.myapp/u0a62} (pid=3861, uid=10062) requires android.permission.CALL_PHONE

Então fui no AndroidManifest.xml e coloquei a permission:

        <uses-permission android:name="android.permission.CALL_PHONE"/>


Mas aí aconteceu o erro:

Caused by: java.lang.SecurityException: Permission Denial: starting Intent { act=android.intent.action.CALL dat=tel:xxx cmp=com.android.server.telecom/.components.UserCallActivity } from ProcessRecord{ea870e6 4476:br.com.localhost8080.myapp/u0a62} (pid=4476, uid=10062) with revoked permission android.permission.CALL_PHONE

Para resolver usei o código abaixo pois a permission CALL_PHONE é level dangerous e você precisa solicitar permissao para o usuário:

    private static final int MY_PERMISSIONS_REQUEST_CALL_PHONE = 1;

    public void onClick(View view) {
        int permissionCheck = ContextCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE);
        if (permissionCheck != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CALL_PHONE}, MY_PERMISSIONS_REQUEST_CALL_PHONE);
        } else {
            callPhone();
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
        switch (requestCode) {
            case MY_PERMISSIONS_REQUEST_CALL_PHONE: {
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    callPhone();
                }
            }
        }
    }

    private void callPhone() {
        Intent intent = new Intent(Intent.ACTION_CALL);
        intent.setData(Uri.parse("tel:456"));
        startActivity(intent);
    }

Mais detalhes sobre permissões no android: https://developer.android.com/training/permissions/index.html

Mais detalhes sobre esse processo de ter que solicitar permissões: https://developer.android.com/training/permissions/requesting.html

sexta-feira, 9 de outubro de 2015

InfoQ - WildFly Avançado

Fala galera... esse ano palestrei no TDC Floripa sobre WildFly... mostrei um ambiente com cluster.. load balancer... entre outras coisas...

Essa semana o vídeo foi publicado na InfoQ, quem quiser dar uma olhadinha tá aí: www.infoq.com/br/presentations/wildfly-avancado




Obrigado a todos do JBug Brasil!!

Abraço!
Adriano Schmidt