JScript Dot_NET GUI example

За да се програмира под .NET платформата е достатъчно да се инсталира някоя версия на фреймърка.
След инсталацията на .NET фреймуърк автоматично се инсталират няколко компилатора:
csc.exe – компилатор за C Sharp (C#)
jsc.exe – компилатор за JScript .Net
vbc.exe – компилатор за Visual Basic .Net

В момента имам инсталиран .Net framework 2.0 и работя с него, но предполагам, че и при по-новите версии ситуацията ще е подобна. Компилаторите се намират в директорията: C:\WINDOWS\ServicePackFiles\i386>
Аз харесвам JScript като структуриране на програмите и ще използвам него за конкретния пример. Както и в други GUI-примери, ще използвам и сега примерна програма за конвертиране на температура от Целзий до Фаренхайт.
Преди да поставя реалния код, ще покажа базов, рамкиращ код за това как се програмира подобна програма с графичен интерфейс:

import System;
import System.Drawing;
import System.Collections;
import System.Windows.Forms;
import System.ComponentModel;
import Accessibility;
 
public class Exercise extends System.Windows.Forms.Form {
    // var ...;
 
	function Exercise(){
		InitializeComponent();
		this.button1.add_Click(this.button1_Click);
	}
 
	function button1_Click(sender : Object, e : System.EventArgs){
		//...
	}
 
	function InitializeComponent(){
		// iniciirat se wsi4ki komponenti ot GUI-to
		this.textBox1 = new System.Windows.Forms.TextBox();
		// ...
	}
}
var frmPledge : Exercise = new Exercise();
frmPledge.ShowDialog();

На база на този пример попълваме целия необходим код. Помогнах си за интерфейса с SharpDevelop 3.2 – чудесна програма за .NET програмиране. За съжаления програмата нативно не поддържа JScript, за това от нея копирам само кода за формата, като леко го промених. Програмата изглежда така:
faren_to_celsius

Кода е сравнително лесен за писане и разбиране. Самото exe е едва 8kb. С включения сорс код може да се изтегли от тук: fahrenheit to celsius

import System;
import System.Drawing;
import System.Collections;
import System.Windows.Forms;
import System.ComponentModel;
import Accessibility;
 
public class Exercise extends System.Windows.Forms.Form {
    var button1  : System.Windows.Forms.Button;
    var textBox1 : System.Windows.Forms.TextBox;
    var textBox2 : System.Windows.Forms.TextBox;
 
	function Exercise(){
		InitializeComponent();
		this.button1.add_Click(this.button1_Click);
	}
 
	function button1_Click(sender : Object, e : System.EventArgs){
		var Faren : double;
		var Celsius : double;
		Faren = ConvertToDouble(this.textBox1.Text);
		if(!isNaN(Faren)){
			Celsius = (Faren - 32)*5/9;
			this.textBox2.Text = Celsius.ToString();
		} else {
			this.textBox2.Text = "Wrong format";
		}
	}
 
	function ConvertToDouble(valueto){
		var ddd = valueto.ToString(System.Globalization.CultureInfo.InvariantCulture)
		return ddd;
	}
 
 
	function InitializeComponent(){
		// iniciirat se wsi4ki komponenti ot GUI-to
		this.textBox1 = new System.Windows.Forms.TextBox();
		this.button1 = new System.Windows.Forms.Button();
		this.textBox2 = new System.Windows.Forms.TextBox();
		this.SuspendLayout();
		// 
		// textBox1
		// 
		this.textBox1.Location = new System.Drawing.Point(12, 12);
		this.textBox1.Name = "textBox1";
		this.textBox1.Size = new System.Drawing.Size(100, 20);
		this.textBox1.TabIndex = 0;
		// 
		// button1
		// 
		this.button1.Location = new System.Drawing.Point(118, 10);
		this.button1.Name = "button1";
		this.button1.Size = new System.Drawing.Size(75, 23);
		this.button1.TabIndex = 1;
		this.button1.Text = "Convert";
		this.button1.UseVisualStyleBackColor = true;
		// 
		// textBox2
		// 
		this.textBox2.Location = new System.Drawing.Point(199, 12);
		this.textBox2.Name = "textBox2";
		this.textBox2.Size = new System.Drawing.Size(100, 20);
		this.textBox2.TabIndex = 2;
		// 
		// MainForm
		// 
		this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
		this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
		this.ClientSize = new System.Drawing.Size(311, 46);
		this.Controls.Add(this.textBox2);
		this.Controls.Add(this.button1);
		this.Controls.Add(this.textBox1);
 
		this.Name = "Exercise";
		this.Text = "faren_to_celsius";
		this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
		this.MaximizeBox = false;
		this.MinimizeBox = false;
	}
}
 
var frmPledge : Exercise = new Exercise();
 
frmPledge.ShowDialog();

За да се компилира този код до изпълнимо exe правим следното:

  • запазваме сорс-кода в файла, примерно far_to_cel.js
  • отваряме команден прозорец cmd (Start -> Run -> cmd). Или натискаме шифт и кликаме в директорията със сорс-кода, след това избираме “Open command window here”.
  • след като сме позиционирали cmd в директорията със сорс-файла ще трябва да извикаме компилатора jsc.exe:
    C:\Windows\Microsoft.NET\Framework\v4.0.30319\jsc.exe /t:winexe far_to_cel.js

Ако не се покаже грешка, значи сме компилирали всичко нормално.

===================

Прилагам същата програмка, но написана на C#:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
using System;
using System.Windows.Forms;
using System.Drawing;
using System.Text.RegularExpressions;
using System.Globalization;
 
public class CelToFar : Form {
 
  Button button1;
  TextBox textBox1;
  TextBox textBox2;
 
  public CelToFar() {
    button1 = new Button(); 
    button1.Text = "Calculate";
    button1.AutoSize = false;
    button1.Location = new Point(80, 15);
    button1.Size = new Size(75, 23);
 
    textBox1 = new TextBox();
    textBox1.Location = new Point(12, 12);
    textBox1.Name = "textBox1";
    textBox1.Font = new Font("Microsoft Sans Serif", 14F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
    textBox1.Size = new Size(60, 40);
    textBox1.Text = "";
 
    textBox2 = new TextBox();
    textBox2.Location = new Point(165, 12);
    textBox2.Name = "textBox2";
    textBox2.Font = new Font("Microsoft Sans Serif", 14F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
    textBox2.Size = new Size(60, 40);
    textBox2.Text = "";
 
    button1.Click += new EventHandler(ButtonClicked);
 
    this.Controls.Add(button1);
    this.Controls.Add(textBox1);
    this.Controls.Add(textBox2);
 
    this.Height = 120;
    this.Width = 255;
    this.StartPosition = FormStartPosition.CenterScreen;
    this.Visible = true;
  }
 
  public void ButtonClicked(object source, EventArgs e) {
    string FarenTxt = this.textBox1.Text;
    double Faren;
    double Celsius;
    Regex rgx = new Regex(@"^[\d\.]*$");
 
    if(rgx.IsMatch(FarenTxt) && !String.IsNullOrEmpty(FarenTxt)){
      Faren = Convert.ToDouble(FarenTxt, CultureInfo.InvariantCulture);
      Celsius = (Faren - 32)*5/9;
      this.textBox2.Text = System.Math.Round((decimal)Celsius, 3).ToString(CultureInfo.InvariantCulture);
    } else {
      this.textBox2.Text = "Wrong format";
    }
  }
 
  static void Main() {
    Application.Run(new CelToFar());
  }
}

Запазваме файла с името Far_to_celsius.cs, след което компилиарнето на кода става по подобен начин:

1
C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe /t:winexe Far_to_celsius.cs

wxPerl example TextCtrl – Button getValue(), appendValue()

Един интересен пример с WxPerl, който може да ми е полезен, ако реша да програмирам GUI за Windows.
За примера съм инсталирал:
Perl 5.10.1.1008 в директорията D:\installed\perl
Wx 0.9914
Alien-wxWidgets 0.61
Win32-GUI 1.06

Целия пакет с разни други полезни модули може да се изтегли от тук:
ActivePerl-5.10.1.1008-Win32+Win32GUI+WxPerl.rar

Програмата в примера не прави нищо собено, но е достатъчна базова информация, за да се започне скромна диалогова програмка. В общи линии, при натискане на бутон взима текста от едното поле и го добавя към другото поле:

#!/usr/bin/perl -w
use strict;
use Wx;
 
package MyFrame;
 
use Wx qw (wxVERTICAL wxTOP wxGROW wxHORIZONTAL wxTE_MULTILINE wxFIXED_MINSIZE wxLEFT );
use base 'Wx::Frame';
# import the event registration function
use Wx::Event qw(EVT_BUTTON);
 
sub new {
    my $ref = shift;
    my $self = $ref->SUPER::new( undef,           # parent window
                                 -1,              # ID -1 means any
                                 'wxPerl rules',  # title
                                 [-1, -1],        # default position
                                 [430, 360],      # size
                                 );
 
    my $panel = Wx::Panel->new( $self,            # parent window
                                -1,               # ID
                                );
    my $button = Wx::Button->new( $panel,         # parent window
                                  -1,             # ID
                                  'Click me!',    # label
                                  [30, 20],       # position
                                  [-1, -1],       # default size
                                  );
    $self->{txt} = Wx::TextCtrl->new(
            $panel,                      # parent window
            -1,                         # control identifier
            "Type your message here",   # default text value
            [10, 50],              # text control position [x, y]
            [400, 20],                  # text control size [width, height]
                         # style: wxTE_MULTILINE=The text control allows multiple lines
    );
    $self->{txt2} = Wx::TextCtrl->new(
            $panel,                      # parent window
            -1,                         # control identifier
            "",   # default text value
            [10, 100],              # text control position [x, y]
            [400, 200],                  # text control size [width, height]
            wxTE_MULTILINE, #=The text control allows multiple lines   style => wxTE_MULTILINE
    );
 
    # register the OnClick method as an handler for the
    # 'button clicked' event. The first argument is a Wx::EvtHandler
    # that receives the event
    EVT_BUTTON( $self, $button, \&OnClick );
 
    return $self;
}
 
# this method receives as its first parameter the first argument
# passed to the EVT_BUTTON function. The second parameter
# always is a Wx::Event subclass
sub OnClick {
    my( $self, $event ) = @_;
 
    if (my $rr = $self->{txt}->GetValue()) {
        print $rr."\n";
 
		$self->{txt2}->AppendText($rr."\n");
    }
 
    $self->SetTitle( 'Clicked' );
}
 
package MyApp;
use base 'Wx::App';
 
sub OnInit {
    my $frame = MyFrame->new;
    $frame->Show( 1 );
}
 
package main;
 
my $app = MyApp->new;
$app->MainLoop;

wx_example

Кода може да се компилира с Cava Packager 2.0. Това чудо прави страхотни екзета от Perl-скриптове, като добавя всички необходими модули.

Лесно генериране и помнене на сложни пароли

1. Използване на клавиатурата
Този метод се базира на стандартните клавиатури за PC. Естествено трябва да се запомни нещо простичко. Примери:
1.1. Запомняме буквата “T по часовниковата стрелка” без Shift и с Shift. Получават се символите:
6ygfr^YGFR

1.2. Запомняме “2 по диагонал” без Shift и с Shift
2wsx#EDC

1.3. Запомняне на 2 букви “RO по часовниковата” без Shift и с Shift
5tfde)PLKI

Изключително лесен метод за запомняне на сложни пароли! А вариантите са безкрайни.

2. Парола по лични данни
Можете да правите различни комбинации от личните си данни. Примерно с името и ЕГН-то
Да речем, че името ви на латински е: Lambri Lazarov
А ЕГН-то ви е: 7404113358
Можете да запомните “първите три” и примерна парола може да е:
първите три букви от името: Lam
първите три цифри от ЕГН-то: 740
първите три букви от фамилията: Laz
Паролата става: Lam740Laz

Може да се комбинира и с последните три: bri358rov
Или всякакви други комбинации, примерно първите три, средните четири, последните три: Lam4113rov

3. Парола по таблица с лични данни
В този случай пак лесно и достъпно можете да запомните паролата си. Примерно помните първите 4 колони:
LL7aa4mz0ba4

Получи се идеална 12-символна парола с малки и големи букви и цифри! Естествено отново могат да се правят всякакви комбинации.

Към техниките от т.1 и т.2 могат да се добавят и други данни, които винаги са ви в главата. Примерно град на раждане, презимето и т.н.

4. Използване на криптиращ алогитъм.
Отново много простичък метод, който обаче изисква да имате под-ръка интернет или криптираща програма, ако забравите паролата.
За начало можем да потърси в google за някакъв генератор на чек-суми по дума. Пълно е с такива за MD5 и SHA1 криптиращи алгоритми. Ето два примерни за MD5:
http://www.miraclesalad.com/webtools/md5.php
http://www.md5.cz/
С помощта на генератора генерирах чек-стринг на малкото име “lambri”. Резултата е:
948a01f083bd635e81acaa336e3ba4a4
Сега от тази поредица символи можем да вземем първите 10 символа и имаме готова достатъчно сигурна парола “948a01f083“.
Ако я забравим, ще е достатъчно да потърсим в google отново за md5-генератор и да напишем “lambri”. MD5-генератори има вградени във всяка Linux дистрибуция, може да се изтегли такъв и за Windows, така, че да не зависим от интернет.
Има и удобни хеш-генератори за телефони, които също могат да се използват. Лично аз ползвам HashDroid за Android
HashDroid MD5 Sum
Целия стринг може да се принтира и да си го сложите в портфейла, като само вие ще знаете кои точно символи използвате за парола.

5. Карти с пароли от passwordcard.org
Тази техника изисква да помните дължината на паролата и някакви други маркери, като цвят, символ, ред. Може да се държи на видно място и се генерират добри пароли, но трябва да си пазите картата.

6. Таблици с пароли
Идеята е да помните 5 символна дума и на нейна база генерирате парола. Да видим как работи. Ако се казвате Ламбо, можете да си генерирате доста уникална парола, като само трябва да си помните името, изписано на латиница.
В случая “lambo” би изглеждало, като парола, така: L6CK3Xsaenb

А как се получи?! Много е просто! Имаме име от 5 букви и таблица с 5 реда. Всеки ред отговаря на поредния символ от името:
1-ви символ “l” – ред едно, колона “KL” -> L
2-и символ “a” – ред втори, колона “AB” -> 6C
3-ти символ “m” – ред трети, колона “MN” -> K3
4-ти символ “b” – ред четвърти, колона “AB” -> Xsa
5-ти символ “о” – ред пети, колона “OP” -> enb