RSS
piątek, 18 października 2013
Jeden z najprzydatniejszych skrótów klawiszowych Mac OS X

 

W systemie Mac OS X dużo folderów i plików jest domyślnie ukrytych. W większości są to rzeczy niepotrzebne regularnemu użytkownikowi, więc nie stanowi to zbytniego problemu. Jeśli jednak programujesz bądź po prostu jesteś bardzie zaawansowanym użytkownikiem systemu, możesz stanąć przed koniecznością ich wykorzystania.

 

Oczywiście funkcja „Go to Folder” działa również z nieukrytymi katalogami, więc może przydać się każdemu.

 

O tym jak wyświetlić wszystkie ukryte pliki i katalogi pisałem już wcześniej:
http://notatkiprogramisty.blox.pl/2012/10/Mac-OS-Finder-i-szybkie-ukrywanie-pokazywanie.html, dziś wspomnę jedynie o bardzo przydatnym skrócie klawiszowym uruchamiającym funkcje „Go to Folder”, który wszyscy powinni znać :) a mianowicie:


Command + Shift + G        ( Mac OS X Command KeyMac OS X Shift Key + G )

Wywołanie polecenia powoduje pojawienie się na ekranie okienka podobnego do tego przedstawionego na poniższym screenie.


Go to Folder Mac OS X

 

Aby przenieść się do wybranego katalogu, w dostępnym polu tekstowym wystarczy wpisać nazwę folderu, do którego chcemy się dostać, a następnie wcisnąć przycisk „Go”.



Poza oczywistym, ręcznym wpisywaniem ścieżki „Go to Folder”:



• wspiera korzystanie z klawisza Tab, uzupełniając wprowadzaną ścieżkę podobnie jak dzieje się to w normalnym terminalu,

• działa w okienkach Save (zapisz) i Open (otwórz) aplikacji,

• wspiera drag and drop; przeciągnięcie wybranego folderu na pole tekstowe okienka dialogowego „Go to Folder” powoduje automatyczne wprowadzenie e to pole pełnej ścieżki do katalogu. Ścieżkę taką możemy bądź dalej ręcznie zmodyfikować bądź np. komuś przesłać, gdyż działa to również z folderami sieciowymi.


Alternatywnie, jeśli nie mamy pamięci to klawiszy, funkcja „Go to Folder” dostępna jest z poziomu menu Finder’a „Go/Go to Folder”.

Więcej przydatnych skrótów klawiszowych znajdziecie tutaj: http://support.apple.com/kb/ht1343




wtorek, 08 października 2013
Przygotowanie botowalnego pendrive-a z systemem Mac OS X Mountain Lion

 

Jako, że niebawem będę reinstalowal system na moim Mac-u poniżej przedstawię kroki niezbędne do przygotowania botowalnego pendrive-a z systemem Mountain Lion OSX.

 

Jeśli twój Mac posiada slot kart pamięci SD zamiast pendrive-a możesz wykorzystać kartę pamięci SD bądź nawet Micro SD z wykorzystaniem przejściówki USB.


Do przeprowadzenia całej operacji, poza komputerem Mac, i kontem z uprawnieniami administratora będziemy dodatkowo potrzebowali:


- pendrive-a 8GB lub kartę pamięci SD o takim samym rozmiarze (gdziekolwiek w tekście mowa jest o pendrive, dokładnie te same kroki dotyczą karty SD),
- wersję instalacyjną systemu OSX Mountain Lion (plik: Install OS X Mountain Lion.app, który można pobrać z Mac App Store).

 

Postępowanie:

1. Podłącz pendrive do portu USB swojego Mac-a i uruchom aplikacje Disk Utility. Znajdziesz ją w folderze aplikacji, podfolderze narzędzia (/Applications/Utilities).

2. Na lewym panelu wybierz swój dysk USB i przejdź do zakładki Partition na panelu prawym.

3. Z rozwijanego menu „Partition Layout” wybierz „1 Partition”, nazwij swój dysk „OS X Installer”, a  jako format wybierz „Mac OS Extended (journaled)”.

 

Przygotowanie botowalnego pendrive-a z systemem Mac OS X Mountain Lion

 

4. Kliknij teraz na „Opcje” i wybierz „GUID Partition Table” (jest to botowalna partycja dla  komputerów Mac opartych o platformę Intel), po czym kliknij „OK.”, a następnie „Apply”.



