poniedziałek, 11 marca 2019

How to build a maven JAX-RS project (to WAR) without web.xml

In the standard way the build process of the JAX-RS maven project will throw an error like:

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-war-plugin:2.2:war (default-war) on project rest: Error assembling WAR: webxml attribute is required (or pre-existing WEB-INF/web.xml if executing in update mode)
To run the build properly you simply need to add the following section to the pom.xml:



środa, 3 lutego 2016

WebDav - nie zapamiętuje poświadczeń / hasła na systemach od Windows 7 do 8.1

Zamapowaliście lokalizację sieciowa w oparciu o WebDav. Wpisaliście wasze poświadczenia, ale po przelogowaniu Windows już ich nie pamięta. Brak Wam sposobu, by zapamiętywanie działało, a "remember credentials" wydaje się być ignorowany. Rozwiazanie jest dość proste, choć trudno znależć je na sieci. Żeby zbędnie nie rozpisywać: 1. należy dodać do rejestru klucz w lokalizacji

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WebClient\Parameters

2. W lokalizacji dodajemy nowy klucz, o typie wartośći REG_MULTI_SZ

AuthForwardServerList

3. W wartościach klucza dodajemy url'e ogólne domeny, w której znajduje się nasza mapowana lokalizacja, np:

https://*.domena.local
http://*.domena.local
*.domena.local

Restart WebClient, a najlepiej reboot maszyny. Od tej chwili WebClient będzie wysyłał poświadczenia w ramach urli, które podaliście w liście z pkt. 3

wtorek, 2 września 2014

Rejestrowanie zestawów .Net przy użyciu instalatora Inno Setup

Od pewnego czasu coraz większą popularność zdobywają "alternatywne" narzędzia do tworzenia pakietów instalacyjnych. Jednym z popularniejszych narzędzi tego typu jest Inno Setup (http://www.jrsoftware.org/isinfo.php).
Bywa jednak, że instalowany pakiet jest n.p. AddInem etc., co wymusza konieczność jego rejestracji przy użyciu narzędzia RegAsm.
InnoSetup nie zawiera bezpośredniego polecenia rejestrowania zestawów, a dodatkowych plików wsadowych, uruchamianych przez EndUsera nie będziemy przecież narzucać - w myśl zasady "pełen automat".
Co więc zrobić?
Z pomocą przychodzi nam sekcja "Run" skryptu InnoSetup.
W tejże sekcji możemy z powodzeniem umieścić komendę, która nasze Assembly przy użyciu RegAsm zarejestruje:


[Run]     
Filename:"{reg:HKLM\SOFTWARE\Microsoft\.NETFramework,InstallRoot}\v4.0.30319\RegAsm.exe"; Parameters: /codebase NaszAddinLubCokolwiek.dll;WorkingDir: {code:PluginDestination}; StatusMsg: "Rejestracja Pluginu ..."; Flags: runhidden;



Dobrze. Zarejestrowaliśmy. Ale co z tym zrobić, kiedy nasz dodatek będzie odinstalowywany? Przecież nie możemy zezwolić, by pozostał po nim śmietnik.
Tym razem z pomocą przychodzi sekcja [UninstallRun] Skryptu. W niej z kolei umieszczamy następującą linię:


[UninstallRun]
Filename:"{reg:HKLM\SOFTWARE\Microsoft\.NETFramework,InstallRoot}\v4.0.30319\RegAsm.exe"; Parameters: /unregister NaszAddinLubCokolwiek.dll;WorkingDir: {code:PluginDestination}; StatusMsg: "Odrejestrowywanie Pluginu ..."; Flags: runhidden;


W ten oto sposób bez pisania dodatkowych batchy, tworzenia kolejnych tooli do rejestracji etc. przeprowadzamy cały proces czysto i schludnie.


BTW: jeśli komuś z Was nasuwają się jakieś pytania dotyczące narzędzia Inno Setup - w miarę wiedzy własnej postaram się pomóc. Pytania proszę zadawać w komentarzach - odpiszę, bądź jeśli taka będzie potrzeba - stworzę nowy artykuł.


W planie: krótkie (bardzo) wprowadzenie do MEF Framework ;) - czyli jak w niezwykle prosty sposób stworzyć szkielet dla rozwiązań wielomodułowych.

poniedziałek, 16 kwietnia 2012

Prosty walidator PESEL - C#

Nazwa PESEL pochodzi od "Powszechny elektroniczny system ewidencji ludności". Numer składa się zawsze z 11 cyfr, z których:
1. Pierwsze 6 cyfr stanowi datę urodzenia (ddmmyy)*
     * dla numerów PESEL z lat 2000 - 2099 do liczby miesięcy dodajemy 20! (np 103010 stanowi 10.10.2010)
2. cyfry od 7 do 10 to numer serii wraz z kodem płci (płeć to cyfra dziesiąta. Parzyste to żeńska, nieparzyste - męska)
3. cyfra 11 stanowi cyfrę kontrolną

