tag:blogger.com,1999:blog-58692861969033389002024-03-13T07:38:58.862-03:00localhost8080Como qualquer desenvolvedor enfrento problemas no meu dia-a-dia, aqui eu compartilho as soluções que eu encontro.Adriano Schmidt - localhost8080http://www.blogger.com/profile/13982054925334438083noreply@blogger.comBlogger210125tag:blogger.com,1999:blog-5869286196903338900.post-76681505256925121772017-09-20T20:56:00.002-03:002017-09-20T21:27:24.588-03:00WP Paypal não funciona com W3 Total CacheImplementei o plugin <a href="https://wordpress.org/plugins/wp-paypal/" target="_blank">WP Paypal</a> no WordPress, mas ele parou de funcionar de repente.<br />
<br />
Isso aconteceu depois q instalei e ativei várias coisas no plugin <a href="https://br.wordpress.org/plugins/w3-total-cache/" target="_blank">W3 Total Cache</a> (que é muito bom alías).<br />
<br />
Quando eu inativava o W3 Total Cache, o WP Paypal voltava a funcionar...<br />
<br />
Por fim, identifiquei que o bastava desativar o "Minify" e "Browser Cache" em:<br />
<br />
Admin do Wordpress > Performance > General Settings<br />
<br />
-----------<br />
<br />
Quando identifiquei isso fiquei feliz pq descobri, mas fiquei puto, pq queria manter o Minify e Browser Cache habilitados... Para fazer isso tive que fazer o seguinte:<br />
<br />
-----------<br />
<br />
Identifiquei que eu posso manter o "Browser Cache" enabled, desde que eu desative o "Prevent caching of objects after settings change" em:<br />
<br />
Admin do Wordpress > Performance > Browser Cache > General<br />
<br />
Fonte da dica: <a target="_blank" href="https://premium.wpmudev.org/forums/topic/exception-for-w3-total-cache-browser-cache">https://premium.wpmudev.org/forums/topic/exception-for-w3-total-cache-browser-cache</a><br />
<br />
<br />
-----------<br />
<br />
Identifiquei que eu posso manter o "Minify" enabled, desde que eu coloque o nome da página "/nomedapagina" (sem as aspas) em:<br />
<br />
Admin do Wordpress > Performance > Minify > Advanced > Never minify the following pages:<br />
<br />
Fonte da dica: Tentativa e erro :D<br />
<br />
Abraços!<br />
Adriano SchmidtAdriano Schmidt - localhost8080http://www.blogger.com/profile/13982054925334438083noreply@blogger.com1tag:blogger.com,1999:blog-5869286196903338900.post-23160386045839088312017-09-08T11:22:00.000-03:002017-09-08T11:22:55.282-03:00Doméstica App - Case de UXPessoal...<br />
<br />
Sou o UX Designer do aplicativo <a target="_blank" href="https://domesticaapp.com.br">Doméstica App</a>, onde quem tem empregados domésticos pode controlar ponto, gerar folha de pagamento, integrar automaticamente com o eSocial, sem precisar de um contador!<br />
<br />
O aplicativo ainda não está 100% finalizado, mas já está nas App Stores:<br />
<br />
Android:<br />
<a target="_blank" href="https://play.google.com/store/apps/details?id=br.com.domesticaapp">Baixar Doméstica App para Android</a><br />
<br />
iOS:<br />
<a target="_blank" href="https://itunes.apple.com/br/app/dom%C3%A9stica-app/id1182363094?l=pt">Baixar Doméstica App para iOS</a><br />
<br />
Caso você queira usar e me dar um feedback, ficarei feliz :)<br />
<br />
E se gostar, deixe 5 estrelinhas tmb :P<br />
<br />
Em breve postarei mais detalhes do projeto e de como foi o processo.<br />
<br />
Abraços!<br />
Adriano SchmidtAdriano Schmidt - localhost8080http://www.blogger.com/profile/13982054925334438083noreply@blogger.com0tag:blogger.com,1999:blog-5869286196903338900.post-87641592892838160522017-03-13T00:53:00.000-03:002017-03-13T00:53:04.515-03:00npm install npm ERR! Error: EPERM: operation not permitted, renameOpa :)<br />
<br />
Ao dar um <b>npm install</b> tive o seguinte erro:<br />
<br />
<pre>npm ERR! Windows_NT 10.0.14393
npm ERR! argv "C:\\work\\Dropbox\\othertools\\node\\node.exe" "C:\\Users\\Adriano\\AppData\\Roaming\\npm\\node_modules\\npm\\bin\\npm-cli.js" "install"
npm ERR! node v4.6.0
npm ERR! npm v3.9.3
npm ERR! path C:\work\Dropbox\workspaces\ws-ionic\k2\node_modules\.staging\tryit-8b241062\package.json.3684708665
npm ERR! code EPERM
npm ERR! errno -4048
npm ERR! syscall rename
npm ERR! Error: EPERM: operation not permitted, rename 'C:\work\Dropbox\workspaces\ws-ionic\k2\node_modules\.staging\tryit-8b241062\package.json.3684708665' -> 'C:\work\Dropbox\workspaces\ws-ionic\k2\node_modules\.staging\tryit-8b241062\package.json'
npm ERR! at Error (native)
npm ERR! { [Error: EPERM: operation not permitted, rename 'C:\work\Dropbox\workspaces\ws-ionic\k2\node_modules\.staging\tryit-8b241062\package.json.3684708665' -> 'C:\work\Dropbox\workspaces\ws-ionic\k2\node_modules\.staging\tryit-8b241062\package.json']
npm ERR! errno: -4048,
npm ERR! code: 'EPERM',
npm ERR! syscall: 'rename',
npm ERR! path: 'C:\\work\\Dropbox\\workspaces\\ws-ionic\\k2\\node_modules\\.staging\\tryit-8b241062\\package.json.3684708665',
npm ERR! dest: 'C:\\work\\Dropbox\\workspaces\\ws-ionic\\k2\\node_modules\\.staging\\tryit-8b241062\\package.json',
npm ERR! parent: 'my-app' }
npm ERR!
npm ERR! Please try running this command again as root/Administrator.
npm ERR! Please include the following file with any support request:
npm ERR! C:\work\Dropbox\workspaces\ws-ionic\k2\npm-debug.log</pre><br />
Para resolver eu fiz duas coisas:<br />
- rodei o comando "npm cache clean" (talvez esse passo não seja necessário, mas mal não faz)<br />
- desativei temporariamente o antivírus (Avast)<br />
e ao rodar novamente o "npm install" tudo funcionou perfeitamente!<br />
<br />
Abraço!<br />
Adriano SchmidtAdriano Schmidt - localhost8080http://www.blogger.com/profile/13982054925334438083noreply@blogger.com0tag:blogger.com,1999:blog-5869286196903338900.post-12687149679038414432017-03-06T14:47:00.000-03:002017-03-06T14:47:49.442-03:00Ionic Android - AAPT: No resource found that matches the given name (at 'icon' with value '@drawable/icon')E aí meu brother que está lendo esse artigo, tudo bom? :)<br />
<br />
Rodei o comando "ionic build android" e tive o seguinte erro:<br />
<br />
<pre>cp: no such file or directory: C:\work\Dropbox\workspaces\ws-ionic\my-app\resources\android\icon\drawable-ldpi-icon.png
cp: no such file or directory: C:\work\Dropbox\workspaces\ws-ionic\my-app\resources\android\icon\drawable-mdpi-icon.png
cp: no such file or directory: C:\work\Dropbox\workspaces\ws-ionic\my-app\resources\android\icon\drawable-hdpi-icon.png
cp: no such file or directory: C:\work\Dropbox\workspaces\ws-ionic\my-app\resources\android\icon\drawable-xhdpi-icon.png
cp: no such file or directory: C:\work\Dropbox\workspaces\ws-ionic\my-app\resources\android\icon\drawable-xxhdpi-icon.png
cp: no such file or directory: C:\work\Dropbox\workspaces\ws-ionic\my-app\resources\android\icon\drawable-xxxhdpi-icon.png
cp: no such file or directory: C:\work\Dropbox\workspaces\ws-ionic\my-app\resources\android\splash\drawable-land-ldpi-screen.png
cp: no such file or directory: C:\work\Dropbox\workspaces\ws-ionic\my-app\resources\android\splash\drawable-land-mdpi-screen.png
cp: no such file or directory: C:\work\Dropbox\workspaces\ws-ionic\my-app\resources\android\splash\drawable-land-hdpi-screen.png
cp: no such file or directory: C:\work\Dropbox\workspaces\ws-ionic\my-app\resources\android\splash\drawable-land-xhdpi-screen.png
cp: no such file or directory: C:\work\Dropbox\workspaces\ws-ionic\my-app\resources\android\splash\drawable-land-xxhdpi-screen.png
cp: no such file or directory: C:\work\Dropbox\workspaces\ws-ionic\my-app\resources\android\splash\drawable-land-xxxhdpi-screen.png
cp: no such file or directory: C:\work\Dropbox\workspaces\ws-ionic\my-app\resources\android\splash\drawable-port-ldpi-screen.png
cp: no such file or directory: C:\work\Dropbox\workspaces\ws-ionic\my-app\resources\android\splash\drawable-port-mdpi-screen.png
cp: no such file or directory: C:\work\Dropbox\workspaces\ws-ionic\my-app\resources\android\splash\drawable-port-hdpi-screen.png
cp: no such file or directory: C:\work\Dropbox\workspaces\ws-ionic\my-app\resources\android\splash\drawable-port-xhdpi-screen.png
cp: no such file or directory: C:\work\Dropbox\workspaces\ws-ionic\my-app\resources\android\splash\drawable-port-xxhdpi-screen.png
cp: no such file or directory: C:\work\Dropbox\workspaces\ws-ionic\my-app\resources\android\splash\drawable-port-xxxhdpi-screen.png
[...]
:CordovaLib:compileDebugJavaWithJavacNote: Some input files use or override a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
[...]
:CordovaLib:compileReleaseJavaWithJavacNote: Some input files use or override a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
:CordovaLib:processReleaseJavaRes UP-TO-DATE
:CordovaLib:transformResourcesWithMergeJavaResForRelease
:CordovaLib:transformClassesAndResourcesWithSyncLibJarsForRelease
:CordovaLib:mergeReleaseJniLibFolders
:CordovaLib:transformNative_libsWithMergeJniLibsForRelease
:CordovaLib:transformNative_libsWithSyncJniLibsForRelease
:CordovaLib:bundleRelease
:prepareComAndroidSupportSupportV42411Library
:prepareDebugDependencies
:compileDebugAidl
:compileDebugRenderscript
:generateDebugBuildConfig
:generateDebugAssets UP-TO-DATE
:mergeDebugAssets
:generateDebugResValues
:generateDebugResources
:mergeDebugResources
:processDebugManifest
:processDebugResourcesC:\work\Dropbox\workspaces\ws-ionic\my-app\platforms\android\build\intermediates\manifests\full\debug\AndroidManifest.xml:25:23-37 : AAPT: No resource found that matches the given name (at 'icon' with value '@drawable/icon').
FAILED
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':processDebugResources'.
> com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command 'C:\work\Dropbox\android\sdk\build-tools\23.0.1\aapt.exe'' finished with non-zero exit value 1
* Try:
Run with --stacktrace
option to get the stack trace. Run with --info or --debug option to get more log output.
BUILD FAILED
Total time: 40.179 secs
ERROR building one of the platforms: Error code 1 for command: cmd with args: /s,/c,"C:\work\Dropbox\workspaces\ws-ionic\my-app\platforms\android\gradlew cdvBuildDebug -b C:\work\Dropbox\workspaces\ws-ionic\my-app\platforms\android\build.gradle -Dorg.gradle.daemon=true -Pandroid.useDeprecatedNdk=true"
You may not have the required environment or OS to build this project
Error: Error code 1 for command: cmd with args: /s,/c,"C:\work\Dropbox\workspaces\ws-ionic\my-app\platforms\android\gradlew cdvBuildDebug -b C:\work\Dropbox\workspaces\ws-ionic\my-app\platforms\android\build.gradle -Dorg.gradle.daemon=true -Pandroid.useDeprecatedNdk=true"</pre><br />
Para resolver fiz o seguinte:<br />
- Fui na pasta <pasta do projeto>/platforms/android/res<br />
- Criei uma pasta chamada "drawable"<br />
- Coloquei um arquivo png qualquer chamado icon.png<br />
<br />
Pronto, resolveu :)<br />
<br />
Não sei se é a melhor solução, provavelmente não hahah Talvez seja algum conflito de versão ou versão desatualizada de algo (do sdk talvez)... <br />
Como não sou eu que vou gerar o aplicativo para a play store, estou só resolvendo uns bugs aqui, então pra mim, essa solução foi suficiente... Talvez pra vc não tenha sido, mas acredito que posso ter te ajudado a pelo menos entender melhor o problema.<br />
<br />
Fonte: <a target="_blank" href="http://stackoverflow.com/questions/4736523/no-resource-found-that-matches-the-given-name">http://stackoverflow.com/questions/4736523/no-resource-found-that-matches-the-given-name</a><br />
<br />
Abraço!<br />
Adriano SchmidtAdriano Schmidt - localhost8080http://www.blogger.com/profile/13982054925334438083noreply@blogger.com0tag:blogger.com,1999:blog-5869286196903338900.post-32454207155909044302017-03-06T13:02:00.000-03:002017-03-06T13:02:29.356-03:00Ionic Android - "Could not resolve all dependencies for configuration" e "Could not find any version that matches com.android.support:support"Olá :)<br />
<br />
Rodei o comando "ionic build android" e tive o seguinte erro:<br />
<br />
<pre>Running command: C:\work\Dropbox\othertools\node\node.exe C:\work\Dropbox\workspaces\ws-ionic\my-app\hooks\after_prepare\010_add_platform_class.js C:\work\Dropbox\workspaces\ws-ionic\my-app
add to body class: platform-android
Running command: C:\work\Dropbox\othertools\node\node.exe C:\work\Dropbox\workspaces\ws-ionic\my-app\hooks\after_prepare\020_remove_sass_from_platforms.js C:\work\Dropbox\workspaces\ws-ionic\my-app
ANDROID_HOME=C:\work\Dropbox\android\sdk
JAVA_HOME=C:\work\Dropbox\java\windows\jdk1.8.0_60
FAILURE: Build failed with an exception.
* What went wrong:
A problem occurred configuring root project 'android'.
> Could not resolve all dependencies for configuration ':_debugCompile'.
> Could not find any version that matches com.android.support:support-v4:24.1.1+.
Searched in the following locations:
https://repo1.maven.org/maven2/com/android/support/support-v4/maven-metadata.xml
https://repo1.maven.org/maven2/com/android/support/support-v4/
file:/C:/work/Dropbox/android/sdk/extras/android/m2repository/com/android/support/support-v4/maven-metadata.xml
file:/C:/work/Dropbox/android/sdk/extras/google/m2repository/com/android/support/support-v4/maven-metadata.xml
file:/C:/work/Dropbox/android/sdk/extras/google/m2repository/com/android/support/support-v4/
Required by:
:android:unspecified
* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.
BUILD FAILED
Total time: 23.703 secs
ERROR building one of the platforms: Error code 1 for command: cmd with args: /s,/c,"C:\work\Dropbox\workspaces\ws-ionic\my-app\platforms\android\gradlew cdvBuildDebug -b C:\work\Dropbox\workspaces\ws-ionic\my-app\platforms\android\build.gradle -Dorg.gradle.daemon=true -Pandroid.useDeprecatedNdk=true"
You may not have the required environment or OS to build this project
Error: Error code 1 for command: cmd with args: /s,/c,"C:\work\Dropbox\workspaces\ws-ionic\my-app\platforms\android\gradlew cdvBuildDebug -b C:\work\Dropbox\workspaces\ws-ionic\my-app\platforms\android\build.gradle -Dorg.gradle.daemon=true -Pandroid.useDeprecatedNdk=true"</pre><br />
Pra resolver:<br />
- Abra o Android Studio<br />
- Acesse: Tools > Android > SDK Manager<br />
- Clique na aba SDK Tools<br />
- Selecione "Android Support Repository"<br />
- Dê um "Apply"<br />
- Vá seguindo a instalação<br />
<br />
Fonte: <a target="_blank" href="https://github.com/driftyco/ionic-cloud-issues/issues/107">https://github.com/driftyco/ionic-cloud-issues/issues/107</a><br />
<br />
É isso aí, abraço!<br />
Adriano SchmidtAdriano Schmidt - localhost8080http://www.blogger.com/profile/13982054925334438083noreply@blogger.com0tag:blogger.com,1999:blog-5869286196903338900.post-79068688833497784212016-10-27T19:08:00.001-02:002016-10-27T19:08:46.271-02:00Como centralizar uma imagem dentro de uma div?Nossa, pesquisei muito pra conseguir descobrir isso...<br />
<br />
Tenho uma div e dentro dela uma imagem....<br />
<br />
E essa imagem é maior que a div... então quero que o que seja maior que a div, desapareça...<br />
<br />
Para isso é fácil, basta colocar na sua div via CSS:<br />
<pre>overflow: hidden;</pre>Isso eu copiei da capa (cover) das páginas do Facebook, dei um inspecionar elemento e vi como era feito.<br />
<br />
<br />
Mas no meu caso só isso não era suficiente, pq eu queria que a imagem ficasse centralizada dentro da minha div...<br />
<br />
Então é necessário dar um <br />
<pre>top: -50px</pre>ou um<br />
<pre>margin-top: -50px</pre>ou ainda com porcentagem: 10% por exemplo<br />
<br />
<br />
Mas pra mim ainda não tinha dado certo... pq a imagem era dinâmica e podia ter vários tamanhos... então tive que adicionar esse CSS na imagem:<br />
<pre>position: relative;
top: 50%;
-webkit-transform: translateY(-50%);
-ms-transform: translateY(-50%);
transform: translateY(-50%);</pre><br />
E então funcionou :)<br />
<br />
<br />
Se o seu caso for centralizar horizontalmente e não verticalmente, provavelmente vai ter q usar left ao invés de top e translateX ao invés de translateY... mas não testei isso...<br />
<br />
<br />
Como cada caso é um caso, talvez você tenha que adicionar um<br />
<pre>min-height: 200px;</pre>na sua imagem, não necessariamente 200px mas o tamanho da sua div, isso faz com que imagens menores q o tamanho da div estiquem... mas tem que ver se é esse comportamento que você quer..<br />
<br />
<br />
No meu caso ainda tive que usar media query pois queria alguns comportamentos diferentes no mobile/tablet/desktop... a div tinha tamanho diferente em cada device...<br />
<br />
<br />
Bom, basicamente é isso.. Mais detalhes deem uma olhada no código do cover em qualquer perfil do Facebook e vejam esse artigo que foi onde achei a solução: <a target="_blank" href="http://jonrohan.codes/fieldnotes/vertically-center-clipped-image/">http://jonrohan.codes/fieldnotes/vertically-center-clipped-image/</a><br />
<br />
<br />
Abraço!<br />
Adriano SchmidtAdriano Schmidt - localhost8080http://www.blogger.com/profile/13982054925334438083noreply@blogger.com0tag:blogger.com,1999:blog-5869286196903338900.post-78202748001117329972016-09-25T20:12:00.000-03:002016-09-25T20:14:41.830-03:00Como transferir um domínio de CPF para CNPJ no registro br?Siga esses passos:<br />
<br />
1) Preencher esse formulário: <a target="_blank" href="http://registro.br/cgi-bin/nicbr/transferencia_de_dominio">http://registro.br/cgi-bin/nicbr/transferencia_de_dominio</a><br />
2) Validar se todos os dados no documento gerado no formulário estão corretos<br />
3) Ir ao cartório para assinar o documento gerado no formulário reconhecendo firma.<br />
4) Fazer cópia (xerox) de algum documento que tenha o CPF (Identidade ou Carteira de motorista) do titular atual<br />
5) Fazer cópia (xerox) do cartão de CNPJ da empresa<br />
6) Ir ao correio e enviar esse documento assinado e as cópias do CPF e CNPJ para "Av. das Nações Unidas, 11541, 7° andar - 04578-000 - São Paulo - SP" com o assunto "Transferência de Domínio" aos cuidados de Hostmaster.<br />
<br />
<blockquote>Destinatário:<br />
A/C Hostmaster - Registro.br<br />
Assunto: Transferência de domínio<br />
Av. das Nações Unidas, 11541, 7° andar<br />
04578-000 São Paulo - SP <br />
</blockquote><br />
Depois é só esperar.<br />
<br />
Att,<br />
Adriano SchmidtAdriano Schmidt - localhost8080http://www.blogger.com/profile/13982054925334438083noreply@blogger.com0tag:blogger.com,1999:blog-5869286196903338900.post-30931829894686666892016-09-17T16:31:00.001-03:002016-09-17T16:31:47.886-03:00Como escrever termos de uso e política de privacidade?Fala pessoal...<br />
<br />
Hoje precisei escrever um termo de uso e uma política de privacidade... vou falar pra vocês como funciona isso...<br />
<br />
<br />
<b>Por quê?</b><br />
É muito importante um e-commerce ou uma app ter um "termos de uso" e "politíca de privacidade" para evitar processos e outros problemas....<br />
<br />
<b>O que é?</b><br />
Resumindo os conceitos:<br />
Termos de uso são tudo que a empresa e o usuário, devem, podem, não podem fazer...<br />
Política de privacidade fala dos dados que você coleta do usuário e o que você faz com eles.<br />
<br />
Mais sobre os conceitos: <a target="_blank" href="http://www.startupblogbrazil.com/2013/05/a-importancia-dos-termos-de-uso-e-da_17.html">http://www.startupblogbrazil.com/2013/05/a-importancia-dos-termos-de-uso-e-da_17.html</a><br />
<br />
<b>Como fazer?</b><br />
Para gerar esses documentos tem alguns geradores na internet, por exemplo:<br />
<br />
Gerar termos de uso:<br />
<a target="_blank" href="https://pt.shopify.com/ferramentas/gerador-politica-de-privacidade/termos-condicoes">https://pt.shopify.com/ferramentas/gerador-politica-de-privacidade/termos-condicoes</a><br />
<br />
Gerar política de privacidade:<br />
<a target="_blank" href="https://pt.shopify.com/ferramentas/gerador-politica-de-privacidade">https://pt.shopify.com/ferramentas/gerador-politica-de-privacidade</a><br />
<br />
Mas é muito importante você ler esses documentos gerados e alterar o que você achar necessário.<br />
<br />
Depois disso veja esses documentos dos seus concorrentes ou empresas do mesmo setor para pegar mais ideias e complementar os seus documentos.<br />
<br />
É de extrema importância que um advogado revise esses documentos!!!<br />
<br />
<br />
É isso pessoal, abraço!!<br />
Adriano SchmidtAdriano Schmidt - localhost8080http://www.blogger.com/profile/13982054925334438083noreply@blogger.com0tag:blogger.com,1999:blog-5869286196903338900.post-80559851528397900752016-09-13T17:39:00.000-03:002016-09-14T15:07:07.491-03:00Load balancer com WildFly 10Esse passo a passo mostra como montar um ambiente com um Apache HTTP Server como loadbalancer e vários WildFly 10 atrás utilizando sempre o modo standalone.<br />
<br />
Bom, trabalho com JBoss/WIldFly desde a versão 3 e já montei ambientes load balancer e cluster em mais de 20 ambientes... Esse mês montei novamente utilizando o WildFly 10 para um cliente que estou dando consultoria.<br />
<br />
Antes de mais nada agradeço a todos do <a target="_blank" href="https://developer.jboss.org/groups/jbug-brasil" target="_blank">JBug Brasil</a>. Sem a galera desse grupo eu não saberia nem iniciar o WildFly :) Entrem lá, recomendo!<br />
<br />
O ambiente será assim:<br />
<br />
<img height="225" src="https://lh3.googleusercontent.com/hHM0jEqWdEudYcgjo-zs0VK0INih21wsNJ4dW3rgqeohUWRygECCDsz7A1iFzNETkPnheG-lgkyMuB7_3c5KlNdvXtc4YVXzrFeBsBKZsvHmcYn1FtR2DKQSuRXg807Qu7f28KCr" style="-webkit-transform: rotate(0.00rad); border: none; transform: rotate(0.00rad);" width="329" /><br />
<br />
<br />
<b>Standalone ou domain?</b><br />
Resolvi usar o modo standalone pois acredito que o modo domain adiciona um pouco mais de complexidade que não é necessária para ambientes com poucos servidores WildFly....<br />
<br />
o domain serve apenas para centralizar as configurações em uma máquina só... caso queira fazer usando o modo domain, basta seguir esse tutorial e depois alterar para o modo domain....<br />
<br />
<br />
<b>Load balancer e/ou cluster</b><br />
<br />
Aqui mostro apenas o como fazer um Load Balancer... não mostro como fazer um cluster... mas em muitos (talvez na maioria) dos ambientes, o cluster não é necessário....<br />
<br />
O Load balancer serve para permitir escalabilidade... então atrás do Apache vai ter vários WildFly e você pode adicionar mais caso necessário (caso aumente o número de usuários por exemplo)<br />
<br />
O Load balancer serve para redundância... se cair um WildFly, outro WildFly vai assumir....<br />
<br />
<blockquote><i>"Tá Adriano, então pra que serve o cluster?"</i></blockquote><br />
O cluster serve para permitir o compartilhamento de dados de sessão.. por exemplo... no load balancer se vc estiver logado e de repente o WildFly cair, outro WildFly vai assumir, mas você voltará para a tela de login e terá q fazer login de novo... pois dados de sessão não são compartilhados no load balancer....<br />
<br />
Para permitir que o usuário continue logado, você teria que ter um cluster...<br />
<br />
Como os WildFly não vão cair o tempo inteiro... e se quando cair não for um problema tão grande o usuário ter q fazer login de novo... você não precisa de cluster....<br />
<br />
Se você quiser fazer um cluster tudo bem.... não é muuuito dificil, é só seguir esse tutorial e depois alterar mais algumas coisinhas para implementar o cluster, mas não vou mostrar isso neste post...<br />
<br />
Ahhh... E caso você esteja usando Amazon ou Digital Ocean... fazer um cluster vai ser um pouco mais difícil pois eles não permitem multicast (q é como as máquinas do cluster se comunicam) e você teria que fazer isso de outra forma... o q não é tããão simples...<br />
<br />
<b>Post passo-a-passo</b><br />
<br />
Talvez (ou não) vc esteja se perguntando:<br />
<blockquote><i>"Este passo-a-passo é completo e é só seguir que vai dar certo?"</i></blockquote><br />
Não! Esse passo-a-passo provavelmente não vai estar 100% claro e talvez falte algum detalhe... Foram anotações que fiz quando estava montando esse ambiente...<br />
<br />
Não achei nenhum passo-a-passo mostrando como montar um load balancer com WildFly 10... por isso resolvi postar aqui mesmo que falte algum detalhe...<br />
<br />
Até pq quando você for usar talvez vc use alguma versão diferente do que usei ou talvez seja diferente na sua infra ou no seu S.O.<br />
<br />
Já montei load balancers e clusters em mais de 20 ambientes... e todas as vezes deu algum problema diferente...<br />
<br />
<blockquote><i>"Tá Adriano, mas se não tá completo então esse post é inútil"</i></blockquote><br />
Acredito que é útil sim! talvez vc vai ter alguma dificuldade em algum ponto... aí vc abre um chamado no <a target="_blank" href="https://developer.jboss.org/groups/jbug-brasil" target="_blank">JBug Brasil</a> e eu e outros caras que são bem legais vamos tentar te ajudar.<br />
<br />
<br />
<b>Vamos lá!</b><br />
<br />
<br />
Você precisará de 3 máquinas:<br />
- maq01: Apache HTTP Server<br />
- maq02: WildFly Server1<br />
- maq03: WildFly Server2<br />
<br />
<b>Sistema operacional</b><br />
Sugiro o uso do sistema operacional RHEL (Red Hat Entrerprise Linux) ou CentOS (que é igual ao RHEL só que da comunidade).<br />
Mas já implantei isso no Ubuntu também.<br />
No Windows deve dar também... mas esse post vai ser todo focado em linux...<br />
<br />
<br />
<b>Em todas as máquinas faça esses passos:</b><br />
<br />
<b>- Configure a rede conforme desejado:</b><br />
/etc/init.d/network stop<br />
vi /etc/sysconfig/network-scripts/ifcfg-eth0<br />
vi /etc/sysconfig/network<br />
vi /etc/resolv.conf<br />
/etc/init.d/network start<br />
<br />
<b>- Teste se a rede está OK</b><br />
ping www.google.com<br />
ifconfig<br />
<br />
<br />
<b>Maq01 - Apache HTTP Server</b><br />
<br />
Documentação complementar:<br />
<a target="_blank" href="https://docs.jboss.org/mod_cluster/1.1.0/html/native.config.html">https://docs.jboss.org/mod_cluster/1.1.0/html/native.config.html</a><br />
<a target="_blank" href="https://httpd.apache.org/docs/2.4/howto/access.html">https://httpd.apache.org/docs/2.4/howto/access.html</a><br />
<br />
<b> Apache 2.2 </b><br />
Aqui vou falar como implantar com o Apache 2.2... mais pra baixo comento como é com o Apache 2.4<br />
<br />
yum install httpd httpd-devel apr-devel openssl-devel mod_ssl -y<br />
<br />
sudo service httpd start<br />
<br />
<br />
- Acesse no browser de sua máquina e verifique se o Apache HTTP Server está no ar, só acessar pelo ip: http://<ip da maquina><br />
<br />
- Baixe o mod_cluster (sempre utilize a versão mais atual ao invés de usar o comando abaixo, procure em http://mod-cluster.jboss.org/)<br />
wget http://downloads.jboss.org/mod_cluster//1.3.1.Final/linux-x86_64/mod_cluster-1.3.1.Final-linux2-x64-so.tar.gz<br />
tar -zxvf mod_cluster-1.3.1.Final-linux2-x64-so.tar.gz<br />
cp mod_advertise.so /etc/httpd/modules/<br />
cp mod_manager.so /etc/httpd/modules/<br />
cp mod_proxy_cluster.so /etc/httpd/modules/<br />
cp mod_cluster_slotmem.so /etc/httpd/modules/<br />
<br />
- Comente a linha do mod_proxy_balancer pois será usado o mod_cluster<br />
cd /etc/httpd/conf.modules.d<br />
vi 00-proxy.conf<br />
<br />
- A linha deve ficar assim:<br />
#LoadModule proxy_balancer_module modules/mod_proxy_balancer.so<br />
<br />
<br />
- Crie e adicione o conteúdo do arquivo mod_cluster.conf<br />
cd /etc/httpd/conf.d/<br />
touch mod_cluster.conf<br />
vi mod_cluster.conf<br />
<br />
LoadModule cluster_slotmem_module modules/mod_cluster_slotmem.so<br />
LoadModule manager_module modules/mod_manager.so<br />
LoadModule proxy_cluster_module modules/mod_proxy_cluster.so<br />
LoadModule advertise_module modules/mod_advertise.so<br />
<br />
MemManagerFile /var/cache/mod_cluster<br />
<br />
Maxcontext 100<br />
Maxnode 100<br />
Maxhost 100<br />
<br />
<VirtualHost *:80><br />
<br />
<Directory /><br />
Order deny,allow<br />
Allow from all<br />
</Directory><br />
<br />
<Location /mod_cluster_manager><br />
SetHandler mod_cluster-manager<br />
#Order deny,allow<br />
#Deny from all<br />
#Allow from all<br />
AuthType Basic<br />
AuthName "MCM"<br />
AuthUserFile /etc/modclusterpassword<br />
Require user admin<br />
</Location><br />
<br />
KeepAliveTimeout 60<br />
MaxKeepAliveRequests 0<br />
ServerAdvertise Off<br />
EnableMCPMReceive Off<br />
<br />
</VirtualHost><br />
<br />
<br />
<br />
<b>Apache 2.4</b><br />
Essa semana instalei esse ambiente no Ubuntu e no Apache 2.4... teve algumas diferenças...<br />
<br />
Para fazer isso (Apache 2.4 no Ubuntu) usei esse passo-a-passo:<br />
<a target="_blank" href="https://symbiotics.co.za/configure-apache-with-mod_cluster-load-balancer-on-ubuntu/">https://symbiotics.co.za/configure-apache-with-mod_cluster-load-balancer-on-ubuntu/</a><br />
<br />
<br />
<b>Se acontecer o erro:</b><br />
<br />
apache2: Syntax error on line 140 of /etc/apache2/apache2.conf: <br />
Syntax error on line 3 of /etc/apache2/mods-enabled/proxy_cluster.load: <br />
Cannot load /usr/lib/apache2/modules/mod_proxy_cluster.so into server: <br />
/usr/lib/apache2/modules/mod_proxy_cluster.so: undefined symbol: ap_proxy_hashfunc<br />
<br />
<br />
<br />
A solução é deixar o arquivo "proxy_cluster.load" dessa forma:<br />
<br />
LoadModule proxy_module /usr/lib/apache2/modules/mod_proxy.so<br />
LoadModule cluster_slotmem_module /usr/lib/apache2/modules/mod_cluster_slotmem.so<br />
LoadModule manager_module /usr/lib/apache2/modules/mod_manager.so<br />
LoadModule advertise_module /usr/lib/apache2/modules/mod_advertise.so<br />
LoadModule proxy_cluster_module /usr/lib/apache2/modules/mod_proxy_cluster.so<br />
<br />
<br />
<b>Além disso, aconteceu o erro:</b><br />
<br />
[Thu Aug 25 18:01:33.049309 2016] [proxy:warn] [pid 5911:tid [...] [client 177.101.142.200:58291] AH01144: No protocol handler was valid for the URL /systemprops. If you are using a DSO version of mod_proxy, make sure the proxy submodules are included in the configuration using LoadModule.<br />
<br />
Ali onde estou carregando os módulos então tive que adicionar a seguinte linha:<br />
<br />
LoadModule proxy_ajp_module /usr/lib/apache2/modules/mod_proxy_ajp.so<br />
<br />
Mais detalhes em: <a target="_blank" href="https://developer.jboss.org/thread/272092">https://developer.jboss.org/thread/272092</a>. Agradeço ao Ingo e filippe.spolti do JBug Brasil pela ajuda nesse problema.<br />
<br />
<br />
<b>Além disso, deu o erro:</b><br />
<br />
2016-08-23 19:38:20,417 ERROR [org.jboss.modcluster] (UndertowEventHandlerAdapter - 1) MODCLUSTER000042: Error null sending INFO command to ip-<IP INTERNO DO APACHE>.sa-east-1.compute.internal/<IP INTERNO DO APACHE>:80, configuration will be reset: null<br />
<br />
<br />
A solução... meu conf do apache estava assim:<br />
<br />
<Directory /><br />
Order deny,allow<br />
Allow from all<br />
</Directory><br />
<br />
Mas na versão Apache 2.4 tem que ser assim:<br />
<br />
<Directory /><br />
AllowOverride none<br />
Require all granted<br />
</Directory><br />
<br />
Mais detalhes em: <a target="_blank" href="https://developer.jboss.org/thread/272023">https://developer.jboss.org/thread/272023</a><br />
<br />
<br />
<br />
<b>- Crie um usuário e senha</b><br />
htpasswd -c /etc/modclusterpassword admin<br />
<br />
<b>- Reinicie o Apache:</b><br />
sudo service httpd stop<br />
sudo service httpd start<br />
<br />
- Teste novamente no browser: http://<ip_da_maquina><br />
<br />
- Teste no browser o mod_cluster: http://<ip_da_maquina>/mod_cluster_manager<br />
<br />
<br />
<br />
<br />
<b>Maq02, Maq03</b><br />
<br />
<b>- Instale e configure o Java (Sempre use a versão mais atual)<br />
</b><br />
Aqui está um exemplo de como instalar (no caso Java 7, mas use o 8), mas pode fazer como achar melhor.<br />
wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/7u79-b15/jdk-7u79-linux-x64.rpm<br />
<br />
rpm -Uvh jdk-7u79-linux-x64.rpm<br />
<br />
alternatives --install /usr/bin/java java /usr/java/latest/jre/bin/java 200000<br />
alternatives --install /usr/bin/javaws javaws /usr/java/latest/jre/bin/javaws 200000<br />
alternatives --install /usr/bin/javac javac /usr/java/latest/bin/javac 200000<br />
alternatives --install /usr/bin/jar jar /usr/java/latest/bin/jar 200000<br />
<br />
<br />
<b>- Instale o WildFly (Sempre baixe a versão mais atual):</b><br />
Aqui está o 8, mas use o 10 ou superior:<br />
<br />
wget http://download.jboss.org/wildfly/8.2.0.Final/wildfly-8.2.0.Final.zip<br />
<br />
yum install unzip<br />
<br />
unzip wildfly-8.2.0.Final.zip -d /opt/<br />
ln -s /opt/wildfly-8.2.0.Final /opt/wildfly<br />
<br />
<br />
<b>- Configure um usuário no linux:</b><br />
groupadd wildfly<br />
useradd -s /bin/bash -d /home/wildfly -m -g wildfly wildfly<br />
chown -R wildfly:wildfly /opt/wildfly-8.2.0.Final<br />
chown -h wildfly:wildfly /opt/wildfly<br />
<br />
sudo vi /etc/sudoers<br />
wildfly ALL=(ALL) NOPASSWD:ALL<br />
<br />
passwd wildfly<br />
su wildfly<br />
<br />
<br />
<b>- Inicie o WildFly rodando o standalone.sh da pasta bin passando como parâmetro o profile full-ha</b><br />
./standalone.sh -server-config=standalone-full-ha.xml<br />
<br />
<b>- Veja no log se não deu erros</b><br />
vi /opt/wildfly/standalone/log/server.log<br />
<br />
<b>- Pare o WildFly</b><br />
<br />
<br />
<b>- Adicione as linhas de JAVA_OPTS:</b><br />
vi /opt/wildfly/bin/standalone.conf<br />
JAVA_OPTS="$JAVA_OPTS -Djboss.bind.address=<IP MAQUINA>"<br />
<br />
Ao invés de IP da máquina você pode usar 0.0.0.0 que é mais genérico<br />
<br />
<br />
<br />
<b>- Configure o mod_cluster no WildFly:</b><br />
- acesse o arquivo standalone-full-ha.xml<br />
- procure o subsystem modcluster e altere o conteúdo dele para:<br />
<br />
<mod-cluster-config advertise-socket="modcluster" proxies="apache1" advertise="false" sticky-session="true" load-balancing-group="arquitetura" connector="ajp"><br />
<dynamic-load-provider><br />
<load-metric type="cpu"/><br />
</dynamic-load-provider><br />
</mod-cluster-config><br />
<br />
<br />
-dentro do seu socket-binding-group, você deve colocar isso:<br />
<br />
<outbound-socket-binding name="apache1"><br />
<remote-destination host="<IP INTERNO DO APACHE>" port="80"/><br />
</outbound-socket-binding><br />
<br />
Mais sobre isso: <a target="_blank" href="https://developer.jboss.org/thread/272022">https://developer.jboss.org/thread/272022</a><br />
<br />
<br />
<b>- Inicie o WildFly</b><br />
./standalone.sh -server-config=standalone-full-ha.xml<br />
<br />
<br />
<b>- Faça deploy de uma aplicação de testes</b><br />
- Faça o deploy da aplicação systemprops jogando o war na pasta deployments do WildFly: https://dl.dropboxusercontent.com/u/8155843/TDC%20Floripa%202015/systemprops.war<br />
<br />
<b>Teste o load balancer</b><br />
1) Acesse via broser a aplicação pelo apache http server: http://<ip_do_apache>/systemprops<br />
2) A aplicação mostrará em qual host você vai estar: arquitetura-1 ou arquitetura-2. Vai depender de onde o loadbalancer te direcionou<br />
3) Vá até a máquina que você foi direcionado (arquitetura-1 por exemplo) e pare o WildFly<br />
4) Acesse a mesma URL e veja que você foi redirecionado para o arquitetura-2, ou seja, o loadbalancer está funcinando<br />
5) Suba novamente o wildfly<br />
<br />
<br />
<b>Segurança</b><br />
- Nunca inicie nada como root<br />
- Não deixe acessível na web o servidor onde está o WildFly (configuração de infra). Resumindo, você não pode conseguir pingar o servidor onde está o WildFly, pois só o servidor do Apache deve estar disponível.<br />
- Use SSL<br />
- Permita o acesso ao mod cluster manager apenas na rede interna (melhor opção) ou apenas para um determinado IP. Algo como:<br />
<Location /mod_cluster_manager><br />
SetHandler mod_cluster-manager<br />
Order deny,allow<br />
Deny from all<br />
Allow from <seu_ip><br />
AuthType Basic<br />
AuthName "MCM"<br />
AuthUserFile /etc/modclusterpassword<br />
Require user admin<br />
</Location><br />
<br />
Mais sobre segurança em: <a target="_blank" href="https://developer.jboss.org/thread/258299">https://developer.jboss.org/thread/258299</a><br />
<br />
<br />
<b>Perfomance</b><br />
- Com Java 8 já vai aumentar muuuito a performance comparado com versões anteriores..<br />
- o load balancer é bom para performance pois vai distribuir os acessos deixando tudo mais rápido...<br />
- gzip compression no Apache é essencial<br />
- Configure xms e xmx...<br />
- faça testes de desempenho e utilize ferramentas de monitoramento: <a target="_blank" href="http://localhost8080.blogspot.com.br/2016/07/monitorar-ambiente-infra-e-jboss-wildfly.html">http://localhost8080.blogspot.com.br/2016/07/monitorar-ambiente-infra-e-jboss-wildfly.html</a><br />
- Tuning: <a target="_blank" href="http://localhost8080.blogspot.com.br/2014/06/tunning-de-aplicacoes-java.html">http://localhost8080.blogspot.com.br/2014/06/tunning-de-aplicacoes-java.html</a><br />
<br />
<br />
<b>Integração contínua</b><br />
Use! :)<br />
<br />
<br />
<b>Consultoria:</b><br />
Lembrando que se precisar dou consultorias nesse assunto e também em questões como performance, arquitetura, integração contínua, montagem de ambientes com load balancer e cluster, etc... Só entrar em contato: <b>adriano@localhost8080.com.br</b><br />
<br />
<br />
Abraço!<br />
Adriano Schmidt<br />
Adriano Schmidt - localhost8080http://www.blogger.com/profile/13982054925334438083noreply@blogger.com14tag:blogger.com,1999:blog-5869286196903338900.post-74477456998770436562016-09-13T02:23:00.000-03:002016-12-05T16:44:47.046-02:00Publicar ionic na webPessoal... dei uma pesquisada aqui sobre usar ionic na web... A ideia é usar o mesmo código da sua app em ionic para publicar na web e os usuários acessarem via browser...<br />
<br />
Bom, fonte principal da minha pesquisa foi esse tópico de fórum: <a target="_blank" href="https://forum.ionicframework.com/t/deploy-ionic-app-as-a-website/2845/45">https://forum.ionicframework.com/t/deploy-ionic-app-as-a-website/2845/45</a><br />
<br />
<br />
Seguem alguns apps funcionando com ionic na web:<br />
<br />
Snaphappi<br />
<a target="_blank" href="http://app.snaphappi.com/on-the-go.App/#/app/gallery/all/top-picks">http://app.snaphappi.com/on-the-go.App/#/app/gallery/all/top-picks</a><br />
<br />
Strappd<br />
<a target="_blank" href="https://strappd.org/">https://strappd.org/</a><br />
<br />
American Society of Hematology<br />
<a target="_blank" href="http://ashpocketguides.hematology.org/">http://ashpocketguides.hematology.org</a><br />
<a target="_blank" href="https://itunes.apple.com/us/app/ash-pocket-guides/id1055482799?mt=8">https://itunes.apple.com/us/app/ash-pocket-guides/id1055482799?mt=8</a><br />
<a target="_blank" href="https://play.google.com/store/apps/details?id=org.hematology.pocketguides&hl=en">https://play.google.com/store/apps/details?id=org.hematology.pocketguides&hl=en</a><br />
<br />
National Marrow Donor Program<br />
<a target="_blank" href="http://hct.bethematchclinical.org/">http://hct.bethematchclinical.org</a><br />
<a target="_blank" href="https://itunes.apple.com/us/app/transplant-hct-guidelines/id405310144?mt=8">https://itunes.apple.com/us/app/transplant-hct-guidelines/id405310144?mt=8</a><br />
<a target="_blank" href="https://play.google.com/store/apps/details?id=com.nmdp.webView&hl=en">https://play.google.com/store/apps/details?id=com.nmdp.webView&hl=en</a><br />
<br />
<br />
<br />
<br />
Alguns pontos de atenção:<br />
<br />
Usar media query para CSS específico para web.. ou seja, crie um arquivo web.css por exemplo e use @media (min-width: 601px) { <seu CSS aqui> }. Nesse arquivo coloque todo o CSS referente à parte web. Se preferir quebrar em mais arquivos, pode fazer tmb, a ideia é usar o media query para coisas específicas de telas grandes.<br />
<br />
Tem que trabalhar margens/paddings e tamanhos de fontes... usando percentuais em margem e padding, e "em" ao invés de "px" nos font-size...<br />
<br />
Talvez alguns componentes (combobox/componente de data/sliders/toggle) podem não funcionar... Nesse caso teria que usar um outro componente ou se for só estilo corrigir com CSS<br />
<br />
Verificar se login vai funcionar bem... JWT..<br />
<br />
Onde usar plugin tem q verificar se é celular: if(window.cordova)<br />
Por exemplo se usar push notification vai ter que fazer esse if para o código de push não rodar na web<br />
<br />
Se você salva dados no localstorage de forma aberta, e publicar a app na web pode dar problemas, alguém pode alterar dados ali e "hackear" sua aplicação. Para funcionar direto, tem que de alguma forma criptografar os dados salvos e descriptografar quando precisar, ou salvar os dados em outro lugar.<br />
<br />
Tem que ter que testar em vários browsers (Teríamos que fazer isso de qualquer forma, mas aqui é pra ver se o ionic tem alguma limitação)<br />
<br />
Sugiro testar nesses browsers:<br />
Chrome<br />
Firefox<br />
IE10+<br />
Microsoft Edge 13<br />
Safari<br />
Safari no IPhone<br />
Chrome no Android<br />
<br />
Nos browsers que não funcionar e nos demais browsers que não estão na lista acima, você pode sugerir para o usuário baixar/trocar de browser<br />
<br />
O scrool pode não funcionar como esperado com o mouse pois o touch é diferente, mas é possível arrumar.<br />
<br />
<br />
<br />
Tecnicamente falando:<br />
<br />
Aqui um cara mostra como ele fez pra rodar:<br />
<a target="_blank" href="https://forum.ionicframework.com/t/deploy-ionic-app-as-a-website/2845/40">https://forum.ionicframework.com/t/deploy-ionic-app-as-a-website/2845/40</a><br />
<br />
Outro cara q fez algo:<br />
<a target="_blank" href="https://github.com/shprink/ionic-cross-platform-boilerplate">https://github.com/shprink/ionic-cross-platform-boilerplate</a><br />
<br />
Mas talvez só dar ionic serve já é o suficiente (configurando pra usar a porta correta e talvez outros pequenos ajustes):<br />
<br />
<br />
<br />
De qualquer forma recomendo fazer uma POC com sua aplicação para validar...<br />
<br />
<br />
Agradeço a <a target="_blank" href="https://br.linkedin.com/in/rangeltorrezan">Rangel Torrezan</a> que me deu a ideia :)<br />
<br />
<br />
Abraço!<br />
Adriano SchmidtAdriano Schmidt - localhost8080http://www.blogger.com/profile/13982054925334438083noreply@blogger.com0tag:blogger.com,1999:blog-5869286196903338900.post-23128784128286629222016-09-09T20:02:00.001-03:002016-09-09T20:02:30.385-03:00Traduzir plugin WordPressOpa..<br />
<br />
Tive que traduzir o plugin UPME e para fazer isso segui esse tutorial:<br />
<br />
<a target="_blank" href="https://premium.wpmudev.org/blog/how-to-translate-a-wordpress-plugin/">https://premium.wpmudev.org/blog/how-to-translate-a-wordpress-plugin/</a><br />
<br />
Basicamente peguei o <b>arquivo .po</b> (no meu caso upme-en_US.po) que fica <b>wp-content/plugins/nomeDoPlugin/l10n</b><br />
<br />
Então fiz uma cópia desse arquivo e renomeei para <b>upme-pt_BR.po</b><br />
<br />
Baixei o <b>PO Edit</b>: <a target="_blank" href="https://poedit.net/download">https://poedit.net/download</a><br />
<br />
E abri o upme-pt_BR.po nesse POEdit...<br />
<br />
Traduzi o que eu precisava... Salvei... e aí gerou um <b>upme-pt_BR.mo</b> (q é o compilado das traduções)<br />
<br />
Então é só jogar o <b>upme-pt_BR.po</b> e <b>upme-pt_BR.mo</b> dentro da pasta <b>wp-content/languages/plugins</b><br />
<br />
Pronto :)<br />
<br />
Abraço!<br />
Adriano SchmidtAdriano Schmidt - localhost8080http://www.blogger.com/profile/13982054925334438083noreply@blogger.com0tag:blogger.com,1999:blog-5869286196903338900.post-50062852134827550722016-09-04T21:21:00.000-03:002016-09-04T21:21:02.999-03:00Validar nome de usuário em PHP com regexOpa,<br />
<br />
Para validar um nome de usuário em PHP basta fazer assim:<br />
<br />
<pre>if (preg_match('/[^a-z.\d]/', 'jose.silva')) {
//invalido
}</pre><br />
aqui só permiti letras minúsculas, ponto final e números.<br />
<br />
Abraço!<br />
Adriano SchmidtAdriano Schmidt - localhost8080http://www.blogger.com/profile/13982054925334438083noreply@blogger.com0tag:blogger.com,1999:blog-5869286196903338900.post-92079260996292655072016-09-04T17:21:00.002-03:002016-09-04T17:21:33.482-03:00Post número 200 :DEsse é meu post número 200 aqui no blog...<br />
<br />
isso é bom? não sei... mas é legal olhar pra trás e ver o quanto de coisa diferente que já fiz nesses quase 7 anos de blog... mas mais legal ainda é de tempos em tempos ler um comentário do tipo "Vaaaaleu cara! Tava o dia inteiro apanhando nesse bug, e teu post me salvou!"<br />
<br />
Esse não é um blog "comercial" onde posto coisas querendo milhões de visualizações... simplesmente vou postando como resolvi alguns problemas que passei... e de vez em quando isso é útil para outras pessoas também... muitas vezes é útil pra mim, pra eu lembrar como fiz resolvi determinado problema hahah<br />
<br />
Com certeza esse não é o melhor de todos os blogs... mas acredito que é o blog com o nome mais legal :D<br />
<br />
<span style="color: red;"><b>S2</b></span> localhost8080.com.br <span style="color: red;"><b>S2</b></span><br />
<br />
E bóra para mais 200 posts \o)<br />
<br />
Abraço!<br />
Adriano SchmidtAdriano Schmidt - localhost8080http://www.blogger.com/profile/13982054925334438083noreply@blogger.com0tag:blogger.com,1999:blog-5869286196903338900.post-33365077924743068762016-09-04T17:03:00.000-03:002016-09-04T17:03:26.675-03:00Wordpress - Como usar um shortcode em um código PHP?Oi, hoje precisei escrever em um código PHP um shortcode do wordpress, algo como:<br />
<br />
<pre>[myshortcode param=value]</pre><br />
Para fazer isso simplesmente usei a function do_shortcode():<br />
<br />
<pre><?php echo do_shortcode("[myshortcode param=value]"); ?></pre><br />
Abraço!<br />
Adriano SchmidtAdriano Schmidt - localhost8080http://www.blogger.com/profile/13982054925334438083noreply@blogger.com0tag:blogger.com,1999:blog-5869286196903338900.post-81860421962681688482016-08-21T19:34:00.001-03:002016-08-21T19:34:53.604-03:00WordPress default user image - Como alterar?Oi,<br />
<br />
Para alterar a imagem default de um novo usuário no WordPress basta seguir esses passos:<br />
<br />
- Acesse o wp-admin<br />
- Acesse "Settings > Discussion" ou em português "Configurações > Discussão"<br />
- No final da tela tem um campo "Avatar padrão"... só trocar.<br />
<br />
Fonte: <a target="_blank" href="https://codex.wordpress.org/How_to_Use_Gravatars_in_WordPress">https://codex.wordpress.org/How_to_Use_Gravatars_in_WordPress</a><br />
<br />
Abraço!<br />
Adriano SchmidtAdriano Schmidt - localhost8080http://www.blogger.com/profile/13982054925334438083noreply@blogger.com0tag:blogger.com,1999:blog-5869286196903338900.post-66966790703204124122016-08-20T22:38:00.000-03:002016-08-20T22:38:52.305-03:00Integrar página do Wordpress com RD StationOpa,<br />
<br />
Hoje tive que integrar com o RD Station um formulário que estava em uma página do WordPress.<br />
<br />
Bom, primeiro tem que gerar o código JS lá no RD Station conforme esse tutorial:<br />
<a target="_blank" href="http://ajuda.rdstation.com.br/hc/pt-br/articles/208726186--Beta-Como-gerar-e-instalar-o-script-de-integra%C3%A7%C3%A3o-de-formul%C3%A1rios-">http://ajuda.rdstation.com.br/hc/pt-br/articles/208726186--Beta-Como-gerar-e-instalar-o-script-de-integra%C3%A7%C3%A3o-de-formul%C3%A1rios-</a><br />
<br />
Depois tem que instalar esse plugin no WordPress para poder inserir código JavaScript dentro de uma determinada página:<br />
<a target="_blank" href="https://wordpress.org/plugins/scripts-n-styles/">https://wordpress.org/plugins/scripts-n-styles/</a><br />
<br />
Agora, no wp-admin, vai na página que tem o formulário<br />
Vá na seção "Scripts n Styles"<br />
Vá no segundo bloco de "Script" pois você quer colocar antes do </body><br />
<br />
E ao invés de colocar o script como o RD gerou:<br />
<br />
<pre><script type="text/javascript" src="<b>URL_DO_JS</b>"></script>
<script type="text/javascript">
var meus_campos = {
'campo1': 'email',
'campo2': 'nome'
};
options = { fieldMapping: meus_campos };
RdIntegration.integrate('<b>ID_GERADO</b>', '<b>NomeDoFormulario</b>', options);
</script></pre><br />
<br />
Altere algumas coisas: retire os <script> e o carregue o JS via JS:<br />
<br />
<pre>var scriptTag = document.createElement('script');
scriptTag.src = '<b>URL_DO_JS</b>';
document.body.appendChild(scriptTag);
scriptTag.onload = function() {
var meus_campos = {
'campo1': 'email',
'campo2': 'nome'
};
options = { fieldMapping: meus_campos };
RdIntegration.integrate('<b>ID_GERADO</b>', '<b>NomeDoFormulario</b>', options);
};</pre><br />
Bom, é isso.<br />
<br />
Abraço!<br />
Adriano SchmidtAdriano Schmidt - localhost8080http://www.blogger.com/profile/13982054925334438083noreply@blogger.com0tag:blogger.com,1999:blog-5869286196903338900.post-30613729185441877962016-08-20T18:45:00.001-03:002016-08-21T15:21:07.762-03:00UPME - Como alterar o tamanho da foto de perfilNo UPME (plugin para perfis no Wordpress, profileplugin.com) você pode alterar o tamanho das imagens do perfil alterando dois lugares.<br />
<br />
Nesse exemplo alterei de 50px para 80px.<br />
<br />
* Adicione, no final do arquivo <b>functions.php</b>, um filtro com a lógica abaixo:<br />
<br />
<pre>add_filter('upme_custom_profile_pic', 'upme_custom_profile_pic');
function upme_custom_profile_pic($profile_pic_display,$params) {
return str_replace('s=50','s=80',$profile_pic_display);
}</pre><br />
<br />
* Mas além disso vc deve alterar o CSS:<br />
<pre>.upme-head .upme-pic .avatar-50 {
width: 80px!important;
height: 80px!important;
}</pre><br />
<br />
Abraço!<br />
Adriano SchmidtAdriano Schmidt - localhost8080http://www.blogger.com/profile/13982054925334438083noreply@blogger.com0tag:blogger.com,1999:blog-5869286196903338900.post-24464755069943552102016-08-08T00:05:00.001-03:002016-08-08T00:05:43.574-03:00Ionic viewOi, hoje vou mostrar como testar sua app ionic com o Ionic View<br />
<br />
Faça login ou cadastre-se no Ionic View:<br />
<a target="_blank" href="https://apps.ionic.io/login">https://apps.ionic.io/login</a><br />
<br />
Após fazer login, crie uma app e anote o id dela<br />
<br />
Vá no seu projeto na sua máquina e altere o ionic.project para ter esse id<br />
<br />
vá no terminal na pasta do seu projeto e digite "ionic upload"<br />
<br />
Digite seu e-mail e senha do Ionic View e pronto :)<br />
<br />
Baixe a app do Ionic View no seu celular e já poderá testar :)<br />
<br />
Abraço!<br />
Adriano SchmidtAdriano Schmidt - localhost8080http://www.blogger.com/profile/13982054925334438083noreply@blogger.com0tag:blogger.com,1999:blog-5869286196903338900.post-92104873931093378942016-08-05T14:36:00.000-03:002016-08-05T14:36:58.274-03:00Uma marteladaOi :)<br /><br />Ouvir seu cliente falando <b>"obrigado, agora eu durmo tranquilo"</b> não tem preço :D<br />
<br />
<br />
<img border="0" height="245" src="https://3.bp.blogspot.com/-4ctqrM-OqYk/V6TNTAczUjI/AAAAAAAAAhg/g3aKBMx5rhcRIRSL7V6zWLpq2n_zPfVDQCLcB/s400/AAEAAQAAAAAAAAgHAAAAJDFlMTg4NWJhLWQyOGMtNDk0Yy1hYTkyLWRiOGNjYjAzM2I0YQ%255B1%255D.jpg" width="400" /><br />
<br />
<br />
Quando eu era pequeno ouvia uma história do cara que cobrou <b>10 mil</b> reais e ficou <b>um mês</b> consertando um navio.... mas n<b>ão resolveu o problema!</b><br />
<br />
<br />
Depois veio outro cara e cobrou <b>100 mil</b> pra ficar <b>uma semana</b> mas também <b>não consertou o navio!</b><br />
<br />
<br />
Por fim veio um cara e <b>resolveu o problema com uma martelada e cobrou 1 milhão</b>... logo reclamaram:<br />
<br />
<blockquote>
<span style="font-size: large;">Como 1 milhão por uma martelada? O outro ficou um mês e cobrou 10 mil</span></blockquote>
<br />
E a resposta foi<br />
<br />
<blockquote>
<span style="font-size: large;">Cobro 1 real pela martelada e 999.999 por saber onde dar a martelada</span></blockquote>
<br />
Quando o cliente me falou <b>"cara, a gnt não ia achar o problema, estávamos culpando tudo menos isso"</b> eu lembrei dessa história...<br />
<br />
<b>a diferença é que não cobrei 1 milhão hahahah</b><br />
<br />
#consultoria #homeofficeAdriano Schmidt - localhost8080http://www.blogger.com/profile/13982054925334438083noreply@blogger.com0tag:blogger.com,1999:blog-5869286196903338900.post-15923843431171813132016-07-16T02:54:00.000-03:002016-07-16T02:54:27.333-03:00Monitorar Ambiente/Infra e JBoss/WildFlySegue uma lista de ferramentas e algumas observações para monitorar ambientes e também servidores de aplicação.<br />
<br />
Já usei quase todas essas ferramentas e sempre estão surgindo novas. Fiz estas anotações rápidas para uma consultoria que dei e acredito que pode ser útil para outras pessoas.<br />
<br />
Para monitorar o ambiente e JBoss/WildFly:<br />
<br />
RHQ<br />
- Para monitoar o JBoss/WildFly<br />
- É da própria Red Hat<br />
- Não é na nuvem, precisa de uma máquina pra ele<br />
- É free<br />
- Não é tão facil de instalar/configurar<br />
<br />
Javamelody<br />
- É free<br />
- É fácil de instalar<br />
<br />
Datadog<br />
- Free até 5 hosts com 1 day retention<br />
- $15 por host com 13 month retention<br />
<br />
NewRelic<br />
- $75USD/month per host<br />
<br />
<br />
Para monitorar infra, máquinas e sistema operacional, pode-se usar umas dessas duas:<br />
Nagios<br />
Zabbix - Cada vez está sendo mais usado<br />
<br />
<br />
Para centralizar logs de várias máquinas em um só lugar:<br />
<br />
Logentries<br />
- Send up to 5GB/month<br />
- 7 day Retention<br />
<br />
Log Stash<br />
- Log stash is an open source tool for collecting, parsing, and storing logs for future use<br />
- Kibana 3 is a web interface that can be used to search and view the logs that Logstash has indexed.<br />
- Both of these tools are based on Elasticsearch. <br />
- Elasticsearch, Logstash, and Kibana, when used together is known as an ELK stack.<br />
<br />
<br />
<br />
Lembrando que se precisar dou consultorias nesse assunto e também em questões como performance, arquitetura, integração contínua, montagem de ambientes com load balancer e cluster, etc... Só entrar em contato: adriano@localhost8080.com.br<br />
<br />
<br />
Agradeço ao <a target="_blank" href="https://br.linkedin.com/in/vinifritzen/en">Vinícius Fritzen</a> que já utilizou várias destas ferramentas e me ajudou quando eu estava fazendo essa pesquisa.<br />
<br />
<br />
Abraço!<br />
Adriano Schmidt<br />
adriano@localhost8080.com.brAdriano Schmidt - localhost8080http://www.blogger.com/profile/13982054925334438083noreply@blogger.com0tag:blogger.com,1999:blog-5869286196903338900.post-57650055240987833972016-07-16T00:59:00.001-03:002016-07-16T02:06:07.477-03:00How to install Ionic on MacGo to <a target="_blank" href="http://nodejs.org/en">http://nodejs.org/en</a><br />
Download the npm<br />
Install the npm<br />
<br />
Go to terminal and type the following command in order to test the installation<br />
$ npm version<br />
<br />
Now, type in the terminal the following commands in order to install cordova and ionic<br />
$ sudo su (probably you will need to type your password)<br />
$ npm install -g cordova ionic<br />
$ npm install -g bower<br />
$ npm install -g ios-sim<br />
$ exit<br />
$ ionic version (if a popup shows up asking for installing something, say yes)<br />
<br />
if you already have an ionic project, go to the folder project, or create a new project:<br />
<br />
$ ionic start myApp tabs<br />
<br />
Go to the folder project and run these commands:<br />
$ bower update<br />
$ npm install<br />
$ ionic platform add ios<br />
$ ionic build ios<br />
$ ionic emulate ios<br />
<br />
That's it :)<br />
Adriano SchmidtAdriano Schmidt - localhost8080http://www.blogger.com/profile/13982054925334438083noreply@blogger.com0tag:blogger.com,1999:blog-5869286196903338900.post-5092387608567241662016-07-10T15:48:00.000-03:002016-07-10T15:51:36.060-03:00WordPress - User registration is currently not allowedHi there :)<br />
<br />
When you get the message "User registration is currently not allowed" in your WordPress plataform, and you want to allow anyone to register on your site/blog, you should go to "WP-admin > Settings > General" and check "Anyone can register".<br />
<br />
<img border="0" src="https://3.bp.blogspot.com/-7clahbXf8yk/V4KYI4RPiLI/AAAAAAAAAhQ/n1k3hHG0Bn4k492dNsm01I4pD1A9H8DwwCLcB/s320/wordpress.JPG" width="320" height="197" /><br />
<br />
Best regards,<br />
Adriano SchmidtAdriano Schmidt - localhost8080http://www.blogger.com/profile/13982054925334438083noreply@blogger.com0tag:blogger.com,1999:blog-5869286196903338900.post-79572703827188332932016-07-01T18:22:00.001-03:002016-07-01T18:22:15.296-03:00How to use Font Awesome in Photoshop or Illustrator?First of all, download the font on <a target="_blank" href="http://fontawesome.io/">http://fontawesome.io/</a><br />
<br />
Install the file FontAwesome.otf normally.<br />
<br />
Go to Photoshop or Illustrator.<br />
<br />
Insert a text field and change the font-family to Font Awesome<br />
<br />
Go to <a target="_blank" href="http://fontawesome.io/cheatsheet/">http://fontawesome.io/cheatsheet/</a><br />
<br />
Copy the icon that you want to use and paste it in your text field in Photoshop/Illustrator.<br />
<br />
You can use this plugin as well: <a target="_blank" href="http://creativedo.co/FontAwesomePS">http://creativedo.co/FontAwesomePS</a><br />
<br />
Best regards,<br />
Adriano SchmidtAdriano Schmidt - localhost8080http://www.blogger.com/profile/13982054925334438083noreply@blogger.com0tag:blogger.com,1999:blog-5869286196903338900.post-78202038904865552082016-06-30T21:52:00.000-03:002016-06-30T21:52:16.526-03:00BitBucket - Authentication failedI got this error trying to run the "git pull" command in a project on BitBucket:<br />
<br />
C:\work\Dropbox\workspaces\ws-ionic\myapp>git pull<br />
Password for 'https://adrianoschmidt@bitbucket.org':<br />
remote: Invalid username or password. If you log in via a third party service you must ensure you have an account password set in your account profile.<br />
fatal: Authentication failed for 'https://adrianoschmidt@bitbucket.org/myuser/myapp.git/'<br />
<br />
In order to solve this problem I've accessed https://id.atlassian.com/login and I've clicked on "Forgot your password?"<br />
<br />
After resetting my password, everything started to work normally again :D<br />
<br />
Best regards,<br />
Adriano SchmidtAdriano Schmidt - localhost8080http://www.blogger.com/profile/13982054925334438083noreply@blogger.com0tag:blogger.com,1999:blog-5869286196903338900.post-79328890271537461982016-06-28T23:53:00.003-03:002016-06-30T04:18:52.939-03:00Como mudar o lugar das informações do autor no Wordpress?Oi...<br />
<br />
Em um blog que estou trabalhando, o autor do post aparecia beeem lá em baixo, no fim do post.<br />
<br />
Para dar mais visibilidade ao autor... eu coloquei ele no lado do texto...<br />
<br />
Bom, isso vai depender de cada tema, mas o que eu fiz foi esconder a caixa original:<br />
<br />
<pre>/* escondendo a caixa de informacoes do autor, pois sera usada outra */
#content .post_content .post-author {
display: none!important;
visibility: hidden!important;
}</pre><br />
Talvez seja um pouco diferente par você, mas a ideia é essa ali.<br />
<br />
E para eu exibir as informações do autor no lado do texto, no meu template tinha um widget onde eu podia colocar HTML.<br />
Então eu instalei o plugin Author Bio Shortcode:<br />
<a href="https://br.wordpress.org/plugins/author-bio-shortcode/installation/" target="_blank">https://br.wordpress.org/plugins/author-bio-shortcode/installation/</a><br />
<br />
E no Widget eu botei isso:<br />
<pre>[author_bio name="yes" avatar="yes" ]</pre><br />
Além disso, criei esse CSS:<br />
<br />
<pre>/* alterando o estilo do novo box de informacoes do autor, na pagina de post de blog */
.author_bio_shortcode .avatar img {
float: left;
margin: 5px 10px 0px 10px;
border-radius: 150px;
border: 2px solid #981258;
height: 96px;
width: 96px;
}</pre><br />
Mas quando é celular, esse widget vai lá pra baixo... então fiz um menorzinho para celular...<br />
<br />
Para isso editei o código fonte do tema, alterei o "Post único (single.php)" e adicionei o código abaixo antes do início do conteudo:<br />
<br />
<pre><div class="author-info-mobile">
<?php echo get_avatar( get_the_author_meta( 'ID' ), 40 ); ?>
Por <?php the_author_link()?>
</div></pre><br />
E adicionei o CSS abaixo para customizar o estilo e para só aparecer em celulares e tablets:<br />
<br />
<pre>/* estilo do nome do autor para mobile, na pagina de post de blog */
@media (min-width: 768px) {
.author-info-mobile {
display: none;
visibility: hidden;
}
}
.author-info-mobile {
margin-left: 11px;
font-size: 14px;
color: white;
}
.author-info-mobile img {
border-radius: 150px;
border: 2px solid #981258;
margin-right: 5px;
height: 40px;
width: 40px;
}</pre><br />
Provavelmente pra vc vai ser um pouco diferente... mas a ideia é essa aí :D<br />
<br />
<br />
---------------------------<br />
<br />
Depois que escrevi o post, precisei achar um plugin pra poder colocar fotos pra cada usuário (para que o próprio usuário ou o admin setasse uma foto para o usuário, por padrão pega do gravatar).<br />
<br />
Usei esse plugin:<br />
<a href="https://wordpress.org/plugins/user-photo/" target="_blank">https://wordpress.org/plugins/user-photo/</a><br />
<br />
Em configurações > User Photo vc pode mexer nas configurações se quiser.<br />
<br />
Pra usar só tem q chamar userphoto_the_author_thumbnail() q vem a foto... mas no meu widget não dava pra colocar código PHP.<br />
<br />
Então tive que instalar esse plugin para ter um widget q eu pudesse colocar código PHP:<br />
<a href="https://wordpress.org/plugins/php-code-widget/">https://wordpress.org/plugins/php-code-widget/</a><br />
<br />
E montei tudo na mão:<br />
<br />
<pre><div class="author_bio_shortcode">
<div class="avatar">
<?php userphoto_the_author_thumbnail() ?>
<h3 class="name"><?php the_author()?></h3>
<div class="bio"><p>
<?php the_author_description() ?>
Para saber mais: <?php the_author_link()?>
</p>
</div>
</div></pre><br />
E no single-post ao invés de usar<br />
<pre>echo get_avatar( get_the_author_meta( 'ID' ), 40 );</pre>eu usei<br />
<pre>userphoto_the_author_thumbnail()</pre><br />
Abraço!<br />
Adriano SchmidtAdriano Schmidt - localhost8080http://www.blogger.com/profile/13982054925334438083noreply@blogger.com0