Na pytanie czy na pewno chcesz zmienić partycję na wybranym dysku odpowiedz )po sprawdzeniu, że wszystko się zgadza, że wybrałeś właściwy dysk) „Partition”.

 
Przygotowanie botowalnego pendrive-a z systemem Mac OS X Mountain Lion
 

Przygotowanie botowalnego pendrive-a z systemem Mac OS X Mountain Lion

 

Po krótkiej chwili nasza nowa partycja powinna być gotowa do użycia.

5. Przejdź teraz do pliku z wersją instalacyjną systemu Mac OSX pobraną wcześniej z Mac App Strore. Kliknij na pliku prawym klawiszem myszki i wybierz z menu kontekstowego „Show Package Contents”.

 

Przygotowanie botowalnego pendrive-a z systemem Mac OS X Mountain Lion

 
Plik InstallESD.dmg, który nas interesuje, znajduje się w podkatalogu SharedSupport. Skopiuj go w inne miejsce np. tymczasowo na pulpit (desktop).

 

6. Teraz wróć do programu „Disk Utility”. Na lewym panelu wybierz nowo utworzoną partycję startową „OS X Installer”, na prawym przejdź do zakładki „Restore”.  Kliknij „Image”, jako źródło (Source) wybierz plik InstallESD.dmg skopiowany w poprzednim kroku. Aby wybrać cel (Destination) przeciągnij i upuść (drag and drop) na pole tekstowe naszą nową partycję OSX Installer. Efekt końcowy przedstawia poniższy ekran:

 

Przygotowanie botowalnego pendrive-a z systemem Mac OS X Mountain Lion

 
Po sprawdzeniu ze wszystko się zgadza wciśnij „Restore”.


Na zadane pytanie odpowiedź „Erase” (w tym momencie może być konieczne podanie hasła administratora systemu).

 

Przygotowanie botowalnego pendrive-a z systemem Mac OS X Mountain Lion

 
7. Teraz musimy cierpliwie czekać, całość może zając nawet kilkadziesiąt minut w zależności od prędkości naszego Mac’a i wykorzystanego pendrive’a. W moim wypadku przygotowanie trwało około 25 minut.



Po utworzeniu botowalnego pendrive-a możemy do niego dodać inne narzędzia, pliki konfiguracyjne, update-y, z których korzystamy. Jest to duży plus w porównaniu z nośnikiem niezapisywalnym (płyta DVD). Również jeśli dysponujemy większym niż 8GB pendrive-m, kartą SD bądź dyskiem zewnętrznym możemy pokusić się o instalację kilku wersji instalacyjnych systemu na jednym urządzeniu.



Dodając dodatkowa zawartość nie wolno zmienić istniejącej struktury katalogów gdyż mogłoby to spowodować uszkodzenie instalatora systemu.




środa, 25 września 2013
Monitorowanie Raspberry-Pi z RPi-Monitor(em)

 

Jedną z dostępnych aplikacji do monitorowania Raspberry pi jest RPi-Monitor. Umożliwia ona łatwe sprawdzenie kluczowych informacji naszego urządzenia takich jak:

- obciążenie procesora,
- wykorzystanie pamięci RAM,
- wykorzystanie pamięci Flash / USB / HDD
- aktywność sieciowa,
- temperaturę

 itp.


Instalacja monitora jest bardzo prosta:



1. Musimy z sieci (GitHub) pobrać najnowszą wersję aplikacji:

 

$ sudo wget https://raw.github.com/XavierBerger/RPi-Monitor-deb/master/packages/rpimonitor_2.4-1_all.deb -O rpimonitor_2.4-1_all.deb

 

2. oraz wszystkie niezbędne do jego działania pakiety dodatkowe (dependencies):

 

$ sudo apt-get install librrds-perl libhttp-daemon-perl libjson-perl libipc-sharelite-perl

 

3.    na koniec musimy zainstalować RPi-Monitor:

 

$ sudo dpkg -i rpimonitor_2.4-1_all.deb

 

W tym momencie możemy sprawdzić cos się dzieje na naszym Raspberry-Pi otwierając z przeglądarki następującą stronę: http://192.168.1.111:8888 (pamiętaj o zmianie adresu 192.168.1.111 na adres twojego urządzenia).

 

