środa, 26 listopada 2014

Flashing BIOS on Laptop Asus Eee PC 1001HA

Upgrading BIOS is dangerous and can cause fatal damage to your PC. If you are aware of that and decide to take this risk, then continute.

1. Visit http://support.asus.com/download/download.aspx?SLanguage=en-us, search 1001HA and choose DOS or WinXP, etc. as operating system. Expand BIOS tree and download latest bios rom file.

2. Save and extract the downloaded file. You will get a rom file named like "1005HA-ASUS-1601.ROM"

3. Rename the extracted file to 1005HA.ROM

4. Now is most problematic step. Format your pendrive, sdcard to FAT16 partition.


If you have pendrive formatted to other than FAT16, your flashing stuck on: Reading file "1005HA.ROM" or you will get message: USB Device not found!
You can turn off your laptop when stuck there and try make compatible pendrive.
Bad formatted FAT16 can send message like: Reading file "1005HA.ROM"
File "1005HA.ROM" not found on USB Device!

Like on screen below.




You will need GParted for propertly format your pendrive. You can find it here:

GParted download

Best way is make bootable LiveCD with GParted.
When you turn on GParted, select your pendrive on right-top corner mostly named sdb1, and just delete located space on him by clicked RMB and Delete on partition, and then click RMB > New and set options like on screen below:




Most important thing is:

- New Size, can't be too large just put there 128MiB
- File system, as we knew: FAT16
- Align to: Cylinder

Press add and apply your changes.
Well you have formatted pendrive.


5. Copy your ROM file on new formatted pendrive.

6. Plug-in pendrive to laptop and press [Alt] + [F2] before splash screen appear.

7. It takes a few seconds for me. Remember, DON'T turn off your laptop during re-programming BIOS!




8. After updated BIOS you will be notified that you can shut down your laptop.

piątek, 24 października 2014

Tworzenie serwisu zarządzającego

1. Tworzymy plik konfiguracyjny, który pozwoli na połączanie z bazą MySQL. Najlepiej umieścić poza katalogiem ze stroną.
<?php
$host = "localhost";
$db_user = "root";
$db_pwd = "YOURPASS";
$db_name = "zseu";
$connection = mysql_connect($host, $db_user, $db_pwd);
if (!$connection) die('Could not connect: ' . mysql_error());
$db_selected = mysql_select_db($db_name, $connection);
if (!$db_selected) die ('Nie można ustawić '.$db_name.' : ' . mysql_error());
?>
Zapisujemy go na serwerze www ( /var/www ), jako config.inc

2. Strona główna wygląda następująco:

<?php
(@include_once('../config.inc')) or die ("Brak pliku konfiguracyjnego");
?>
<!doctype html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Naprawa sprzętu</title>
</head>
<body>
<table border="1">
    <tr>
<td>Lp.</td>
<td>Nazwa sprzętu</td>
<td>KS</td>
<td>Data zgłoszenia</td>
<td>Data naprawy</td>
<td>Data zwrotu</td>
<td>Serwis</td>
    </tr>
<?php
$q = mysql_query("SELECT * FROM naprawa");
$lp = 0;
while($row =  mysql_fetch_assoc($q))
{
    $lp++;
    echo "<tr>
<td>$lp</td>
<td>$row[nazwa_sprzetu]</td>
<td>$row[ks]</td>
<td>$row[data_zgloszenia]</td>
<td>$row[data_naprawy]</td>
            <td>$row[data_zwrotu]</td>
<td>$row[serwis]</td>
</tr>";
}
?>
</table>
<a href="/admin" alt="Panel administracyjny">Panel administracyjny</a>
</body>
</html>

Tworzenie bazy pod serwis zarządzający

