pátek 30. října 2015

Výměna žárovky předního světla Peugeot 207

Deset minut


  1. Otevřít motor
  2. Sundat gumové víčko žárovek
  3. Uvolnit pružinu. A úplně ji vyndat. Přes kabely se pak líp vytahuje žárovka
  4. Šroubovákem opatrně odpáčit konektor. (rukou to jde dost blbě)
  5. Vyměnit žárovku čurapajzlíkem nahoru
  6. Nacvaknout pružinku a zajistit žárovku
  7. Připojit konektor černý drátek nahoru k čurapajzlíku na žárovce.
  8. Vyzkoušet světla
  9. Vrátit zpátky gumové víčko žárovek
  10. Zavřít motor


čtvrtek 29. října 2015

Jak v systému nastavit akci po kliku na mailto: odkaz a jak ho správně vytvořit

Nastavení systému

Aby reagoval na kliknutí na odkaz protokolu mailto:, se dá ve Win8 nastavit v:
Ovládací panely / Programy / Výchozí programy / Otevírat určený typy souborů vždy pomocí konkrétního programu
Na konci seznamu je část protokoly kde najdete položku s názvem MAILTO
dvojklikem můžete zvolit jinou aplikaci.

Zdroj:
http://www.nextofwindows.com/how-to-change-default-mailto-behavior-in-windows-8

Jak správně sestavit link

  • Pokud URL bude obsahovat mezery tak nebude správně fungovat.
  • Pokud nahradíte mezery znakem '+' promítne se Vám například do těla e-mailu
  • Je zapotřebí zakódovat URL pomocí HTML entit a nahradit tak např. mezery za %20
Příklad:
<a href="mailto:prijemce@example.com?subject=Ahoj%20Jak%20Se%20Mas&body=Kouknmi%20se%20na%20Web%20http%3A%2F%2Fwww.verebro.com%2F.">Share Link By Email</a>

Zdroje:

čtvrtek 15. října 2015

Přístup k privátním property


using Microsoft.VisualStudio.TestTools.UnitTesting;
var po = new PrivateObject(client);
var password = po.GetFieldOrProperty("password").ToString();
var result = po.Invoke("privateMethodName", new { argument = "jmeno" });
po.Invoke()
Assert.AreEqual("TajneHeslo", password);
Assert.AreEqual("vysledek Metody", result);

mailchimp.com vs. 10minutemail.com

Potřeboval jsem vyzkoušet jak funguje MailChimp tak jsem si založil e-mail na deset minut na 10minutemail.com ale kucí v MailChimpu to mají pod kontrolou a odesílání pozastaví a pěkně si na právě založený účet posvítí ;)

We've temporarily stopped sending for a quick human review.
Our automated abuse prevention system, Omnivore, has detected either a prohibited action (such as having multiple accounts, sending unsolicited email) or prohibited content that conflicts with our acceptable use policy.
For more information regarding prohibited actions and prohibited content please review our acceptable use policy in full.
Takže velké odesílání se nekoná. Bodejť by ne, máte totiž možnost poslat 12,000 zpráv na  2,000 e-mailových adres. A to vše úplně zdarma. Teda ne zdarma, ale za vaši platnou e-mailovou adresu.

MailChimp

Struktura MailChimpu je tvořena:
Lists - seznamy E-mailových adres. Prostřednictvím API ale není možné je zakládat a musíte do správy účtu ručně.
InterestGrouping - Adresy z listu je možné dělit do skupin zájmu. Pokud přidáte uživatele do seznamu, může mu být odeslán e-mail ve kterém si zvolí které skupiny ho zajímají. Můžete nastavit jestli může vybrat pouze jednu nebo i několik.

API

Aby jste mohli komunikovat s MailChimp pomocí API musíte si nechat zdarma vygenerovat API klíč ve tvaru 22fcac64f0f90ff4960d88bcc8ee2602-us11
us11 na konci je identifikace datacentra se kterým máte povoleno komunikovat. od toho se potom odvíjí URL adresa kam budete směřovat požadavky https://us11.api.mailchimp.com/3.0/

