MervDePerv

luty 9, 2011

GoogleCalendarToRtf

Opublikowane jako: C# — naza @ 11:37 przed południem

Zacząłem używać kalendarza google. Rewelacyjna sprawa. Nie będę się rozpisywał na temat zalet i wad bo nie mam najmniejszego zamiaru. Brakowało mi tylko jednej rzeczy. Bym mógł wydrukować sobie wydarzenia jako konkretny szablon i wzorzec modyfikowany przez mnie. Oczywiście jest to tylko i wyłącznie mój wymysł. Urodził się zatem pomysł na prosty program. Strona projektu: http://sourceforge.net/projects/googlecalendart/. Zapraszam do testowania i jeśli by ktoś był tak dobry to proszę o sugestie i ewentualne wytykanie błędów na naza[ at ]op.pl. Ctr+V z Instrukcji:

  • 1. Czym jest GoogleCalendarToRtf?
    Program GoogleCalendarToRtf jest programem napisanym w C#. Program umożliwia wczytanie wyeksportowanego kalendarza Google oraz wydrukowania w dowolnym szablonie wydarzeń z tego kalendarza.
  • 2. Wymagania.
    Do poprawnego działania wymaga net framework w wersji minimum 3.5 oraz Microsoft Word 2007.
  • 3. Co mogę zaczytać?
    W ustawieniach kalendarza Google możemy użyć opcji eksportu do pliku *.ics(http://pl.wikipedia.org/wiki/ICalendar). Faktycznie program poradzi sobie z każdym kalendarzem w formacie iCalendar. Można zatem zaczytywać dowolne kalendarze w formacie iCalendar.
  • 4. Jak stworzyć szablon?
    Po uruchomieniu programu wystarczy kliknąć „Utwórz Szablon”, podać lokalizację zapisu pliku. Następnie otworzy się nam automatycznie pusty dokument RTF otwarty w MS Word. Należy stworzyć dowolnie wyglądający dokument oraz w odpowiednie miejsca wstawić pola z wydarzenia w kalendarzu.
    Lista pól:
    • 1. DTSTARTDAY – data rozpoczęcia wydarzenia w formacie DD/MM/RRRR.
    • 2. DTSTARTH – godzina rozpoczęcia wydarzenia w formacie HH:MM.
    • 3. DTENDDAY – data zakończenia wydarzenia w formacie DD/MM/RRRR.
    • 4. DTENDH – godzina zakończenia wydarzenia w formacie HH:MM.
    • 5. DESCRIPTION – opis wydarzenia.
    • 6. LOCATION – lokalizacja wydarzenia.
    • 7. SUMMARY – podsumowanie(zawiera lokalizacje oraz opis).

Dynamiczne filtrowania DataGridView gdy źródłem danych jest zapytanie LINQ

Opublikowane jako: C# — naza @ 11:27 przed południem

Ogólnie by zastosować dynamiczne filtrowanie DataGrida wystarczy DataSource rzutować na DataTable i za pomocą DefaultView.RowFilter podać stringa z odpowiednim filtrem:

((DataTable)dataGridView1.DataSource).DefaultView.RowFilter = "Id=1 and Number=123";

W momencie gdy źródłem danych w DataGrid bezpośrednio jest zapytanie LINQ:

this.dataGridView1.DataSource = (from x in ReferencjaDoTabeli select x).ToList();

Przy próbie rzutowania do DataTable otrzymamy informcaje, że INumerable nie można rzutować do DataTable. Co z tym fantem zrobić? Należy zatem nasze zapytanie przed przypisaniem do DataGrida zamienić na DataTable. Poniżej prosta funkcja przepisująca zapytania do DataTable z zachowaniem typów kolumn z zapytania.

        private static DataTable LINQToDataTable<T>(IEnumerable<T> varlist)
        {
            DataTable dtReturn = new DataTable();

            // nazwy kolumn
            PropertyInfo[] oProps = null;

            if (varlist == null) return dtReturn;

            //pobranie informacji o kolumnach
            if (oProps == null)
            {
                //pobranie informacji na temat typu zmiennej
                oProps = ((Type)varlist.ElementAt(0).GetType()).GetProperties();
                foreach (PropertyInfo pi in oProps)
                {
                    Type colType = pi.PropertyType;

                    if ((colType.IsGenericType) && (colType.GetGenericTypeDefinition()
                    == typeof(Nullable)))
                    {
                        //pobranie typu kolumny
                        colType = colType.GetGenericArguments()[0];
                    }
                    //dodanie nowej kolumny o odpowiednim typie oraz nazwie
                    dtReturn.Columns.Add(new DataColumn(pi.Name, colType));
                }
            }

            //przejscie po kazdym wierszu zapytania
            foreach (T rec in varlist)
            {
                //utworzenie nowego wiersza z zwracanej tabeli
                DataRow dr = dtReturn.NewRow();

                foreach (PropertyInfo pi in oProps)
                {
                    //przypisanie wartości z wiersza w zapytaniu do nowego wiersza
                    dr[pi.Name] = pi.GetValue(rec, null) == null ? DBNull.Value : pi.GetValue
                    (rec, null);
                }

                //dodanie nowego wiersza do zwracanej tabeli
                dtReturn.Rows.Add(dr);
            }
            return dtReturn;
        }

Zastosowanie funkcji jest bardzo proste:

var query = (from x in ReferencjaDoTabeli select x).ToList();
this.dataGridView1.DataSource = LINQToDataTable(query);

czerwiec 6, 2010

samba + clamav (vscan, skanowanie on_access)

Opublikowane jako: Linux — naza @ 11:07 po południu

Aktualnie skanowanie on_access w sambie to dla wielu problem. Dlaczego? Wydaje mi się, że odpowiedź jest prosta – projekt http://www.openantivirus.org/ nie jest rozwijany od … 2005-08-24 tego dnia ukazała się ostatnia paczka samba-vscan-0.3.6b.tar.bz2. Teraz pytanie czy tak stary projekt będzie działał z najnowszymi dystrybucjami, wersjami Samby czy Clama? Odpowiedź : jak najbardziej TAK. Chwila kombinacji, parę zabiegów i możemy się cieszyć z serwera Samby z skanowaniem on_acces(takowy uruchomiłem w dużej instytucji – około 200 stacji z profilami użytkowników). Przy pierwszej instalacji wzorowałem się tym poradnikiem http://clamav.skc.com.pl/howtos/samba_clamav.html. Wiele rzeczy będzie podobnych jednak sam poradnik też jest trochę przestarzały. W razie jakichś pytań, problemów w miarę możliwości oraz umiejętności postaram się pomóc. Ale od początku.

    1 . Dystrybucja

      Całość zainstalowałem oraz uruchomiłem na Fedora 12. Aczkolwiek dla tego artykułu oraz moich potrzeb skonfigurowałem to na dystrybucji openSuse 11.2. Podczas instalacji nie zaznaczmy “serwer plików” oraz zaznaczmy “c/c++ library”.
    2 . Instalacja Samby

      Z najnowszymi wersjami Samby uruchomienie modułu(pomimo pomyślne kompilacji) nie powiedzie się. Spędziłem trochę czasu i nie znalazłem rozwiązania. Jeśli komuś się uda zainstalować vscana z najnowszą wersją samby to mógłby się podzielić ze mną tą wiedzą. :) Wersja Samby, na której moduł vscan-clamav działa stabilnie i bezproblemowo to Samba 3.2.5, którą możemy pobrać tutaj: http://ppp.samba.org/samba/ftp/old-versions/samba-3.2.5.tar.gz. Zatem do dzieła.

      Na początek usuńmy aktualną wersję Samby z systemu:
      osiol:/# yast --remove samba

      Pobieramy, rozpakowujemy, oraz instalujemy Sambę. Ważne by podczas uruchamiania ./configure dodać opcję –with-vfs:

      osiol:/# wget http://ppp.samba.org/samba/ftp/old-versions/samba-3.2.5.tar.gz
      osiol:/# tar xzfv samba-3.2.5.tar.gz
      osiol:/# cd samba-3.2.5/source/
      osiol:/# CFLAGS="-march=i686 -mcpu=i686" ./configure --with-fhs --prefix=/usr --localstatedir=/var
      --bindir=/usr/bin --sbindir=/usr/sbin --with-lockdir=/var/cache/samba --sysconfdir=/etc
      --with-configdir=/etc/samba --with-privatedir=/etc/samba/private --with-codepagedir=/etc/codepages
      --with-smbmount --with-syslog --with-utmp --with-sambabook=/usr/share/swat/using_samba
      --with-ssl --with-sslinc=/usr/include/openssl --with-ssllib=/usr --with-msdfs --with-vfs
      osiol:/# make
      osiol:/# make install

      Na koniec tworzymy katalog dla logów oraz plik konfiguracyjny Samby. Pod tym odnośnikiem można podejrzeć mój config.

      osiol:/# mkdir /var/log/samba
      osiol:/# nano /etc/samba/smb.conf
    3. Instalacja modułu vscan – clamav

      Pobieramy moduł oraz rozpakowujemy go:
      osiol:/# wget http://downloads.sourceforge.net/project/openantivirus/samba-vscan/0.3.6b/samba-vscan-0.3.6b.tar.bz2?use_mirror=ignum
      osiol:/# tar xvfj samba-vscan-0.3.6b.tar.bz2

      Niestety dla wersji Samby od 3 w górę potrzebne są nam patche. Patche można pobrać z sieci np z tej stronki. Ja umieszczam je u siebie w jednej paczce, do pobrania tu. Patchowania wykonujemy w poniższej kolejności:

      osiol:/# wget http://lordkavkol.webpark.pl/patches.tar.gz
      osiol:/# tar xvzf patches.tar.gz
      osiol:/# patch -p0 < 0.3.6c.diff
      osiol:/# patch -p0 < installperms.diff
      osiol:/# patch -p0 < bool_type.diff
      osiol:/# patch -p0 < pstring.diff
      osiol:/# patch -p0 < SMB_VFS_NEXT_CLOSE-args.diff
      osiol:/# patch -p0 < pm_process_additional_fourth_arg.diff
      osiol:/# patch -p0 < Makefile.in.diff
      osiol:/# patch -p0 < last.diff 

      Ważną sprawą jest zmiana w pliku clamav/vscan-clamav.h zmienić ścieżkę socketu clama:

      #define VSCAN_CLAMD_SOCKET_NAME      "/var/run/clamd"
      na
      #define VSCAN_CLAMD_SOCKET_NAME      "/var/run/clamav/clamd.sock"

      Teraz możemy przejść do kompilacji. Ważne by podczas wykonywania polecenia configure podać ścieżkę do prze kompilowanych źródeł Samby.

      osiol:/# ./configure --prefix=/usr --with-samba-source=/home/naza/samba-3.2.5/source/
      osiol:/# make clamav

      Gdy mamy skompilowany moduł wystarczy przekopiować go w odpowiednie miejsce(podam dwa gdyby były problemy), oraz stworzyć plik konfiguracyjny modułu vscan-clamav. Na temat opcji w pliku nie będę się rozpisywał. Stronka, którą przytoczyłem na początku zawiera dokładny opis. Od siebie dodam, że większość opcji u mnie po prostu nie działa… Mój config.

      osiol:/# cp vscan-clamav.so /usr/lib/vfs/
      osiol:/# cp vscan-clamav.so /usr/lib/
      osiol:/# nano /etc/samba/vscan-clamav.conf
    4. Instalacja Clamav

      Standardowa instalacja. Tworzymy grupę oraz użytkownika clamav, pobieramy najnowsze źródła, kompilujemy.
      osiol:/# wget http://downloads.sourceforge.net/clamav/clamav-0.96.1.tar.gz
      osiol:/# tar xzvf clamav-0.96.1.tar.gz
      osiol:/# cd clamav-0.96.1/
      osiol:/# groupadd clamav
      osiol:/# useradd -g clamav -s /bin/false -c "Clam" clamav
      osiol:/# ./configure --prefix=/usr --sysconfdir=/etc/clamav --datadir=/etc/clamav --with dbdir=/etc/clamav
      osiol:/# make
      osiol:/# make install

      Edytujemy plik konfiguracyjny Clama, odnajdujemy parametr LocalSocket i ustawiamy mu wartość:

      LocalSocket /var/run/clamav/clamd.sock

      Na koniec tworzymy katalog dla socketu, nadajemy mu prawa i aktualizujemy Clama:

      osiol:/# mkdir /var/run/clamav
      osiol:/# chown -R clamav:clamav /var/run/clamav
      osiol:/# freschclam
    5. Skrypty Uruchomieniowe

      W linkach zamieszczam skrypty startowe dla Clama i Samby. Skrypt Samby uruchamia Clama.

      samba-vscan

      clamd

      Kopiujemy je oraz nadajemy im prawa do uruchamiania:
      osiol:/# nano /etc/init.d/samba_clamav
      osiol:/# nano /etc/init.d/clamd
      osiol:/# chmod +x /etc/init.d/samba_clamav
      osiol:/# chmod +x /etc/init.d/clamd
    6. Konfiguracja udziałów Samby

      W pliku konfiguracyjnym Samby wystarczy dodać poniższe dwie linijki(pogrubione) do dowolnego udziału, który ma być objęty ochroną antywirusową:
      [test]
         comment = test
         path = /home/naza
         vfs object = vscan-clamav
         vscan-clamav: config-file = /etc/samba/vscan-clamav.conf
      
    7. Sprawdzanie poprawności działania

      Gdy wszystko pójdzie ok w logu Samby dla konkretnego klienta podłączonego do serwera powinniśmy ujrzeć mniej więcej coś takiego:
      [2010/06/06 22:49:25,  2] auth/auth.c:check_ntlm_password(308) check_ntlm_password:
      authentication for user [naza] -> [naza] -> [naza] succeeded
      [2010/06/06 22:49:25,  2] lib/module.c:do_smb_load_module(64)
      Module '/usr/lib/vfs/vscan-clamav.so' loaded
    8. Przenoszenie wirusa do kwarantanny

      Niestety z nieznanych mi przyczyn opcja by w momencie wykrycia wirusa przeniesiono go do kwarantanny nie działa. Przy wyżej opisanej konfiguracji w momencie znalezienia wirusa plik zostanie zablokowany. Postanowiłem jednak w jakiś sposób to zrobić. Poniżej przedstawiam swoje rozwiązanie z wykorzystaniem prostego skryptu napisanego w perlu.

      Zaczynamy od stworzenie katalogu dla kwarantanny oraz pliku z logami.
      osiol:/# mkdir /home/kwarantanna/
      osiol:/# touch /var/log/znalezione_wirusy.log

      Następnie kopiujemy poniższy skrypt na dysk:

      #!/usr/bin/perl
      # nazwa wirusa
      $wirus = shift;
      # ścieżka do pliku z logami skryptu
      $log = "/var/log/znalezione_wirusy.log";
      open(PLIK, ">>".$log) || die "Nie można otworzyć pliku z logami.";
      # ścieżka do pliku z logami clamd
      $clamd_log = "/var/log/clamd.log";
      # ścieżka do katalogu kwarantanny
      $kwarantanna="/home/kwarantanna/";
      #przedrostek dla wirusów
      $przedrostek = "vir-";
      #scieżka do pliku maila
      $mail_path = "/home/mail.txt";
      # wyzanczenie daty
      @months = qw(Sty Lut Marz Kwie Maj Cze Lip Sier Wrze Paz List Grudz);
      @weekDays = qw(Ndz Pon Wt Sr Czw Pt Sob Ndz);
      ($second, $minute, $hour, $dayOfMonth, $month, $yearOffset, $dayOfWeek, $dayOfYear, $daylightSavings) = localtime();
      $year = 1900 + $yearOffset;
      $theTime = "$hour:$minute:$second-$weekDays[$dayOfWeek]-$months[$month]-$dayOfMonth-$year";
      $data = $theTime;
      
      $tmp = qx[tail -n 1 $clamd_log];
      @tmp2 = split(":", $tmp);
      
      $lokalizacja_wirusa = @tmp2[0];
      
      $cmd = "mv ".$lokalizacja_wirusa." ".$kwarantanna.$przedrostek.$data.$wirus;
      
      @go = qx[$cmd];
      
      # stworzenie loga
      $msg = $data." Wykonano: ".$cmd.". Z skutkiem : ".@go[0].@go[1].".\n";
      # dodanie loga do pliku logów
      print PLIK $msg;
      close PLIK;
      
      # wysłanie e-maila mozna użyc - wymaga jednak zainstalowania programu nail
      # w momencie znalezienia wirusa zostanie wyslany e-mail
      open(mail, ">".$mail_path);
      print mail $msg;
      close mail;
      
      qx['set smtp-auth=login'];
      qx['set smtp-auth-user=mail@wp.pl'];
      qx['set smtp-auth-password=paSw0rd'];
      
      $cmd = 'nail -s "Wykryto wirusa" -S smtp=smtp.poczta.onet.pl
      -S from="mail@op.pl" -S smtp-auth=login -S smtp-auth-user=mail@op.pl
      -S smtp-auth-password=paSw0rd odbiorca@poczty.pl < '.$mail_path;
      $ok = qx[$cmd];
      
      exit;

      Następnie w pliku konfiguracyjnym Clama odnajdujemy sekcje VirusEvent i ustawiamy w niej ścieżkę do skryptu perla:

      VirusEvent /home/naza/kwarantanna.pl "%v"

      Gdy tak skonfigurujemy całość W momencie wykrycia wirusa zostanie on przeniesiony z nową nazwą “przedrostek”-data do zdefiniowanego przez nas katalogu. Dodatkowo pokazałem też jak wysłać maila z informacją o wirusie.