1. Tworzymy bazę
mysql -u root -p -e 'create database zseu'
2. Logujemy się do MySQL
mysql -u root -p
3. Tworzymy wcześniej zaplanowaną strukturę bazy danych
use zseu;
CREATE TABLE naprawa (
id INT NOT NULL AUTO_INCREMENT,
nazwa_sprzetu VARCHAR(100) NOT NULL,
ks VARCHAR(40) NOT NULL,
data_zgloszenia DATETIME,
data_naprawy DATETIME,
data_zwrotu DATETIME,
serwis VARCHAR (20) NOT NULL,
PRIMARY KEY (id));
4. Sprawdzamy rezultat
DESC naprawa;
5. Tworzymy kolejną tabelę z nazwą serwis
CREATE TABLE serwis (
id INT NOT NULL AUTO_INCREMENT,
nazwa_serwisu VARCHAR(100) NOT NULL,
telefon VARCHAR(255) NOT NULL,
PRIMARY KEY (id));
DESC serwis; 
6. Tworzymy ostatnia tabelę z danymi logowania administratorów do panelu.
CREATE TABLE users (
id INT NOT NULL AUTO_INCREMENT,
login VARCHAR(100) NOT NULL,
password CHAR(32) NOT NULL,
isAdmin tinyint(1) DEFAULT 0 NOT NULL,
PRIMARY KEY (id));
DESC users; 
7. Tworzymy pierwszego administratora strony:
 insert into users (login, password, isAdmin) VALUES ('admin', MD5('YOURPASS'), 1); 

3. Tworzenie serwisu zarządzającego

Instalacja PHP, MySQL i Apache

1. Instalacja, uruchomienie oraz dodanie do autostartu serwera Apache
yum install httpd
service httpd start
chkconfig httpd on
2. Odblokowujemy port 80 w firewall'u
iptables -I INPUT 5 -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
service iptables save
service iptables restart
3. Sprawdzamy czy serwer funkcjonuje poprawnie wpisując w przeglądarkę IP serwera
ifconfig eth0 | grep inet | awk '{ print $2 }'
4. Instalacja MySQL
yum install mysql-server
service mysqld start
chkconfig mysqld on

4a. Zakładamy hasło dla użytkownika root w MySQL
mysqladmin -u root password YOURPASS
5. Instalacja PHP
yum install php php-mysql
6. Załączamy raportowanie błędów w apache w pliku php.ini, znajdujemy jego lokalizację i edytujemy:
php -i | grep "php.ini"
display_errors = On
7. Instalacja potrzebnych modułów
yum search php-
8. Pierwszy plik php na serwerze
/var/www/html/index.php

############## Zawartość pliku index.php ##############
<?php
phpinfo();
?>
##################################################

service httpd restart

2. Tworzenie bazy pod serwis zarządzający

poniedziałek, 14 lipca 2014

Wake On Lan (WOL) - Lokalne włączanie komputerów

Wake On Lan to metoda włączania komputerów poprzez sieć lokalną (LAN).
Polega ona na wysłaniu Magic Packet do karty sieciowej, która przesyła informację do płyty głównej o potrzebie załączenia się. Jeżeli chodzi o laptopy to ta funkcja również jest dostępna tylko musi mieć zewnętrzne źródło zasilania, na baterii funkcja WOL nie działa.

Chcąc załączyć komputer, musimy znać jego MAC adres karty sieciowej.

Z programistycznego punktu widzenia, potrzebujemy napisać program, który będzie wyśle najpierw 0xFFFFFFFFFFFF, a następnie 16x Mac adres - na podany mac adres.

Dla design'u aplikacji wystarczy TextBox i Button.

Tworzymy event dla przycisku:
private void button1_Click_1(object sender, EventArgs e)
{
    try
    {
        SendMagicPacket(textBox1.Text);
        MessageBox.Show("Packet Sent to " + textBox1.Text);
    }
    catch (Exception ex) { MessageBox.Show("Error:\n\n" + ex.Message, "Error"); }
}

Przycisk jest już gotowy, pozostała tylko funkcjonalność:
public static void SendMagicPacket(string macAddress)
{
    if (!Test(macAddress))
        throw new ArgumentException("Niepoprawny MAC adres", "macAddress", null);

    byte[] mac = ConvToByte(macAddress);
    WakePC(mac);
}

