sábado, fevereiro 13, 2016

SMO - Server Management Objects

SMO - Server Management Objects é uma blibioteca de objectos ou API escrita em cima do .NET Framework que permite gerir e automatizar algumas tarefas nos servidores de SQL.

Usando o PowerShell, podemos iniciar um script que permite com um conjunto reduzido de comandos obter informação que de outra forma seriam necessárias centenas de linhas (e.g. T-SQL).

$MyServerInstance='ServerInstance'#The SQL Server instance
[System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.SMO')  | out-null
$Server = new-object ('Microsoft.SqlServer.Management.Smo.Server') $MyServerInstance
$Server


















Link: http://www.sqlservercentral.com/articles/SMO/140966/

segunda-feira, janeiro 04, 2016

MSSQL Queries Productivity

Seguem em baixo um conjunto de 15 queries bastante uteis:


  • Hostname, edition and version number SQL Server
SELECT SERVERPROPERTY('MachineName') as Host, SERVERPROPERTY('InstanceName') as Instance, @@VERSION as "Version Number", SERVERPROPERTY('Edition') as Edition, SERVERPROPERTY('ProductLevel') as ProductLevel, Case SERVERPROPERTY('IsClustered') when 1 then 'CLUSTERED' else 'STAND ALONE' end as "Server Type"
  •  Número de tabelas numa base de dados
SELECT COUNT(OBJ.ID) as "Table Count" FROM SYSOBJECTS OBJ WHERE XTYPE='U'
  •  Número de Stored Procedures numa base de dados
SELECT COUNT(OBJ.ID) as "SP Count" FROM SYSOBJECTS OBJ WHERE XTYPE='P'
  • Lista de tabela com contador de registos
SELECT OBJ.NAME as "Table Name", MAX(SI.ROWS) as "Row Count" FROM SYSOBJECTS OBJ, SYSINDEXES SI WHERE OBJ.XTYPE = 'U' AND SI.ID = OBJECT_ID(OBJ.NAME) GROUP BY OBJ.NAME ORDER BY 2 DESC
  • Mostra data de criação e modificação de tabelas
SELECT NAME as "Table Name", CREATE_DATE as "Created Date",
MODIFY_DATE as "Modified Date" FROM SYS.OBJECTS
WHERE TYPE = 'U' --AND NAME LIKE '%sys_%' ORDER BY 3 DESC 
  • Mostra data de criação e mdificação de stored procedures
SELECT NAME as "SP Name", CREATE_DATE as "Created Date",
MODIFY_DATE as "Modified Date" FROM SYS.OBJECTS
WHERE TYPE = 'P' --AND NAME LIKE '%delete%' ORDER BY 3 DESC
  • Procura lista de tabelas com determinado nome de coluna
SELECT s.[NAME] 'Schema', t.[NAME] 'Table', c.[NAME] 'Column', d.[NAME] 'Data Type', d.[MAX_LENGTH] 'Max Length', c.[IS_IDENTITY] 'Is Id',
c.[IS_NULLABLE] 'Is Nullable', t.[MODIFY_DATE] 'Date Modified', t.[CREATE_DATE] 'Date created' FROM SYS.SCHEMAS s INNER JOIN SYS.TABLES t ON s.SCHEMA_ID= t.SCHEMA_ID INNER JOIN SYS.COLUMNS c ON t.OBJECT_ID= c.OBJECT_ID INNER JOIN SYS.TYPES d ON c.USER_TYPE_ID= d.USER_TYPE_ID WHERE c.NAME like '%backup%
  • Procura uma lista de objectos que contem um determinado texto
SELECT o.NAME FROM SYSCOMMENTS (nolock) AS c INNER JOIN SYSOBJECTS (nolock) AS o ON c.ID = o.id WHERE c.TEXT LIKE '%BACKUP%';
  • Obtém localização fisica da base de dados
SELECT   DB_NAME(DATABASE_ID) as DatabaseName, NAME, TYPE_DESC,
PHYSICAL_NAME FROM SYS.MASTER_FILES
  • Obtém o login com previlegios de administrador
SELECT l.NAME, l.DENYLOGIN, l.ISNTNAME, l.ISNTGROUP, l.ISNTUSER
FROM MASTER.DBO.SYSLOGINS l WHERE l.SYSADMIN = 1 OR l.SECURITYADMIN = 1
  • Obtém o resultado do ultimo backup efetuado à base de dados
SELECT db.NAME, CASE WHEN MAX(b.backup_finish_date) IS NULL THEN 'No Backup' ELSE convert(varchar(100), MAX(b.BACKUP_FINISH_DATE)) END AS last_backup_finish_date FROM SYS.DATABASES db LEFT OUTER JOIN MSDB.DBO.BACKUPSET b ON db.NAME = b.DATABASE_NAME AND b.TYPE = 'D' WHERE db.DATABASE_ID NOT IN (2) GROUP BY db.NAME ORDER BY 2 DESC
  • Obtém a lista de queries com leitura mais intensiva (READS)
SELECT TOP 50 SUBSTRING(QT.TEXT, (QS.STATEMENT_START_OFFSET/2) +1, ((CASE QS.STATEMENT_END_OFFSET WHEN -1 THEN (QT.TEXT) ELSE QS.STATEMENT_END_OFFSET
END - QS.STATEMENT_START_OFFSET)/2)+1), QS.EXECUTION_COUNT,
QS.TOTAL_LOGICAL_READS, QS.TOTAL_ELAPSED_TIME,
QS.LAST_ELAPSED_TIME, QS.MIN_ELAPSED_TIME, QS.MAX_ELAPSED_TIME, QS.LAST_EXECUTION_TIME, QP.QUERY_PLAN
FROM SYS.DM_EXEC_QUERY_STATS QS CROSS APPLY SYS.DM_EXEC_SQL_TEXT(QS.SQL_HANDLE) QT CROSS APPLY SYS.DM_EXEC_QUERY_PLAN(QS.PLAN_HANDLE) QP WHERE QT.ENCRYPTED=0 ORDER BY QS.TOTAL_LOGICAL_READS DESC, QS.TOTAL_ELAPSED_TIME DESC
  • Obtém utilizador atual, processos bloqueados, memória, etc
sp_who2
  • Lista os índices das tabelas
SELECT A.NAME TABLE_NAME, B.NAME INDEX_NAME, D.NAME COLUMN_NAME FROM SYS.TABLES A, SYS.INDEXES B, SYS.INDEX_COLUMNS C, SYS.COLUMNS D WHERE A.OBJECT_ID = B.OBJECT_ID AND B.OBJECT_ID = C.OBJECT_ID AND B.INDEX_ID = C.INDEX_ID AND C.OBJECT_ID = D.OBJECT_ID AND C.COLUMN_ID = D.COLUMN_ID --AND A.NAME LIKE '%BACKUP%';
  • Obtém tamanho da base de dados e do log
WITH FS AS (SELECT DATABASE_ID, TYPE, SIZE * 8.0 / 1024 SIZE
FROM SYS.MASTER_FILES) SELECT NAME, (SELECT SUM(SIZE) FROM FS WHERE TYPE = 0 AND FS.DATABASE_ID = DB.DATABASE_ID) DATAFILESIZEMB, (SELECT SUM(SIZE) FROM FS WHERE TYPE = 1 AND FS.DATABASE_ID = DB.DATABASE_ID) LOGFILESIZEMB FROM SYS.DATABASES DB

Para saber mais consultar;

http://www.infobarrel.com/15_Sql_Server_Queries

domingo, dezembro 27, 2015

Linux Ubuntu 14.04 - Error displaying connection information: No valid active connections found!

O ubuntu permite a gestão de interfaces de rede por linha de comandos e por meio de applets específicos do gestor de janelas (e.g. unity).

No meu caso, o applet "Network Manager" nm-applet  está configurado pelo desktop applet. No entanto o mesmo apresentava problemas com erro na obtenção da configuração da rede.

Isto acontecia porque os ficheiros de configuração não definidos no /etc/network/interfaces mas sim no
/etc/NetworkManager
/etc/NetworkManager/system-connections
Como tinha os interface definidos como ETH0 auto no ficheiro de interfaces em /etc/interfaces, este "Network Manager" applet não geria a rede e não se responsabilizada pelo device.

Verificar o link:
https://bugs.launchpad.net/ubuntu/+source/network-manager-applet/+bug/305606


domingo, outubro 18, 2015

Aceder remotamente ao Ubuntu pelo RDP (3389) do windows

Para aceder remotamente ao desktop do Ubuntu com o remote desktop do windows, deveremos instalar o xrdp.

  • sudo apt-get install xrdp
  • Criar conta para acesso 
  • Criar .xsession na home do utilizador criado anteriormente
Importante:
O Ubuntu 14.04 no ambiente desktop, o RDP do windows não funciona com o window manager que não seja o XFCE4.

Para isso deveremos instalar o xfce4:
  • sudo apt-get install xfce4
De seguida incluir na .xsession do utilizador o seguinte:
  • xfce4-session
Outro aspeto importante é a necessidade de abrir a porta na firewall do Ubuntu UFW ou no GUI GUFW.

sábado, outubro 17, 2015

Apache2 + Webserver + Owncloud armazenamento

Criar uma forma de acesso aos dados multidispositivo e multiplataforma com a solução Ubuntu+Apache2+Owncloud.

Pré-requisitos:

Uma máquina com Ubuntu 14 LTS;
Espaço em disco
Uma conta DDNS
Uma conta Cloudflare


Instalar os seguintes módulos:

  • php5 (>= 5.4)
  • PHP module ctype
  • PHP module dom
  • PHP module GD
  • PHP module iconv
  • PHP module JSON
  • PHP module libxml
  • PHP module mb multibyte
  • PHP module posix
  • PHP module SimpleXML
  • PHP module XMLWriter
  • PHP module zip
  • PHP module zlib

apt-get install apache2 mariadb-server libapache2-mod-php5
apt-get install php5-gd php5-json php5-mysql php5-curl
apt-get install php5-intl php5-mcrypt php5-imagick
Seguir instruções em https://doc.owncloud.org/server/8.1/admin_manual/installation/source_installation.html
O serviço Cloudflare permite protege e acelera o website.
Defenir em cloudflare a representatividade do dominio, parametrizando os NS do dominio com os da cloudflare.
De seguida criar CNAME que aponta para DDNS. 
Definir em SSL-AVAILABLE do apache2 o servidor web para https.
parametrizar em cloudflare o crypt para apontar para o endereço correto.

quarta-feira, junho 10, 2015

Setup Eclipse IDE with Android ADT+SDK

Para começar a desenvolver aplicações android, existem hoje diversas soluções. Aqui vou mostrar como preparar o ambiente de desenvolvimento Android com o IDE Eclipse (Luna).

Para iniciar deveremos preparar o ambiente de trabalho com as seguintes ferramentas:

  1. Elipse IDE
    1. Versão que escolhi foi a Eclipse IDE for Java Developers
  2. Android SDK
  3. Plugin ADT (Android Development Tools)
Para se proceder à instalação do Eclipse IDE,deveremos ir à página oficial e efetuar o download do IDE.
A instalação em ambiente Windows não é automática. Deveremos descomprimir o ficeiro numa localização da nossa escolha. Ter o cuidado de efetuar o download na versão 32/64 conforme a versão do nosso sistema operativo.

Ter em atenção que deveremos instalar o SDK do Android.
  • Visitar a página de download do SDK Android (http://developer.android.com/sdk/index.html)
  • Ir até ao fundo da página e carregar em "Download the SDK Tools";
Picture of Install the Android SDK

Após instalação, abrir o aplicativo SDKManager.exe e instalar a versão do Android e as ferramentas extra.
Picture of Install Android Version and Extras for SDK

Para a definição do Eclipse, efetuar os seguintes passos:
Após encontrarmos o executável do eclipse, podemos criar um atalho no nosso ambiente de trabalho.

Para que o ambiente IDE do eclipse esteja pronto para trabalharmos com o framework do Android, deveremos efetuar alguns passos, nomeadamente a atualização do mesmo.

Picture of Add ADT Plugin Repository 
O plugin ADT foi feito especificamente para o Eclipse para aumentar a produtividade e o nível de integração com o ambiente de desenvolvimento Android.
Para o adicionar deveremos ir ao menu Help->Install new software.
  • Clicar no botão Add...e uma nova janela vai aparecer;
  • Deveremos dar um nome ao repositório (e.g. ADT REPO);
  • Colocar o link http://dl-ssl.google.com/android/eclipse/
  • Clicar Ok...;
Após a instalação dos pacotes necessários, devermos reiniciar a aplicação. Ao iniciarmos a aplicação, ir a Window-> Preferences->Android. Verificar se o caminho para o SDK do android está definido.

TroubleShooting

A instalação pode não ter sucesso, nomeadamente no arranque do Eclipse ou na instalação do ADT. Este é um excelente troubleshoot para ter em atenção:

http://www.ashout.com/fix-java-started-returned-exit-code13-eclipse/

sábado, maio 09, 2015

ASP:NET MVC Programming Model

O MVC é um de três modelos de programação ASP.NET.

  1. Web forms
  2. MVC
  3. Web Pages

MVC é uma framework de desenvolvimento Web usando o padrão de arquitetura MVC (Model-View-Controller).

Este modelo providencia um controlo quase absoluto sobre CSS, HTML e Javascript.
MVC
São definidas 3 camadas lógicas.


  • Business Layer (Model logic);
  • Display layer (View logic);
  • Imput layer (Controller logic);

Model - É a parte da aplicação que trata da lógica dos dados. Os objectos definidos são resposnaveis por carregar e armazenar os dados de uma base de dados.
View - É a parte da aplicação que trata da visualização dos dados. As views são criada muitas vezes do dados carregados do Model.
Controller - É a parte que trata da interacção dos dados com o utilizador. Os controllers lêm dados da view, controlam os inputs e enviam os dados para o Model.

Esta separação MVC pode auxiliar no desenvolvimento de aplicações complexas porque podemos focar-nos em cada um dos aspetos separadamente. Para além disto o desenvolvimento em grupo pode ficar mais simples com elementos a focarem-se na View e outros no Controller.

Application Folders

Uma aplicação WEB típica MVC tem normalmente as seguintes pastas:

Solution

Application information

Properties
References

Application folders

App_Data Folder - Esta pasta existe para serem armazenados os dados da aplicação. (e.g.Dados BD SQL)
Content Folder - Local para armazenar as páginas estáticas tais como ficheiros CSS, icones e imagens.
Controllers Folder - Local que contém as classes controller responsaveis pelo tratamento dos inputs.É obrigatório que cada classe deste género temine em Controller.
Models Folder
Scripts Folder
Views Folder

Configuration files

Global.asax
packages.config
Web.config