Monitorowanie Raspberry-Pi z RPi-Monitor(em)

 

Monitorowanie Raspberry-Pi z RPi-Monitor(em)

 

Po instalacji warto zapoznać się ze wszystkimi możliwościami oferowanymi przez monitor:

$ man rpimonitord

 

$ man rpimonitord.conf


Poza standardowymi 'monitorami' aplikacji do RPi-Monitor(a) możemy dodać swoje własne jak na przykład monitorowanie wolnego miejsca na podłączonych zewnętrznych dyskach, bądź tez monitorowanie temperatury otoczenia odczytywanej przez zewnętrzny czujnik.

Jeśli z jakichś przyczyn musimy odinstalować monitor możemy to zrobić wykonując z konsoli następujące polecenie:


$ dpkg --purge rpimonitor 

 

poniedziałek, 23 września 2013
Programowanie iPhone - FMDB / SQLite i liczba dodanych, usuniętych, zmienionych wierszy

 

Często, pracując z bazami danych, stajemy przed koniecznością sprawdzenia liczby wierszy dodanych, usuniętych bądź zmienionych przez wykonywana operacje bazodanowa.
Wrapper FMDB umożliwia łatwe sprawdzenie tej wartości oferując funkcję chan ges:

-(int)changes;

 

Funkcja zwraca wartość całkowitą reprezentującą liczbę wierszy dodanych, usuniętych bądź zmienionych przez ostatnie polecenie DML wykonywane na bazie danych. Przykład użycia poniżej:

 

FMDatabase *database = [FMDatabase databaseWithPath:@"posts.db"];

...

if ([database executeUpdate:@"UPDATE comment SET modifiedby = ‘admin’..."]) {
    NSLog(@"Updated %d rows", [database changes]);
}
else {
    // error
}

 

Po więcej informacji na temat tej i innych funkcji można sięgać do dobrze udokumentowanego kodu FMDB: https://github.com/ccgus/fmdb/blob/master/src/FMDatabase.h


środa, 04 września 2013
Raspberry Pi - instalacja Subversion

 

Przygotowując nasz Raspberry Pi do pracy, jako serwer musimy zacząć od uruchomienia terminala i podłączenia się do naszego Pi (ssh).


$ ssh -l

Możemy teraz przystąpić do instalacji subversion i wszystkich niezbędnych do jego działania pakietów. Aby to zrobić wykonujemy z konsoli następujące polecenie:


$ sudo apt-get install subversion


Raspberry-Pi instalacja Subversion

 

W tym momencie możemy przystąpić do utworzenia naszego pierwszego repozytorium:

$ mkdir -p /home/pi/svn/repos
$ svnadmin create /home/pi/svn/repos/helloworld

 

W pierwszej linii tworzymy katalog główny dla repozytoriów subversion /home/pi/svn/repos, a następnie, wykorzystując komendę svnadmin, tworzymy pierwsze repozytorium helloworld.

Poniższy screen przedstawia pliki znajdujące się w nim zaraz po założeniu:

 

Raspberry-Pi instalacja Subversion 

 
Dodajmy teraz coś do naszego nowego repozytorium. Załóżmy folder projektów i utwórzmy nowy plik main.cpp. Sekwencja odpowiednich komend przedstawiona jest poniżej:

$ mkdir -p /home/pi/projects/helloworld
$ cd /home/pi/projects/helloworld
$ sudo nano main.cpp

 

Kod naszego programu nie będzie skomplikowany :)



#include 
using namespace std;

int main ()
{
	cout << "Hello World!";
	return 0;
}



Po zapisaniu pliku możemy zaimportować go do repozytorium:

 

$ sudo svn import /home/pi/projects/helloworld/ file://localhost/home/pi/svn/repos/helloworld/

 

Po wykonaniu polecenia powinniśmy zobaczyć ekran podobny do poniższego:

Raspberry-Pi instalacja Subversion 



Ekran ten umożliwia nam wprowadzenie komentarza do importowanego pliku. Zakończenie wpisywania komentarza potwierdzamy wciskając CTRL+X.

Jeśli dotychczas wszystko wykonaliśmy poprawnie to na ekranie powinniśmy zobaczyć linie podobne do poniższych.