marzec 6, 2010

Potęga watch

Opublikowane jako: Linux — naza @ 9:11 po południu

Ostatnio przypomniałem sobie takie fajne polecenie jak watch.

Usage: watch [-bdhnptvx] [--beep] [--differences[=cumulative]] [--exec] [--help] [--interval=] [--no-title] [--version]
-b, –beep beep if the command has a non-zero exit
-d, –differences[=cumulative] highlight changes between updates
(cumulative means highlighting is cumulative)
-e, –errexit exit watch if the command has a non-zero exit
-h, –help print a summary of the options
-n, –interval= seconds to wait between updates
-p, –precise precise timing, ignore command run time
-v, –version print the version number
-t, –no-title turns off showing the header
-x, –exec pass command to exec instead of sh

Do obserwacji zmian w logach używam zawsze polecenia:

naza@lenovo:~$ tail -f -n 5 /var/log/messages

W tym wypadku tail wyświetla mi ostatnie 5 linii loga na “bierząco”. W pracy podpatrzyłem jak robi to mój znajomy, użył do tej czynności zupełnie innego polecenia mianowicie zastosował watch w następującej postaci:

naza@lenovo:~$ watch tail -n 5 /var/log/messages

Efekt obu poleceń jest identyczny – wyświetlają ostatnie 5 nowow dodanych informacji w logu. Działanie watch zaintrygowało mnie w tym wypadku. Stwierdziłem, że do podglądania logów tail z przełącznikiem -n będzie nadal lepsze, aczkolwiek watch świetnie nadaje się jako polecenie przy kopiowaniu!! Dlaczego? Powiedzmy, że chcemy skopiować duży plik na pendrive,(chcemy to zrobić z konsoli widząc ile danych skopiowaliśmy). Odpowiednie użycie watch załatwia sprawę:

