Ostatnio pojawił się problem w projekcie. Trzeba było odpalić VoIP z kontrolki activeX napisanej wcześniej dla aplikacji Windows.Forms, z poziomu wątku utworzonego w aplikacji konsolowej. Generalnie ciągle pojawiał się błędny komunikat o wielowątkowym apartamencie. Obejście tego zajęło trochę czasu, ale wstępnie wyszło. Rozwiązanie :

  1. Utworzyć specjalne okno, którego właściwość visibility będzie na false
  2. Zrobić z tego bibliotekę
  3. Odpalając wątek trzeba po prostu ustawić nowo tworzony wątek tak :


Thread newThread = new Thread(new ThreadStart(newConnectionThread.HandleConnection));
newThread.SetApartmentState(ApartmentState.STA);
newThread.Start();

Po ustawieniu ApartmentState na STA (single thread apartment) można odpalić kontrolkę activeX, która będzie działała na niewidzocznym oknie. :)

Ciągle brak czasu na cokolwiek…Ja pierniczę…

Zacząłem nowy projekt w ramach doskonalenia się w c# i asp.net :) Program ma być czymś w rodzaju generatora planu lekcji. Byłby dostępny na zasadzie shareware. Może uda mi się coś skleić przed drugą połową sierpnia, żeby to jakoś i gdzieś można było przetestować. Wstępne założenia :

  1. c#, winforms
  2. sql server 2008 express, linq (jako technologia dostępu do baz danych)
  3. asp.net jako forma dodatkowego wglądu w plan (np. kiedy jakiś uczeń chciałby sprawdzić  zmiany w planie lekcji)

Open : c:\Program Files\Vim\_vimrc

Add following lines to the file :

:winsize 120 25
:colorscheme murphy

And thats it. Every time you start a vim, it’s in write size the window and your favourite color scheme :)

I’ve done some researches yesterday about nanotechnology, I found something like this :

http://www.nanoguardian.net/

which gave me further ideas, which led me to this :

http://www.nanoink.net/

and which led me to Lamelson-MIT award :

http://web.mit.edu/invent/n-pressreleases/n-press-09LMP.html

Very promising thing is which is described in following paragraph :

Mirkin’s bio-barcode test has the potential to evaluate living patients for Alzheimer’s by detecting very low concentrations of the protein associated with the disease, allowing for early intervention and potential treatment.

Well, not only this is promising, this means, that teoretically some other stuff described in one of the basics books about nanotechnology is going to be a little bit closer, then we thought. And I mean this citate : “ Nanoshells, approximately 100nm in diameter, will float through the body, attaching only to cancer cells. When excited by a laser beam, the nanoshells will give off heat — in effect, cooking the tumor and destroying it.” It isn’t so farfetched future right now, as I thought.

Once again congrats, Chad!

I had today some problems with network at my work… Nothing unusual though. Well, couldn’t map my personal folder. After third restart finally some of the processes started and my “local” settings where configured. But, something bad happend to my visual studio. Whenever I tried to load projects I received following message :

“.csproj cannot be opened because its project type (.csproj) is not supported by this version of Visual Studio.”

I’ve tried to create new project. Same problem. After a while searching the net I found something like this : http://social.msdn.microsoft.com/Forums/en-US/vstsstart/thread/660f992e-96d9-43ef-9f50-0e4e09f10ed4 so the last entry says simply :

Run devenv.exe /resetskippkgs

More details about resetSkipPkgs : http://msdn.microsoft.com/en-us/library/ms241276.aspx

Additional info about VSPackages : http://msdn.microsoft.com/en-us/library/bb165366(VS.80).aspx

I just scratch my head, because I didn’t install another version of VS. Well, at least itworks now. Good…another splendid day at work…

Własne spostrzeżenia :

Biblioteka do sqlite jest naprawdę dobra. Schematy wyświetlane są prawidłowo, klasy TableAdapterManagera i poszczególnych adapterów tworzone są wg. templateów MS.