Cyfrę kontrolną obliczamy mnożąć kolejne cyfry (od 1 do 10) przez następujące wagi (kolejno):
{1, 3, 7, 9, 1, 3, 7, 9, 1, 3}
iloczyny sumujemy. Następnie otrzymaną sumę dzielimy przez 10.
a. jeśli w wyniku otrzymamy 0 i jedenasta cyfra numeru PESEL to 0 - numer jest poprawny
b. jeśli uzyskaliśmy wynik inny niż 0, odejmujemy ją od 10. Jeśli wynik odejmowania jest równy jedenastej cyfrze numeru PESEL - numer jest poprawny. Jeśli nie - jest błędny.

Poniżej opisany algorytm w implementacji C#:

/*
 * Created by SharpDevelop.
 * User: PJ
 * Date: 2012-04-10
 * Time: 21:35
 * 
 */
using System;

namespace Validators
{
    /// <summary>
    /// Klasa statyczna PeselValidator.
    /// </summary>
    public static class PeselValidator
    {
        /// <summary>
        /// Mnozniki dla PESEL
        /// </summary>
        private static readonly int[] mnozniki = {1, 3, 7, 9, 1, 3, 7, 9, 1, 3};
        
        /// <summary>
        /// Sprawdza PESEL pod kątem poprawności
        /// </summary>
        /// <param name="pesel">PESEL string</param>
        /// <returns>true = OK; false = NOK</returns>
        public static bool ValidatePesel(string pesel)
        {
            bool toRet = false;
            try
            {
                if(pesel.Length == 11)
                {
                    toRet = CountSum(pesel).Equals(pesel[10].ToString());
                }
                }
                catch(Exception)
                {
                    toRet = false;
            }
            return toRet;
        }
        
        /// <summary>
        /// Liczy sumę cyfr znaczących PESEL
        /// </summary>
        /// <param name="pesel">PESEL string</param>
        /// <returns>SUMA string</returns>
        private static string CountSum(string pesel)
        {
            int sum = 0;            
            for(int i = 0; i < mnozniki.Length; i++)
            {
                sum+=mnozniki[i]*int.Parse(pesel[i].ToString());
            }
            
            int reszta = sum%10;
            return reszta == 0 ? reszta.ToString() : (10-reszta).ToString();
        }
    }
}

niedziela, 15 kwietnia 2012

ZedGraph - dodanie własnych etykiet wartości

Zastanawialiście się jak wyświetlić własne etykiety wartości na wykresach ZedGraph*?
Otóż - najprostszym przykładem niech będzie dodanie eventu do OnLoad formatki.
Uprzednio musimy jednak w OnLoad formatki wymusić pokazywanie "PointValues".
Za powyższe odpowiada property "IsShowPointValues", która w przypadku wartości true pobiera dane do PointValue z Labeli osi wykresu.

I tak - kod OnLoad'a:
private void Wykresy_Load(object sender, EventArgs e)

        {

            CreateGraph(zedGraphControl1);

            SetSize();

            //Wymuszamy PointValues

            zedGraphControl1.IsShowPointValues = true;

            //dopinamy nasz Event

            this.zedGraphControl1.PointValueEvent += this.zedGraphControl1_PointValueEvent;

        }

i kod samego Eventu:
private string zedGraphControl1_PointValueEvent(ZedGraphControl sender, 

                                                               GraphPane pane, CurveItem curve, int iPt)

        {

            //Wolna droga - ustawmy co nam sie podoba ;)

            return curve.Label.Text + " - " + curve.Points[iPt].Y;

        }


Efekt finalny:

Screen 1: własny label na wykresie ZedGraph

* przykład sprawdzony z ZedGraph w wersji 5.1.5.28844

Xml Writer - prosta instrukcja użycia

Zastanawiasz się jak w prosty sposób zapisać XML na podstawie listy danych, którą dostałeś z innej metody?
Znów - z pomocą przychodzi XmlWriter z Foreachem (Używaj list typizowanych! Unikniesz problemów!)

            XmlWriter writer = XmlWriter.Create(@"C:\pliki.xml", null);
            writer.WriteStartDocument();
            writer.WriteStartElement("Files");

            if (files.Count != 0)
                foreach (string s in files)
                {
                    writer.WriteStartElement("File");
                    writer.WriteString(s);
                    writer.WriteEndElement();
                }
            writer.WriteEndElement();
            writer.WriteEndDocument();
            writer.Flush();
            writer.Close();

Formatowanie XML w C#

Po co używać StringBuildera, skoro możemy prosto uzyskać pięknie sformatowany XML przy użyciu XmlWritera?

A oto jak:
 //Ustawienia XML Writera
  
 XmlWriterSettings set = new XmlWriterSettings();
  
 //"Ładne" formatowanie - true
  
 set.Indent = true;
  
 //i Nowy piękny XmlWriter - voila ;)
  
 XmlWriter writer = XmlWriter.Create(@"here should be a path to our pretty xml", set);