Na Nuget_u je k dispozici balíček (install-package MailChimp.NET) s MailChimpManager_em
tahle knihovna vám ušetří spoustu práce s implementací vlastní komunikace se servrem prostřednictvím REST API.
GitHub projektu je například zde https://github.com/danesparza/MailChimp.NET/blob/master/MailChimp/MailChimpManager.cs

středa 14. října 2015

Postup zpracování zakázky

Opchodník vs. Zákazník
Zjištění požadavků zákazníka na implementovaný systém.
Výsledkem je podepsání smlouvy zpracované právníkem za cca 5-7tic. (Ta první. Pro dalšího použijete pravděpodobně tu stejnou)

Zákazník vs. Analytik
Zákazník nastíní Analytikovi požadavky na poptávaný systém.
Analytik rozpracuje požadavky tak aby jim archytekt mohl dobře porozumět. Vytvoří minimální řešení které bude zákazníkovi k užitku a vyčlení části které jsou zbytečné nebo složité. (Dokonalý systém je ten ze kterého nejde nic odebrat.)

Analytik  vs. Architekt
Analytik od Architekta obdrží zadání které rozpracuje do UML a návrhových vzorů. Podle tohoto návrhu vytvoří rozpočet podle historycké znalosti jak dlouho týmu trvá jednotlivé stavební bloky (Tabulka, datová vrstva, repository, Controller, page, ...) vytvořit.
Analytik si s klientem potvrdí rozsah prací a podepíše smlouvu která obsahuje jak rozpočet tak rozsah prací.

Architekt vs. Scrum Team
Architekt po schválení realizace projektu přednese požadavky na řešení Scrum Teamu který je poté realizuje

Freelancer
Pokud pracuješ na volné noze je to trošku paranojidní být Analytik, Architekt, Scrum master a Developer v jednom. Ale má to i své kouzlo

pondělí 12. října 2015

MS SQL vs. MySQL



Sloupec v MySQL který povoluje ukládat jen hodnoty z výčtu

[mycol] set('1','2','3','4','5','6') default NULL,


Alternativní zápis pro MS SQL který umožňuje také pouze hodnoty z výčtu

Create table [enum_tbl] (
[enum_nr] tinyint NOT NULL CHECK (enum_nr IN('1','2','3','4','5','6','7','8','9','10'))
)

Create table [enum_tbl2] (
[enum_nr] tinyint NULL CHECK (enum_nr IN('1','2','3','4','5','6','7','8','9','10'))
)


Problém při přepisu aplikace z MySQL na MS SQL je v tom že pokud používáte UTF-8
tak každá stringová hodnota pro MS SQL musí obsahovat prefix N'hodnota'.
Čimž se trochu komplikuje vytváření SQL příkazů.


REPLACE

'collate utf8_bin'  => ''
'int(11)' => 'int'
'varchar' => 'nvarchar'
'unsigned' =>''
'auto_increment' => 'IDENTITY(1,1)'

PHP 
'<?' => '<?php'
sqlsrv_query($objConn, $strQueryIN, $params)

NumRows
$options =  array( "Scrollable" => SQLSRV_CURSOR_KEYSET );
$stmt = sqlsrv_query( $objConn, $strQueryIN, $params, $options);

Dotaz je potřeba volat s Options = Scrolable, aby bylo možné použít sql_num_rows

mysql_num_rows($result) =>

 if( sqlsrv_fetch( $result ) === false) {
     die( print_r( sqlsrv_errors(), true));
  }
    $REcount = sqlsrv_num_rows($result) !== false
? sqlsrv_get_field($result, 0)
: 0;


FetchArray
mysql_fetch_assoc($result) => sqlsrv_fetch_array($result, SQLSRV_FETCH_ASSOC)

Result
mysql_result($result, 0) => sqlsrv_get_field($result, 0)