naza@lenovo:~$ cp -v /home/naza/Iso/msdn7pro.iso / | watch du -h /media/USB1/msdn7pro.iso

W tym wypadku będziemy na bierząco śledzić ilość przekopiowanych megabajtów. Reasumując watch jest bardzo przydatnym poleceniem do podglądu zajętości zasobów, czy też postępu kopiowanych plików. W celu zapoznania się z pozostałymi funkcjami watch zaprasza do helpa i manuala.

luty 25, 2010

AfterShow() w Builder C++

Opublikowane jako: Builder C++ — naza @ 6:54 po południu

Podejrzewam, że wielu nas spotkało się już z tym problemem. Mianowicie chodzi o wykonanie instrukcji zaraz po pokazaniu się formatki. Oczywiście jest OnShow() aczkolwiek to operacje zawarte w tym zdarzeniu zostaną wykonane przed faktycznym pokazaniem się formatki. Zatem jak wykonać operacje, funkcje po ukazaniu się naszym oczom formatki? Rozwiązań jest kilka. Ja zdecydowałem się przedstawić najbardziej wg mnie optymalne.
Wykorzystamy inne zdarzenie klasy TForm tj OnActivate(). Definicja z plików pomocy:

__property Classes::TNotifyEvent OnActivate = {read=FOnActivate, write=FOnActivate,};
Description
Use OnActivate to perform special processing when the form receives focus. A form becomes active when focus is transferred to it (when the user clicks on the form, for example).