W .NET 3.5 pojawił się element TableAdapterManagera. Jest to chyba stosunkowo nowy objekt. Automatycznie tworzone są też adaptery dla poszczególnych tablic. Dodatkowo dla każdych wywołań tworzona jest transakcja. Nie trzeba pisać samemu obsługi ani programować operacji CRUD dla poszczególnych adapterów. Nie znalazłem na necie za dużo informacji o tym, jak stosować TableAdaptermanagera i Adapterów automatycznie wygenerowanych, podam tu w skrócie, jak ja ich używałem. Wszelkie komentarze mile widziane.

1. Inicjalizowanie obiektów.
a) najpierw tworzę obiekt TableAdapterManagera
b) potem tworzę obiekt konkretnego adaptera dla konkretnej tablicy
c) potem przypisuję TableAdapterManagerowi odpowiedni adapter :

private SkypeResponderDataSetTableAdapters.TableAdapterManager adapterManager;
private SkypeResponderDataSetTableAdapters.skypeUsersTableAdapter usersAdapter;

 

Dodatkowo jeszcze deklaruję DataSet:

private SkypeResponderDataSet ds;

 

Potem w konstruktorze :

ds = new SkypeResponderDataSet();
adapterManager = new SkypeResponder.SkypeResponderDataSetTableAdapters.TableAdapterManager();
usersAdapter = new SkypeResponder.SkypeResponderDataSetTableAdapters.skypeUsersTableAdapter();

 

Potem już tylko wystarczy operować na zainicjalizowanym objekcie DataSeta. Np. procedura dodania usera :

1. Utworzenie nowego wiersza tablicy skypeUsers :

SkypeResponderDataSet.skypeUsersRow sur = ds.skypeUsers.NewskypeUsersRow();

 

2. Mapowanie pól wiersz <- objekt usera

sur.client = sus.Client;
sur.usernick = sus.UserNick;
sur.respondmessage = sus.RespondMessage;
sur.autorespond = long.Parse(auto);
sur.emailsendchatperiod = long.Parse(sus.EmailSendChatPeriod.ToString());
sur.emailchatornot = long.Parse(emailchat);

 

3. Dodanie nowego wiersza do tablicy bazy :

ds.skypeUsers.AddskypeUsersRow(sur);

 

4. Update całego DataSetu.

 
adapterManager.UpdateAll(ds);

 

W trakcie updateAll TableManager wykonuje :
1. W sekcji <Prepare for update> ustawia połączenie + transakcje
2. W sekcji <Commit updates> komituje transakcje i kończy operacje na bazie.

Podczas programowania pojawił się problem, jak wrzucić zapytanie o konkretne wiersze z tablicy.

Adapter dla danej tablicy ma defaultowo ustawionegą operację Fill na select * from <table>. Koniec. Operacja select zapisana jest w kolekcji CommandCollection pod indexem 0. Problem polega na tym, że kolekcja jest prywatna. Ale, co warto podkreślić, klasa adaptera, każdego to partial class :) Stąd możemy sobie w innym miejscu dorobić metodę, która wykorzysta naszą SqlCommand.

 

public partial class skypeUsersTableAdapter
    {
        public int FillWithCustomSelectCommand(SkypeResponderDataSet.skypeUsersDataTable
dataTable, System.Data.SQLite.SQLiteCommand command)
        {
            System.Data.SQLite.SQLiteCommand command1 = this.CommandCollection[0];
            try
            {
                this.CommandCollection[0] = command;
                return this.Fill(dataTable);
            }
            finally
            {
                this.CommandCollection[0] = command1;
            }
        }
    }

 

Najpierw kopiujemy starą komendę, potem wrzucamy do kolekcji naszą,a po wypełnieniu tablicy, przywracamy starą komendę w jej prawowite miejsce. Wydaje mi się, że jest to w miarę rozsądne rozwiązanie.

Podczas tworzenia respondera głosowego, który miał reagować na odpowiednie zdarzenie w systemie klienta i wysyłać komunikat głosowy pod odpowiedni numer VoIP, pojawił się pomysł napisania respondera dla skype’a.
Chodzi o to, że nie zawsze jest możliwość odpowiedzenia na napisaną przez użytkownika do nas wiadomość. Ale nie napisanie czegokolwiek, generalnie może zostać odebrane negatywnie :) . Tak czy siak pojawił się pomysł.