Adding         main.cpp

Committed revision 1.
pi@morts-pi ~/projects/helloworld $

 

Wszystko ok, ale korzystanie z serwera lokalnie na naszym Pi nie jest szczególnie praktyczne. Spróbujmy więc umożliwić zdalny dostęp do zainstalowanego serwera SVN.

Będziemy potrzebowali na naszym Pi serwer Apache. Jeśli nie mamy go zainstalowanego wykonujemy poniższe polecenie:

$ sudo apt-get install apache2 libapache2-svn

 

Teraz musimy zmienić nieco plik dav_svn.conf. Wykonajmy następujące polecenie:

$ sudo nano /etc/apache2/mods-available/dav_svn.conf

 

Na końcu pliku dodajmy następującą sekcje :

 


<Location /svn>
  DAV svn
  SVNParentPath /home/pi/svn/repos
  AuthType Basic
  AuthName "Subversion Repository"
  AuthUserFile /etc/apache2/dav_svn.passwd
<LimitExcept GET PROPFIND OPTIONS REPORT>
  Require valid-user
  </LimitExcept>
</Location>
 

  

Po zapisaniu zmian musimy zrestartować Apache:

$ sudo /etc/init.d/apache2 restart


Aby zakończyć konfiguracje musimy zmienić uprawnienia plików tak, aby nasz serwer miał dostęp do repozytoriów:

$ sudo chown -R www-data:www-data /home/pi/svn/repos


Ostatnim krokiem jest utworzenie użytkownika repozytorium:

$ sudo htpasswd -c /etc/apache2/dav_svn.passwd mort
New password:
Re-type new password:
Adding password for user mort
pi@morts-pi ~/projects/helloworld $

 

Uwaga! Ze switcha -c korzystaj tylko, gdy tworzysz nowego użytkownika, jeśli użyjesz go na użytkowniku istniejącym informacje o nim zostaną usunięte.



W tym momencie możemy sprawdzić czy nasz serwer działa poprawnie wprowadzając w przeglądarce (na innym komputerze) adres (pamiętaj, że Twój Pi może mieć inny adres IP):

http://192.168.1.111/svn/helloworld


Raspberry-Pi instalacja Subversion



piątek, 23 sierpnia 2013
Raspberry-Pi konfiguracja zdalnego dostępu cd. - wykorzystanie RDP

 

Dzisiejszy wpis adresowany jest do osób uczulonych na ‘terminal’ :)
chociaż podejrzewam, że takich jest naprawdę niewiele, zainteresowali się w końcu Pi.

Aby zalogować się do Pi zdalnie korzystają z protokołu RDP (ang. remote desktop protocol) musimy najpierw zainstalować na nim XRDP. Po raz, być może ostatni korzystając z terminala, logujemy się do naszego serwera (jeśli nie pamiętasz jak to zrobić sprawdź poprzedni wpis) i wykonujemy następujące polecenie:


$ sudo apt-get install xrdp

 

Raspberry-Pi konfiguracja zdalnego dostępu - kliknij aby powiększyć

 

 

Po kilku chwilach i udanej instalacji możemy zdalnie zalogować się do naszego Raspberry korzystając z klienta Remote Desktop bądź to dla Windows bądź dla Mac OS.

Aby uruchomić klienta w systemie Windows wystarczy z konsoli wpisać polecenie:

mstsc


Raspberry-Pi konfiguracja zdalnego dostępu

 

 Bądź wybrać aplikacje ‘Remote Desktop Connection’ z menu Start > Wszystkie Programy > Akcesoria (ang.: Start > All Programs > Accesories)

Aplikacje dla Mac OS możemy pobrać ze stron Microsoftu (link poniżej):
Microsoft Remote Desktop Connection Client for Mac 2.1.1.

Poniżej kilka screenów demonstrujących logowanie na Mac’u

 

Raspberry-Pi konfiguracja zdalnego dostępu

 

Raspberry-Pi konfiguracja zdalnego dostępu

 

Do logowania używamy oczywiście naszego normalnego loginu do Raspberry-Pi (np.: domyślny login i hasło Raspbiana pi/raspberry)

 

Raspberry-Pi konfiguracja zdalnego dostępu

 

W następnym wpisie opisze instalacje i podstawowa konfiguracje serwera Subversion.