Zatem jak widzimy zdarzenie OnActivate() jest wykonywane w momencie otrzymania przez formatkę “fokusa”(np. kliknięcie myszą). Zatem do dzieła. Dodajemy w pliku *.h naszej formatki zmienna bool wykonano:

#ifndef Unit1H
#define Unit1H
#include
#include
#include
#include
class TForm2 : public TForm
{
 __published:	// IDE-managed Components
        void __fastcall FormActivate(TObject *Sender);
private:	// User declarations
        bool wykonano;
public:		// User declarations
        __fastcall TForm2(TComponent* Owner);
};
extern PACKAGE TForm2 *Form2;
#endif

Zmienna będzie nam określać czy zdarzenie zostało już wykonane. Teraz w zdarzeniu OnActivate() dodajemy:

void __fastcall TForm2::FormActivate(TObject *Sender)
{
 if(this->wykonano == true)
 {
  ShowMessage("After Show!");
  this->wykonano = false;
 }
}

Sprawdzamy czy zmienna wykonano jest równa true i jeśli tak to wykonujemy ciąg instrukcji dla zdarzenia “AfterShow”. Pozostaje nam w zdarzeniu OnShow() ustawić:

void __fastcall TForm2::FormShow(TObject *Sender)
{
 this->wykonano = true;
 this->SetFocus();
}

Funkcja SetFocus() symuluje nam wysłanie “focusa” do formatki.
To by było na tyle.

Wspierane przez NETMARK Hosting