Realizowane zadania :
1. Odpowiadanie na przychodzącą wiadomość, w zależności od użytkownika nas zaczepiającego.
2. Zapamiętywanie historii chatów, sprawdzanie czasu wysłania chatu na maila, wysyłanie historii chatu na maila.
3. Zapisywanie wyjątków do bazy danych.
4. Przechowywanie ustawień odnośnie każdego z użytkowników, do których ma być wysłany autoresponder w podręcznej bazie danych.
5. Włączanie/wyłączanie wysyłania automatycznych emaili i autorespondów.
6. Przyjazne i w miarę czytelne GUI.

Środowisko : .NET 3.5, SQLLite, c#

Potrzebne biblioteki :
1. .NET 3.5 runtime (to przynajmniej)
2. System.Data.SQLite.dll (pełna informacja i downloady : http://sqlite.phxsoftware.com/ )
3. Interop.SKYPE4COMLib.dll (biblioteka do interfejsów skype’a, warto zajrzeć pod adres : https://developer.skype.com/Download )

Uwagi ogólne :
I. Nie odpowiadam, jako autor, za jakiekolwiek uszkodzenia sprzętu, czy systemu operacyjnego, jeśli coś nawali po odpaleniu aplikacji.
II. Nie pobieram żadnych opłat za aplikację, dlatego nie jest ona w żaden istotny sposób wspierana. Uwagi są jednak mile widziane.
III. Udostępniam kod, można sobie to samemu skompilować, żeby nie odpalać exeka z netu, niewiedząc do końca co się odpala.
Przed odpaleniem :
1. Otworzyć plik “SkypeResponder.exe.config”. Łatwo zauważyć, że jest podzielony na sekcje (dokładnie tak to się nazywa) :
a) applicationGeneral – do ogólnych ustawień skypea, istotne tutaj jest tylko ustawienie : timerCheckEveryXMinutes z jakąś wartością. Jeśli 0, to będzie ciągle sprawdzał i się zwiesi (sorry, ale aplikacja nie jest oporna na głupotę)
b) mailconfiguration – ustawienia mailowania : defaultowo port i host ustawione na gmail, można zmienić, trzeba uzupełnić userName i password
c) skypeSettings – trzeba wpisać odpowiednio login (skypeUserName) i hasło (skypePassword) do Skype’a.

W trakcie uruchamiania :
SkypeResponder wbija się w działającego skype’a. Dlatego pojawi się monit skype (zależy od wersji gdzie, czy w okienku głównym skype’a-wersja 3.8, czy w okienku poza głównym oknem skype’a, jak w wersji 4.x) czy zezwolić na połączenie się. Kliknąć trzeba “zezwól” i już.
Po wpisaniu odpowiednich danych wprowadzeniu ich do bazy to by było wszystko.

Środowisko, na którym testowałem aplikację :
Windows XP Professional PL z Service pack 3, .NET 3.5, Skype 3.8.x, Skype 4.x.

Binarki : http://cid-38b583dfccbef4fc.skydrive.live.com/self.aspx/.Public/SkypeResponder%7C_release%7C_1/skyperesponder%7C_release1.zip

Źródła : http://cid-38b583dfccbef4fc.skydrive.live.com/self.aspx/.Public/SkypeResponder%7C_release%7C_1/SkypeResponder%7C_src.zip

Po odinstalowaniu SQL Server 2005 i podczas instalacji SQL Server 2008 instalacja zatrzymuje się  na ok 75%  z opisem, że aktualna akcja to : Install_sql_bids_Cpux86_Action: Write_NativeImage_x86 albo coś podobnego. U mnie chodziło o niepełne odinstalowanie SQL Server 2005. Native Client i pare innych objektów po starym SQL Server 2005 nie zostało odinstalowanych. Podobny problem mieli tu : http://social.msdn.microsoft.com/Forums/en-US/sqlsetupandupgrade/thread/1e43e7c0-13ba-4dcf-b479-aa0fca895912/ no i na to radą jest MS Clean Up :

Windows Installer Cleanup opisany jest tutaj : http://support.microsoft.com/kb/290301 Tam też jest do pobrania.