środa, 21 sierpnia 2013
Raspberry Pi - konfiguracja zdalnego dostępu

 

Wpis dzisiejszy jest pierwszym z dwóch, może trzech, opisujących instalacją i konfiguracje serwera kontroli wersji Subversion  na Raspberry Pi. Nie jest to najoryginalniejsze zastosowanie naszego urządzona, ale może okazać się bardzo przydatne dla każdego programisty (i nie tylko). Moj działający serwer poniżej :)

 

Raspberry Pi - serwer Subversion

 

Aby zbudować sobie podobny potrzebne nam będą:

• Raspberry Pi z zainstalowanym systemem Raspbian  (adaptacja tutoriala do innych dystrybucji nie powinna nastręczyć większych problemów),

• lokalna sieć, do której będzie można podłączyć nasze urządzenie,

• komputer stacjonarny lub laptop.

Poniższe kroki opisują konfiguracje oparta na sieci przewodowej. W rozwiązaniu można wykorzystać również sieć WiFi, sposób postepowania byłby bardzo podobny, należałoby się jednak zaopatrzyć w kompatybilną z Raspberry Pi bezprzewodowa kartę sieciową.

1. Konfiguracja serwera SSH.

Do konfiguracji wykorzystamy aplikacje Raspi-config. Z terminala Raspbian wykonujemy następujące polecenie:

pi@morts-pi ~ $ sudo raspi-config

Sposród wyświetlonych pozycji wybieramy 8 - Advanced Options:


Raspberry Pi konfiguracja SSH

 

A nastepnie przechodzimy do A4 SSH - Enable/Disable remote command line access to your Pi using SSH.

 

Raspberry Pi konfiguracja SSH

 

Wybieram Enable i wciskamy Enter. Po chwili nasz serwer zostanie skonfigurowany.

 

Raspberry Pi konfiguracja SSH

 

W przypadku polaczenia przewodowego i wykorzystaniu routera z serwerem DHCP, przy domyślnych ustawieniach sieciowych Raspbian’a, już w tym momencie moglibyśmy podłączyć się zdalnie, korzystając z klienta SSH, do naszego Raspberry Pi. Oczywiście przydzielany automatycznie adres IP nie jest najlepszym rozwiązaniem.

2. Ustalenie adresu MAC Raspberry Pi:

Po zamknięciu Raspi-config, będąc ciągle zalogowanym lokalnie do naszego Pi urządzeniu, warto jest sprawdzić jak jest adres MAC jego karty sieciowej. Wykorzystamy go później do przypisania dla naszego urządzenia statycznego adresu IP na routerze. Sprawdzić to możemy wykonując poniższe polecenie.

pi@morts-pi ~ $ ifconfig



Ustalenie adresu MAC Raspberry Pi

 

 

3. Modyfikacja konfiguracji sieciowej Raspberry Pi

Zanim zaczniemy zmianę ustawień sieciowych urządzenia warto utworzyć ich kopię zapasową wywołując z konsoli następujące polecenie:

pi@morts-pi ~ $ sudo cp /etc/network/interfaces /etc/network/interfaces.backup

Zmieńmy plik ustawień następująco:

pi@morts-pi ~ $ sudo nano /etc/network/interfaces


Modyfikacja konfiguracji sieciowej Raspberry Pi

 

Aby zapisać zmiany wciśnij CTRL + X.

 

Uwaga! Przed zmianami warto zapoznać się z konfiguracja własnego serwera. Może okazać się, iż maska sieciowa (netmask) i bramka (gateway) powinny być inne. Można też oczywiście skorzystać z innego adresu IP :)

 

Skrypt do skopiowana poniżej.

auto lo

iface lo inet loopback
iface eth0 inet static
address 192.168.1.111
netmask 255.255.255.0
gateway 192.168.1.1

allow-hotplug wlan0
iface wlan0 inet manual
wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf
iface default inet dhcp


4. Restart Raspberry Pi.

Po zmianie konfiguracji sieciowej Rasperry Pi musimy go zrestartować:

pi@morts-pi ~ $ sudo shutdown –r now

5. Konfiguracja routera.

