Komputery, oprogramowanie, internet i okolice
Kategorie: Wszystkie | Aplikacje | Blog | Dev | Hacks | Linux | Subversion | Varia | gry | khoomei | książki | mjuzik
RSS
piątek, 30 listopada 2007

1. Wersje pod kontrolą - wstęp do wersjonowania plików
2. Subversion - podstawowe pojęcia
3. Subversion - instalacja i tworzenie repozytorium
4. Subversion - podstawy pracy z wersjonowanymi plikami
5. Subversion - zaawansowane komendy
6. TortoiseSVN - graficzny klient SVN
7. RabbitVCS + Meld - integracja Subversion z Nautilusem
8. VisualSVN Server - prosta instalacja serwera Subversion
9. SVN4MSOffice - potęga Subversion w MS Word

Kontrola wersji

Brzmi groźnie. Jestem jednak przekonany, że każdy użytkownik komputera stosował już jakiś (choćby najprostszy) sposób na kontrolowanie wersji. No dobra, ale po co coś takiego w ogóle stosować?

  • gdy chcemy wiedzieć jakie zmiany i kiedy wprowadzaliśmy do danego pliku
  • gdy chcemy mieć łatwy dostęp do poprzednich wersji plików (np gdy coś "popsujemy" w aktualnie edytowanej wersji)
  • gdy chcemy porównywać różne wersje tego samego pliku

Jest to szczególnie ważne w przypadku wszelkich prac programistycznych, pisania jakichś ważnych dokumentów, nad którymi pracujemy przez dłuższy czas.

Najprostsze rozwiązania

  • zapisywanie kolejnych wersji dokumentu jako osobne pliki z numerem zmiany w nazwie. Na przykład dodając do nazwy pliku "_XX" (gdzie XX to numer). Ewentualnie dopisując aktualną datę
  • jeśli edytujemy wiele plików na raz możemy tworzyć kolejne wersje kopiując pliki do osobnych folderów z datą w nazwie
  • można sobie ułatwić życie wspomagając się prostymi skryptami jak w przykładzie na LifeHacker

Jest to rozwiązanie niezmiernie proste i stosowane przez wielu użytkowników. Sprawdzi się stosunkowo dobrze przy edycji pojedynczego dokumentu, lub małej ich liczby. W pozostałych przypadkach odczujemy jego wady:

  • mimo prostoty, jest to rozwiązanie dość żmudne. Musimy ręcznie kopiować pliki i zmieniać ich nazwy (o ile nie użyjemy skryptów automatyzujących tą pracę)
  • na dłuższą metę bardzo łatwo się pogubić
  • pliki zajmują coraz więcej miejsca. Trochę pomoże kompresowanie plików, jednak jest to dodatkowa czynność jaką należy wykonać i utrudnia to dostęp do wersjonowanych plików
  • by zobaczyć jakie zmiany wprowadziliśmy musimy zastosować dodatkowe narzędzia (np diff)
  • utrudnione przemieszczanie się pomiędzy poszczególnymi wersjami (np cofnięcie się kilka wersji w tył, wprowadzenie kilku zmian i połączenie tych zmian z wersją najnowszą)
  • bardzo trudno dodawać dodatkowe komentarze opisujące co zmieniliśmy w dokumencie
  • bardzo trudne jest sprawdzanie kiedy dodaliśmy lub skasowaliśmy, któryś z wersjonowanych plików

Dodatkowo pojawiają się problemy z pracą grupową:

  • gdy chcemy mieć pewność, że wszyscy edytujący pliki mają dostęp do ich najnowszych wersji
  • gdy chcemy wiedzieć kto wprowadził dane zmiany
  • gdy chcemy ograniczyć do minimum ilość przesyłanych danych pomiędzy edytującymi

By rozwiązać opisane problemy stworzono wiele systemów kontroli wersji. W kolejnym wpisie opisze jeden z najpopularniejszych - Subversion.