if(sqlsrv_num_rows($result)===false) {

if ($REcount!==false)


Last Insert ID
mysql_insert_id() => mssql_insert_id()

 function mssql_insert_id() {
    $id = 0;
    $res = MSSQLQuery($conn, "SELECT @@identity AS id");
    if ($row = mssql_fetch_array($res, MSSQL_ASSOC)) {
        $id = $row["id"];
    }
    return $id;
  }


mysql_real_escape_string

function mssql_escape($str)
{
    if(get_magic_quotes_gpc())
    {
        $str= stripslashes($str);
    }
    return str_replace("'", "''", $str);
}

Zdroje:
http://php.net/manual/en/intro.mssql.php
http://stackoverflow.com/questions/1434298/sql-server-equivalent-to-mysql-enum-data-type
http://dev.mysql.com/doc/refman/5.0/en/set.html
http://stackoverflow.com/questions/12880567/equivalent-of-mysql-insert-id-for-ms-sql-server
http://stackoverflow.com/questions/2146546/mysql-real-escape-string-alternative-for-sql-server
http://php.net/manual/en/function.sqlsrv-fetch-array.php
http://php.net/manual/en/function.sqlsrv-num-rows.php
http://php.net/manual/en/function.sqlsrv-get-field.php


čtvrtek 8. října 2015

Repository TestCase

Testovací scénáře pro Repository
Repository má klasicky 4 operace - vytvoření, načtení, upravení a smazání. Každou z nich ale musíme otestovat na minimálně dvě krajní situace abychom si ověřili chování v těchto případech. Úspěšné vrácení záznamu po jeho načtení z DB nebo selhání a vyhození vyjímky při pokusu smazat záznam, který je zamčený, nebo na něj uživatel nemá práva.

Každé vytvoření, nebo úprava záznamu má ale určité pravidla pro validaci záznamu, které je možné do databáze uložit. Například délky textových řetězců, povinnost vyplnit některý údaj (not null), formát datumu, číselné datové typy, atp. To nám počet scénářů navyšuje.

Výhodou ale může být použití DataDriven Testů, kdy se jednomu testu předává více testovacíh hodnot. Tímto můžeme pokrýt jedním testem velké množství scénářů testování krajích hodnot.

Kupříkladu entita  musí mít vyplně:
  • datum vytvoření
  • id uživatele který ji založil
  • potom typ záznamu musí být jedna ze dvou variant
  • a pokud odpovídá variantě 1 tak musí být vyplněna ještě poznámka
Create - Vytvoření záznamu
  • Záznam se podaří vytvořit
  • Záznam se vytvořit nepodařilo
Find - nalezne záznam podle primárního klíče
  • Záznam se podaří nalézt
  • Záznam se nalézt nepodařilo
GetAll - Získá z databáze všechny záznamy
  • V kolekci není žádný záznam
  • Podařilo se získat alespoň jeden záznam
  • Načítání se nezdařilo např. Chyba spojení s DB
Search - Získá z databáze všechny zázanamy které vyhovují podmínce
  • Nebylo nic nalezeno
  • Nalezne alespoň jeden záznam
  • Vyhledávání selhalo
Update - akualizace záznamu
  • Update záznamu se povede
  • Update se nepovede
Delete - smazání záznamu
  • Delete se povede 
  • Delete se nepovede (např. záznam byl již smazán, uživatel nemá práva k záznamu)
Pokud vezmeme 20 testovacích scénářů a budeme počítat 30 minut na implementaci jednoho dostáváme se na čas 10 hodin na implementaci testů. Jak dlouho by trvalo vašemu testerovi tuto funkčnost otestovat v hotové aplikaci?

Přenos dat z XFS do NTFS

Před několika lety jsem si koupil NAS od ZYXELu. Funguje v pořádku už několik let. Při experimentech jsem ale několikrát navodil situaci kdy jsem se nebyl schopný k souborům na disku dostat. Naštěstí existuje aplikace kterou se na disk dostanete i z Windows. http://www.ufsexplorer.com/download.php Je možné ji vyzkoušet bezplatně ale kopírovat můžete pouze soubory do velikosti myslím že pouze 500 kB. Což nestačí ani na záchranu fotek. Takže jsem si musel koupit licenci. Kdyby tedy někdo chtěl stahnout data z jeho XFS disku tak se klidně ozvěte :)

Povolení FileStream na MS SQL

Je potřeba zapsat tento script a spustit ho

EXEC sp_configure filestream_access_level, 2

RECONFIGURE
Nastavení pomocí SQL Server Configuration Manager_u nezabralo ani po restartu serveru