Musimy też sprawdzić czy wprowadzony mac adres jest poprawny, jak widać powyżej jest funkcja Test().
public static bool Test(string macAddress)
{
    var valid_chars = "0123456789ABCDEFabcdef";
    if (string.IsNullOrEmpty(macAddress)) return false;
    if (macAddress.Length != 12) return false;
    foreach (var c in macAddress)
    {
        if (valid_chars.IndexOf(c) < 0) { return false; }
    }
    return true;
}
Gdy nasz Mac adres jest poprawny, to rozkładamy go na bajty funkcja ConvToByte():
public static byte[] ConvToByte(string macAddress)
{
    byte[] mac = new byte[6];
    if (!Test(macAddress))
        throw new ArgumentException("Niepoprawny MAC adres", "macAddress", null);

    for (var i = 0; i < 6; i++)
    {
        var t = macAddress.Substring((i * 2), 2);
        mac[i] = Convert.ToByte(t, 16);
    }
    return mac;
}
Ostatnim krokiem będzie wysłanie, przed chwilą otrzymanych bajtów, do karty sieciowej, ale przed tym jeszcze sprawdzenie czy nasze bajty zostały poprawnie przekonwertowane.
public static bool TestByteArray(byte[] macAddress)
{
    if (macAddress == null) return false;
    if (macAddress.Length != 6) return false;
    return true;
}
public static void WakePC(byte[] macAddress)
{
    if (!TestByteArray(macAddress))
        throw new ArgumentException("Niepoprawny MAC adres", "macAddress", null);

    using (UdpClient client = new UdpClient())
    {
        client.Connect(IPAddress.Broadcast, 40000);
        byte[] packet = new byte[17 * 6];
        for (int i = 0; i < 6; i++) { packet[i] = 0xFF; }
        for (int i = 1; i <= 16; i++)
        {
            for (int j = 0; j < 6; j++)
            {
                packet[i * 6 + j] = macAddress[j];
            }
        }
        client.Send(packet, packet.Length);
    }
}
Poniżej obrazek jak aplikacja wygląda i jak powinno się wpisywać Mac adres :)



Enjoy !

poniedziałek, 5 maja 2014

WPF Canvas - Hexstring to image

Jak odczytać obrazek zapisany na przykład w MSSQL?
Można na dwa sposoby.

Pierwszy sposób polega na skopiowaniu z bazy hex stringu i wstawienie go do DrawImage(), który później za pomocą HexStringToBytes() jest konwertowany do byte[].

public void DrawImage(string hexvalue)
{
    canvas1.Children.Clear();
    byte[] byBitmap = HexStringToBytes(hexvalue);

Drugim sposobem jest połączenie się do bazy MSSQL z poziomu programu i wykonanie odpowiednich zapytań, aby odnieść się do komórki z naszym obrazkiem, tzw. Binary Data.
Tutaj już nie korzystamy z HexStringToBytes(), tylko po odpowiednim zapytaniu odwołujemy się do kolumny "pic", gdzie jest zapisany obrazek.

public void DrawImage()
{
    //Połączenie z bazą + zapytanie
    canvas1.Children.Clear();
    byte[] byBitmap = (byte[])result["pic"];


Poniższy przykład przedstawia narysowanie obrazku w canvas z hexstringu.

public void DrawImage(string hexvalue)
{
    canvas1.Children.Clear();
    byte[] byBitmap = HexStringToBytes(hexvalue);
    var Bitmap = ImageFromBuffer(byBitmap);

    Image NewImg = new Image();
            
    double maxX = canvas1.Width = Bitmap.Width;
    double maxY = canvas1.Height = Bitmap.Height;

    NewImg = new Image();
    NewImg.Source = Bitmap;
    NewImg.Width = Bitmap.Width;
    NewImg.Height = Bitmap.Height;
    Canvas.SetLeft(NewImg, 0);
    Canvas.SetTop(NewImg, 0);
    canvas1.Children.Add(NewImg);
}

public BitmapImage ImageFromBuffer(Byte[] bytes)
{
    MemoryStream stream = new MemoryStream(bytes);
    BitmapImage image = new BitmapImage();
    image.BeginInit();
    image.StreamSource = stream;
    image.EndInit();
    return image;
}

byte[] HexStringToBytes(string hex)
{
    return Enumerable.Range(0, hex.Length)
                 .Where(x => x % 2 == 0)
                 .Select(x => Convert.ToByte(hex.Substring(x, 2), 16))
                 .ToArray();
}