W przypadku, gdy nasz router przydziela adresy IP dynamicznie (DHCP) warto zadbać o to, aby nasz, bądź co bądź serwer :), korzystał zawsze z tego samego adresu. W moim wypadku będzie to 192.168.1.111. Zakładam w tym momencie, że osoba, która zdecydowała się na zakup Raspbery Pi ma również router, umożliwiający dokonanie odpowiednich zmian w konfiguracji routera. Routery wykorzystane przez mnie to Linksys E2000 oraz Linksys WRT54GL (poniższy screen pochodzi z pierwszego modelu).

Po zalogowaniu do naszego routera, musimy znaleźć sekcje umożliwiającą konfiguracje rezerwacji adresu DHCP. Powinno się ona znajdować na jednym z ekranów z podstawowymi ustawieniami sieci.


Konfiguracja rutera

 

Gdy już ja zlokalizujemy, w sekcji „Manually Adding Client”, musimy wybrać nazwę dla naszego urządzenia, wybrać adres IP, który chcemy by był do niego przypisywany oraz adres karty MAC, zanotowany wcześniej.

6. Logowanie zdalne do Raspberry Pi

W tym momencie możemy korzystać z naszego Pi zdalnie. Aby zalogować się do urządzenia na Mac-u musimy wydać z terminala poniższe polecenie (pamiętając oczywiście o zmianie adresu IP i nazwy użytkownika, jeśli korzystamy z innego niż domyślnie utworzony użytkownik pi:

>ssh 192.168.1.111 -l pi


Logowanie zdalne do Raspberry Pi - Mac

 

Najlepszym klientem SSH dla systemu Windows jest PUTTY.

 

Logowanie zdalne do Raspberry Pi - Windows

 

Logowanie zdalne do Raspberry Pi - Windows

 

W kolejnym wpisie opiszę instalację i konfigurację serwera Subversion, a w jednym z kolejnych jak logować się do Pi korzystając z klienta Remote Desktop (to dla osób uczulonych na terminal :)

 

poniedziałek, 19 sierpnia 2013
Co sprawdzić, jeśli nasz samochód / model RC nitro nie chce odpalić?

 

Dziś zupełnie z innej beczki :) lista rzeczy, które powinniśmy sprawdzić, jeśli nasze, sterowane
radiem, autko nie chce odpalić (dotyczy modeli nitro). Sam, co prawda w tym sezonie nie miałem żadnych problemów, ale ściągawka zawsze się przyda.

 

Co sprawdzić, jeśli nasz samochód / model RC nitro nie chce odpalić



1. Sprawdź czy świeca zapłonowa (ang.: glow plug) jest w porządku. Można to zrobić w prosty sposób wykręcając ją i przykładając do startera. Jeśli świeca zacznie się zażyć to jest w ok.

2. Jeśli linka zapłonowa (ang.: pull starter) stawia bardzo duży opór podczas prób rozruchu, może to oznaczać zalany silnik. Aby usunąć nadmiar paliwa z komory silnika, należy wykręcić święcę zapłonową, odwrócić nasz model do góry nogami i kilkakrotnie pociągnąć za linkę zapłonową. Powinno to usunąć nadmiar paliwa znajdujący się w silniku. Po oczyszczeniu silnika montujemy ponownie święcę i próbujemy uruchomić nasz model.

3. Sprawdź czy paliwo jest w porządku (jaka jest jego data ważności)? Otwarte paliwo nitro może bardzo szybko stracić swoje właściwości powodując problemy z uruchomieniem modelu, szczególnie, jeśli przechowywane było przez długi czas w bardzo zimnym lub bardzo gorącym miejscu. Warto w tym momencie rozważyć zakup nowej puszki i spróbować ponownie.

Paliwo powinno być przechowywane w chłodnym i ciemnym miejscu.



4. Sprawdź przewody paliwowe modelu. Nawet mała dziurka może spowodować problemy z zapłonem. Jeśli któryś z przewodów jest uszkodzony wymień cały komplet. Warto mieć stale w zapasie dodatkowy komplet przewodów paliwowych.


czwartek, 18 lipca 2013
Using .NET class with PowerBuilder 12.5 Classic (version 12.5.1 Build 4595)

 

Below are the steps one has to do in order to use a .NET class in a PowerBuilder classic application. I’ll be using the below .NET C# class to explain the approach:

 

using System;
using System.Runtime.InteropServices;