czwartek, 29 listopada 2007
Dawno temu pisałem o możliwości publikacji notek na Bloxie z użyciem Google Docs. Edytor oferowany przez firmę Google nie jest jednak jedynym tego typu narzędziem. Jednym z konkurentów jest Zoho Writer. Należy on do całej grupy aplikacji oferujących edytor tekstu, arkusz kalkulacyjny, bardzo ciekawy notatnik, program do prezentacji, wiki, bazę danych, planer i jeszcze kilka, których nie sprawdzałem.
Dopiero przed chwilą założyłem konto na Zoho i pisząc ten tekst postanowiłem potestować. Jak na razie za wiele nie mogę powiedzieć konkretnego, więc tylko spiszę pierwsze wrażenia (porównując z Google Docs):
  • o ile Google Docs to raczej taka on-line'owa wersja WordPada to Zoho Writer ma ambicje bycia edytorem tekstu
  • o ile Google Docs to głównie przygotowywanie dokumentów do publikacji on-line to Zoho Writer pozwala na określenie marginesów strony, nagłówków, stopek - czyli wszystkiego tego co potrzebne przy edycji dokumentów do druku. Plus linijka na górze strony
  • brak polskiej wersji językowej i brak sprawdzania pisowni. Zwłaszcza brak sprawdzania pisowni to dla mnie spory minus
  • chyba nie ma automatycznego zapisu. Tzn niby coś tam co jakiś czas miga sobie, jakby zapisywał ale numet wersji się nie zmienia. Dodatkowo spotkała mnie przykra niespodzianka: po kliknięciu na "History" obejrzałem sobie wcześniejsze wersje dokumentu, jednak nie byłem w stanie (albo po prostu nie wiem jak) powrócić do bieżącej edycji dokumentu, w efekcie utraciłem kilka ostatnich zdań
  • bardziej rozbudowany toolbar z moim zdaniem niezbyt czytelnymi ikonkami (można w ustawieniach włączać i wyłączać grupy ikon). Bardziej przypada mi do gustu minimalizm Google Docs
  • mimo bardziej rozbudowanego GUI zdaje się działać o wiele szybciej
  • wśród wspieranych przeglądarek nie widziałem Opery.... Będę musiał to sprawdzić w praniu
  • edytując źródło html możemy edytować zarówno body, head, jak i dołączony arkusz stylów. Prawdopodobnie będziemy więc w stanie dodać np skrypty do kolorowania fragmentów kodów źródłowych, co nie było możliwe w Google Docs
  • zakładki i możliwość edycji wielu dokumentów na raz. Ciekawe
  • eksport do większej liczby formatów. Podobnie z importem
  • edycji przez wiele osób równolegle jeszcze nie sprawdzałem
  • chyba trochę lepszy system komentowania treści
  • jest publikowanie na blogu (mam nadzieję, że się uda), jako embedded na stronie (z możliwością komentowania przez oglądających), oraz podobnie jak w Googlu via strony Writera (tyle, że dokument ma normalniejszą nazwę - ten ma adres http://writer.zoho.com/public/kosciak/Zoho-test)
  • Możliwość edycji dokumentów w trybie off-line. Swoją drogą ciekawe dlaczego Google dla Google Docs nie dodało obsługi Google Gears
Na razie wygląda całkiem ciekawie.
Jak widać na załączonym obrazku publikacja na blogu zakończyła się sukcesem. Jedynie wrzucił do pierwszej w kolejności kategorii (choć to akurat raczej wina Bloxa). Pewnie ustawienie domyślnej kategorii dla nowych wpisów pomoże.

środa, 28 listopada 2007


Autor: Alan Monnox
Tytuł: J2EE. Podstawy programowania aplikacji korporacyjnych (Rapid J2EE(TM) Development: An Adaptive Foundation for Enterprise Applications)

Co tu dużo mówić - kapitalna książka. Moim zdaniem lektura obowiązkowa dla (prawie) każdego programisty, a dla przyszłych i obecnych programistów platformy Java Enterprise Edition to już na pewno.
Znajdziemy w niej masę informacji o sposobach, technikach, metodykach projektowania i wytwarzania aplikacji korporacyjnych. Brzmi groźnie, ale większość informacji jest bardzo uniwersalna. Główny nacisk postawiono na metodyki zwinne (agile). Nie ma tu jednak mowy o nachalnej ewangelizacji. Raczej przedstawienie wad i zalet w porównaniu do metod klasycznych. Nawet jeśli sami nie zaczniemy wszystkich tych metod stosować przynajmniej będziemy mieli świadomość, że istnieją, dlaczego istnieją, jaki jest ich cel, jakie mają wady i zalety.
W książce znajdziemy:
  • co nieco o prototypach - ich rodzajach, kiedy są potrzebne
  • porównanie modelu kaskadowego, iteracyjnego, adaptywnego
  • porównanie RUP (Rational Unified Process) i XP (Extreme Programming jako przykład metodyki zwinnej - agile) - czyli dlaczego XP nie polega jedynie na niepisaniu dokumentacji
  • szybkie wprowadzenie do UML i narzędzi wspomagających modelowanie
  • co nieco o różnych generatorach kodu
  • wykorzystanie języków skryptowych (z kilkoma przykładami w Jython'ie)
  • o językach reguł
  • o programowaniu aspektowym i AspectJ
  • wskazówki dotyczące organizacji projektu, narzędziach wspomagających (Ant, Maven, Trac, etc)
  • troszkę o testowaniu
  • rozdział o TTD - Test Driven Development
  • opis środowiska Eclipse
  • pewnie jeszcze kilka rzeczy, które wypadły mi z głowy
Wszystko to całkiem sprawnie przetłumaczone i napisane dosyć strawnym językiem.

Link:
Info na stronie Helion.pl - http://helion.pl/ksiazki/j2rapi.htm
niedziela, 25 listopada 2007
Obecnie najczęściej stosowanymi bazami danych są relacyjne bazy danych. Mimo wielu niewątpliwych zalet posiadają sporo ograniczeń. Jednym z nich jest problem mapowania obiektowo-relacyjnego, czyli odwzorowania danych opisanych za pomocą języka obiektowego do postaci tabel i relacji.
Jedną z podstawowych koncepcji OOP jest dziedziczenie. Na potrzeby tego wpisu zajmijmy się prostym przykładem (zapisane w notacji UML):



Istnieją trzy podstawowe sposoby odwzorowania:

Jedna tablica dla całej hierarchii
Tworzymy jedną tablicę dla całej hierarchii obiektów zawierającą atrybuty wszystkich obiektów. Tablica taka będzie miała postać:

Osoba
OsobaID <<PK>>
TypOsoby
Nazwisko
NrIndeksu
Tytuł

OsobaID jest kluczem podstawowym, TypOsoby określa czy dana Osoba jest Studentem czy Wykładowcą.

Zalety i wady:
  • rozwiązanie jest bardzo proste
  • wszystkie Osoby posiadają unikalne ID, bez względu na podtyp
  • łatwo zmienić podtyp osoby
  • szybki dostęp do danych (zarówno wyszukiwanie jak i dodawanie)
  • łatwo dodać nową podklasę - wystarczy dodać nowy atrybut w tabeli, jednak zwiększa to ilość marnowanego miejsca
  • atrybuty nieistniejące w danej podklasie zostają wypełnione wartością NULL - marnowanie miejsca. Kłóci się z zasadami normalizacji.
  • silne powiązanie obiektów w obrębie hierarchii
Osobne tabele dla każdej z klas
Tworzymy osobne tablice dla każdej z klas. Klasy podtypów posiadają jedynie te atrybuty, które różnią je od nadklasy. Dla naszego przykładu otrzymamy:

Osoba
OsobaID <<PK>>
Nazwisko

Student
OsobaID <<PK>> <<FK>>
NrIndeksu

Wykładowca
OsobaID <<PK>> <<FK>>
Tytuł

W tabelach Student i Wykładowca atrybut OsobaID jest zarazem kluczem podstawowym jak i kluczem obcym odnoszącym się do tabeli Osoba.

Zalety i wady:
  • najlepiej odwzorowuje obiektowość danych i jest bardzo łatwo zrozumiałe
  • małe powiązanie obiektów w obrębie hierarchii - bardzo łatwo dodawać nowe atrybuty zarówno w nadklasie jak i podklasach (zmieniasz tylko jedną tabelę)
  • bardzo łatwo można tworzyć nowe podtypy
  • wszystkie Osoby posiadają unikalny identyfikator
  • powstaje duża ilość tabel w bazie
  • utrudniony odczyt (trzeba w zapytaniu połączyć dwie tabele, lub utworzyć widok/kwerendę)
  • bardzo utrudnione dodawanie i usuwanie obiektów - musimy oddawać (lub usuwać) dane do wielu tabel jednocześnie
  • trudne w implementacji
Osobne tabele dla klas konkretnych
Tworzymy osobne tabele jedynie dla klas konkretnych, pomijając klasy abstrakcyjne. Tabele podklas zawierają zarówno atrybuty nadklasy jak i własne. Dla naszego przykładu otrzymamy tabele:

Student
StudentID <<PK>>
Nazwisko
NrIndeksu

Wykładowca
WykładowcaID <<PK>>
Nazwisko
Tytuł

Zalety i wady:
  • łatwa implementacja
  • łatwy odczyt danych
  • łatwe dodawanie  i zmiana danych - wystarczy dopisać dane tylko w jednej tablicy
  • zmiana atrybutu w nadklasie wymaga zmian we wszystkich podklasach
  • jeśli jakiś obiekt będzie zarówno Studentem jak i Wykładowcą dane muszą zostać powielone pomiędzy dwoma tabelami
  • łatwo dodać nową podklasę - wystarczy dodać nową tabelę. Jednak problemy mogą się pojawić przy poprawianiu wszystkich relacji z pozostałymi tabelami w bazie
  • zarówno Studentem jak i Wykładowca posiadają osobne klucze podstawowe, trudno jest odnosić się do unikalnej Osoby. Musimy wtedy pilnować tworzenia unikalnych kluczy poza bazą
Podsumowanie
Jak widać każde z powyżej zaprezentowanych rozwiązań ma swoje wady i zalety. Każde z nich sprawdzi się w innych sytuacjach, dla innych baz danych i aplikacji.

Alternatywnym rozwiązaniem jest zastosowanie obiektowo-relacyjnej bazy danych, wspierającej dziedziczenie tabel. Przykładem takiej bazy może być PostgreSQL. Nie zawsze jednak możemy skorzystać z takiego rozwiązania.

Literatura:
1. Object-Relational Mapping Basics & Strategies
2. Mapping objects to relational databases
3. Mapping Objects to Relational Databases: O/R Mapping in details

22:31, kosciak1 , Dev
Link Dodaj komentarz »
piątek, 23 listopada 2007
O AutoHotKey pisałem w dwóch poprzednich wpisach. Nie jest to jednak jedyny darmowy program wspomagający automatyzację. Drugim jest AutoIt v3. Choć w zasadzie to AutoIt jest tym pierwszym - AutoHotKey powstał jako gałąź rozwojowa AutoIt v2 w czasie gdy prace nad AutoIt zostały wstrzymane. Natomiast AutoIt v3 to efekt przepisania sporej części kodu by poprawić wiele niedogodności AutoIt v2.
By porównać oba języki zabrałem się za przepisanie moich skryptów napisanych w AutoHotKey na AutoIt v3. Oto kilka spostrzeżeń:

AutoHotKey

  • nie bójmy się tego powiedzieć, AutoHotKey ma koszmarną składnię... Etykiety (Labels), funkcje (Functions), wyrażenia (Expressions), komendy(commands), if'y z i bez nawiasów klamrowych - wszystko to wymieszane
  • z drugiej strony ten misz-masz daje, wbrew pozorom, po zrozumieniu składni sporą siłę wyrazu
  • dyrektywy #IfWinActive określające dla jakich okien dany HotKey czy HotString ma działać
  • dyrektywa #SingleInstance pilnująca by wykonywana była tylko jedna kopia skryptu, można określić co zrobić gdy pojawi się kolejna
  • brak Switch'a
AutoIt v3
  • bardziej sformalizowana BASIC-owata składnia
  • wymusza to stosowanie tych wszystkich EndIf, EndFunc, WEnd... IMHO mniej czytelne od nawiasów klamrowych, ale ja po prostu umiarkowanie lubię składnię BASICa
  • ze względu na składnię
  • jest Switch i Select
  • brak HotStringów
  • nie wszystkie funkcje (czy raczej komendy) znane z AutoHotKey są w AutoIt (i vice versa!) np sprawdzenie czy CapsLock jest wciśnięty nie było takie proste
  • nie znalazłem odpowiednika SetTimer (AdlibEnable, AdlibDisable dadzą podobną funkcjonalność) czy funkcji substring
  • by skrypt był cały czas wykonywany trzeba stosować nieskończoną pętlę na zasadzie While 1 ...kod... Sleep(100) WEnd
  • Nie można restartować skryptu z menu ikonki w trayu
Wymagania pamięciowe wydają się podobne.
Nie wiem jeszcze jak wygląda porównanie budowania GUI.

Wydaje się więc, że wybór pomiędzy AutoHotKey a AutoIt v3 to kwestia wyboru składni i/lub potrzeby wykorzystania HotStringów

środa, 21 listopada 2007
W poprzednim wpisie wspominałem o AutoHotKey. Dzisiaj mogę pochwalić się małym zestawem skryptów mojego autorstwa.
Cały zestaw dostępny jest na stronie http://code.google.com/p/kosciak-autohotkey/ Do pobrania gotowa paczka (w dziale Downloads) oraz dostęp do źródeł via SVN.
W zestawie mamy:
  • KeyboardShortcuts

    Alt+Capslock - minimalizuje okno
    Shift+Win+A - otwiera A:\
    Shift+Win+C - otwiera C:\
    Shift+Win+D - otwiera D:\
    Shift+Win+F - otwiera F:\

  • TildaConsole

    Oparty na Quake style command prompt i dostosowany do Console2 (w katalogu ze skryptem jest plik konfiguracyjny Console)
    Win+Tilda - otwiera/zamyka Console
    Ctrl+Tilda (w Eksploratorze) - otwiera Console dla bieżącego katalogu
    Esc (w oknie Console) - zamyka Console
    Ctrl+V (w oknie Console) - wkleja tekst ze schowka

  • OSDVolumeDisplay



    Win+Plus - głośniej
    Win+Minus - ciszej
    Win+0 (Zero) - włącz/wyłącz dźwięk

  • CapsLockIcon

    Pokazuje ikonę w trayu i ostrzeżenie gdy zostanie włączony CapsLock



Dodatkowo mogę polecić:

DimScreen - przyciemnianie ekranu
ShowDialogsToo - okienka dialogowe widoczne w pasku zadań
SmartGUI - narzędzie do budowy GUI w AutoHotKey
Weather - prognoza pogody
Functions - komendy AutoHotKey jako funkcje
Texter - zarządzanie szablonami

niedziela, 18 listopada 2007
Z programem AutoHotKey spotkałem się już kilka razy na łamach LifeHacker'a jednak dopiero dzisiaj zdecydowałem się go zainstalować. I z pewnością szybko go nie odinstaluje. Ale do rzeczy...
AutoHotKey to interpreter makr (czy też skryptów) dla Windowsa. Makra możemy nagrywać, samemu napisać (w stosunkowo prostym języku) oraz kompilować do plików wykonywalnych. Wbrew pozorom możliwości są naprawdę spore. Makrem może być proste przypisanie jakiejś akcji pod kombinację klawiszy, jak również bardziej złożony program z GUI. Co najważniejsze AutoHotKey jest całkowicie darmowy i przenośny (portable).

No dobra, ale po co mi jakieś makra? Na przykład:
  • uruchamiać różne aplikacje za pomocą dowolnych skrótów klawiszowych
  • zmieniać działanie klawiszy, np: by stworzyć swój własny układ klawiatury
  • przyśpieszyć dostęp do różnych elementów systemu
  • tworzyć dowolne szablony, działające w dowolnych edytorach tekstu
  • automatyzować rutynowe czynności
  • pisać różne ułatwiające życie programy, czy prototypy
Sporo przykładów można znaleźć w dołączonym do programu Helpie oraz na Wiki. Sporo ciekawych narzędzi jest na stronie 1 Hour Software. Warto też poszukać na LifeHackerze (np za Texterem).
Ja dostosowałem sobie skrypt włączający konsolę w stylu Quake'a, dodałem kilka skrótów klawiszowych (np przypisanie minimalizacji okna do Alt-Capslock) oraz napisałem skrypt do obsługi głośności z klawiatury.

czwartek, 15 listopada 2007
A teraz...

Numer 1.
Modrzew



Po tym skróconym kursie rozpoznawania drzew na odległość możesz obejrzeć jeden ze stu pięćdziesięciu skeczy Monty Pythona.

A teraz coś z zupełnie innej beczki...
środa, 14 listopada 2007
O mojej przesiadce na Thunderbirda pisałem już wcześniej. Pora na kilka spostrzeżeń, uwag:
  • Google rozwiązało już problem z niewyświetlaniem pliterek w mailach oglądanych przez IMAP. Można już więc spokojnie ściągać wszystkie maile na dysk w celach archiwizacyjnych
  • Testowo zainstalowałem Right Click Watch Ignore - rozszerzenie ułatwiające oznaczanie wątków jako obserwowane albo ignorowane
  • O ile filtry poczty są stosunkowo rozbudowane to filtry grup news kuleje. I to bardzo kuleje. Mogę filtrować tylko po dacie, temacie, nadawcy. To trochę mało. Zwłaszcza jak sobie przypomnę rozbudowany scorefile w slrn'ie... Nie jestem więc w stanie oznaczać specjalną etykietą np: bezpośrednich odpowiedzi na moje posty, pośrednich odpowiedzi na moje posty.
  • Przyzwyczajenia do często stosowanych skrótów klawiszowych (klawiaturowych?) są bardzo silne. Niestety w Thunderbirdzie nic nie można zmienić
  • Niemożność zasubskrybowania grupy bez wcześniejszego pobrania całej listy grup może uniemożliwić zasubskrybowanie jakiejkolwiek grupy przy wolnym łączu i serwerze z dużą ilością grup
  • IMAP jest kapitalnym rozwiązaniem!
  • Czasem wyskakuje ikonka nowych maili lecz nigdzie na liście folderów nie widać gdzie ta nowa wiadomość się pojawiła...
  • Źle zlicza ilość nowych maili - jeśli coś jest w Odebranych i w folderze (etykiecie na Gmailu) Znajomi to pokaże 3 nowe wiadomości (bo jeszcze w folderze Wszystkie) - trochę to denerwujące
  • By dodać własne nagłówki do wysyłanych wiadomości (na przykład X-Face) trzeba wybrać:
    Narzędzia -> Opcje -> Zaawansowane -> Ogólne -> Edytor ustawień -> prawy klawisz, Dodaj ustawienie typu łańcuch (string) -> wpisać mail.identity.idX.headers (gdzie idX to numer konta, lub użyć default dla wszystkich kont) -> wpisać X-Face
    prawy klawisz, Dodaj ustawienie typu łańcuch (string) -> wpisać mail.identity.idX.header.X-Face -> wpisać X-Face: znaczki X-Faceowe
  • By generować własne Message-ID udajemy się do edytora ustawień i:
    prawy, Dodaj ustawienie typu wartość logiczna -> wpisać mail.identity.idX.generate_news_message_id -> wybrać true
    prawy, Dodaj ustawienie typu łańcuch -> wpisać mail.identity.idX.FQDN -> wpisać własne FQDN (czyli to co za znakiem @ w Message-ID)

niedziela, 11 listopada 2007
Jedną z bolączek systemu Windows jest bardzo uboga konsola, z małą ilością dostępnych poleceń. Można temu jednak łatwo zaradzić wykorzystując porty Unixowych narzędzi (lista po polsku).
Do najważniejszych można chyba zaliczyć: diff, patch, ls, grep, less, awk, sed, touch, wc, pwd

Cygwin

Strona domowa: http://www.cygwin.com/
Wiki [EN]: http://en.wikipedia.org/wiki/Cygwin
Wiki [PL]: http://pl.wikipedia.org/wiki/Cygwin

Jest to nie tyle port samych narzędzi co całe środowisko. Mamy do dyspozycji Bash oraz wirtualny Unixowy system plików.

GnuWin32
Strona domowa: http://gnuwin32.sourceforge.net/
Wiki [EN]: http://en.wikipedia.org/wiki/GnuWin32

Port samych narzędzi. Dostępne w oddzielnych pakietach, wraz z dokumentacją, więc możemy sobie zainstalować tylko potrzebne nam programy.

UnxUtils
Strona domowa: http://sourceforge.net/projects/unxutils
Wiki [EN]: http://en.wikipedia.org/wiki/UnxUtils

Kolejny zestaw sportowanych narzędzi. Niestety dawno nie aktualizowany i w większości wypadków mamy do czynienia ze starszymi wersjami niżw w GnuWin32.

msls
Strona domowa: http://utools.com/msls.asp

Zawiera tylko dwa narzędzia ls oraz grep. Za to pozwala na kolorowanie wyników.
 
1 , 2
Spis Treści
Kanały RSS
Add to Google
Add to Netvibes