namespace SHARP
{
    [Guid("A08260C7-6F2D-400B-82BD-5B768CD2C1A6")]
    [ComVisible(true)]
    public class SharpClass
    {
        public int Sum(int a, int b) {
            return a + b;
        }
    }
}

 

1. IMPORTANT! The class/method should be COM visible.

This can be set up on the assembly level by editing AssemblyInfo.cs:

AssemblyInfo.cs

//Setting ComVisible to false makes the types in this assembly not visible
//to COM components.  If you need to access a type in this assembly from
//COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(true)]


// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("c814a8fa-c35f-4306-b5e5-5b30f72ab21a")]


The advantage here is we do not have to generate GUID for our class manually.

Another way is to set this up in the class code, again COM visibility is set on the assembly level:

[assembly: System.Runtime.InteropServices.ComVisible(true)]
namespace SHARP
{
   ...
}



As before, we do not have to create our own GUID in this case. The one from AssemblyInfo.cs will be used.

NOTE! We can only set the assembly level ComVisible property once either in the AssemblyInfo.cs file or a class annotation. Trying to use it twice will cause “Duplicate 'ComVisible' attribute” error.



Finally we can expose a single class/method from our assembly as shown in the very first example. In this case we should create our own GUID using Visual Studio Tools/Create GUID function:


Visual Studio - Create GUID

Visual Studio - Create GUID

 

2. Project properties need to be updated. In project’s Properties/Build/Output we have to check Register for COM interop:



Visual Studio - Register for COM interop

 

Now, if you try to build you class without exposing anything as COM visible the following warnings appear:

warning MSB3391: " SHARP.dll" does not contain any types that can be unregistered for COM Interop.



3. Now we have to register our assembly:

c:\Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe /codebase c:\Temp\SHARP\SHARP\bin\Debug\SHARP.dll /regfile:SHARP.reg

We’re using the full path to RegAsm program to avoid “Failed to load .dll because it is not a valid .NET assembly” error:

c:\Temp\SHARP\SHARP\bin\Debug>REGASM SHARP.dll /regfile:SHARP.reg
Microsoft (R) .NET Framework Assembly Registration Utility 2.0.50727.5420
Copyright (C) Microsoft Corporation 1998-2004.  All rights reserved.

RegAsm : error RA0000 : Failed to load 'c:\Temp\SHARP\SHARP\bin\Debug\SHARP.dll' because it is not a valid .NET assembly

c:\Temp\SHARP\SHARP\bin\Debug>

 
4. After we run the created .reg file we can call our .NET function from PowerBuilder:

 

integer            li_rc
oleobject          sharp

sharp = CREATE oleobject
li_rc = sharp.ConnectToNewObject ( "SHARP.SharpClass" )
li_rc = sharp.Sum(5, 1)
sharp.DisconnectObject()
DESTROY sharp

 

Downside: If PowerBuilder is open after an assembly was used the .dll stays locked even after you disconnect from the object.

wtorek, 16 lipca 2013
Programowanie iPhone - Sortowanie tablicy obiektów

 

Do sortowania tablicy obiektów możemy podejść na kilka sposobów.
Wszystkie przykłady wykorzystają poniższą klasę Trip:


@interface Trip : NSObject {
	/* trip details */
	NSInteger ID;
	NSDate *date;
	NSNumber *odometer;
NSNumber *distance;
/* ... */
}

@property (nonatomic, assign) NSInteger ID;
@property (nonatomic, retain) NSDate *date;
@property (nonatomic, retain) NSNumber *odometer;
@property (nonatomic, retain) NSNumber *distance;

/* ... */

@end

 

Najprostszym sposobem jest implementacja i wykorzystanie metody compare:

 

kod
-(NSComparisonResult) compare:(Trip *) tripObject {
	return [self.date compare:tripObject.date];
}

-(NSArray *) sortA:(NSArray *) trips {
   
   NSArray *sortedArray;
   sortedArray = [trips sortedArrayUsingSelector:@selector(compare:)];
   
   return sortedArray;
}

 

Bardzo eleganckim, lecz nieco mniej czytelnym, szczególnie dla początkujących, rozwiązaniem, jest wykorzystanie bloków:

 

kod
-(NSArray *) sortB1:(NSArray *) trips {
   
   NSArray *sortedArray;
   sortedArray = [trips sortedArrayUsingComparator:^(id a, id b) {
      NSDate *first = [(Trip *)a date];
      NSDate *second = [(Trip *)b date];
      return [first compare:second];
   }];
   
   return sortedArray;
   
}

 

Kod powyższy możemy jeszcze bardziej skondensować:

 

kod
-(NSArray *) sortB2:(NSArray *) trips {
   
   return [trips sortedArrayUsingComparator:^(id a, id b) {
      NSDate *first = [(Trip *)a date];
      NSDate *second = [(Trip *)b date];
      return [first compare:second];
   }];

}

 

Podobnym do „blokowego” rozwiązaniem jest kod oparty o NSComparisonResult, to podejście może wydać się bardziej intuicyjne i czytelniejsze dla osób mających wcześniejsze doświadczenia z językami C / Java. Poniżej dwa przykłady ilustrujące tą technikę, jeden wykorzystujący metodę sortUsingComparator: operującej bezpośrednio na tablicy wejściowej i drugi metodę sortedArrayUsingComparator: sortującą tablicę wejściową i zwracającą posortowana jej kopie:

 

-(NSArray *) sortC1:(NSMutableArray *) trips {
   
   [trips sortUsingComparator:^NSComparisonResult(id a, id b){
      
      NSDate *first = [(Trip *)a date];
      NSDate *second = [(Trip *)b date];
      
      if (first > second) {
        return (NSComparisonResult)NSOrderedDescending;
      }
      if (first < second) {
         return (NSComparisonResult)NSOrderedAscending;
      }
         return (NSComparisonResult)NSOrderedSame;
      }];

   return trips;
   
}

 

-(NSArray *) sortC2:(NSArray *) trips {
   
   NSArray *sortedArray;
   sortedArray = [trips sortedArrayUsingComparator:^NSComparisonResult(id a, id b){
      
      NSDate *first = [(Trip *)a date];
      NSDate *second = [(Trip *)b date];
      
      if (first > second) {
         return (NSComparisonResult)NSOrderedDescending;
      }
      if (first < second) {
         return (NSComparisonResult)NSOrderedAscending;
      }
      return (NSComparisonResult)NSOrderedSame;
   }];
   
   return sortedArray;
   
}

 

Jednak najprostszym, najbardziej przejrzystym i wykorzystywanym najczęściej przeze mnie sposobem sortowania jest wykorzystanie klasy NSSortDescriptor:

 

kod
-(NSArray *) sortD1:(NSArray *) trips {
   
   NSSortDescriptor *sortDescriptor;
   sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"date" ascending:YES];
   NSArray *sortDescriptors = [NSArray arrayWithObjects:sortDescriptor, nil];
   
   NSArray *sortedArray;
   sortedArray = [trips sortedArrayUsingDescriptors:sortDescriptors];
   
   [sortDescriptor release];		//not needed with ARC

   return sortedArray;
   
}

 

I na koniec nieco bardziej skomplikowany przykład sortujący w kolejności malejącej najpierw po dacie, a później po identyfikatorze ID:

 

kod
-(NSArray *) sortD2:(NSArray *) trips {
   
   NSSortDescriptor *sortDescriptorDateDesc, *sortDescriptorIDDesc;
   
   sortDescriptorDateDesc = [[NSSortDescriptor alloc] initWithKey:@"date" ascending:NO];
   sortDescriptorIDDesc = [[NSSortDescriptor alloc] initWithKey:@"ID" ascending:NO];
   
   NSArray *sortDescriptors = [NSArray arrayWithObjects:sortDescriptorDateDesc, sortDescriptorIDDesc, nil];
   
   NSArray *sortedArray;
   sortedArray = [trips sortedArrayUsingDescriptors:sortDescriptors];
   
	[sortDescriptorDateDesc release];		//not needed with ARC
	[sortDescriptorIDDesc release];			//not needed with ARC
   
	return sortedArray;
   
}
1 , 2 , 3 , 4 , 5 ... 16
Tagi




PowerBuilder Tetris
D - Tetris



Programowanie iOS

C# ToolBox

SQL / TSQL / PLSQL ToolBox

Linux / Unix ToolBox





Zaprzyjaznione Strony

Sprite Bandits

Cake Time