понедельник, 4 июля 2011 г.

JavaScript. Таймер или динамичный последний отсчёт

А теперь другой вариант последнего отсчёта. На этот раз самый настоящий, динамичный.

<div id="datecounter2">--:--:--</div>

<script type="text/javascript">

onload = function start() {
  timesp();
}

function timesp() {
  var ts = new Date(2012,11,21) - new Date();
  var html = "уже наступил!";
  if (ts>0) {
    var h = ts/3600000;
    var m = (h-Math.floor(h))*60;
    var s = (m-Math.floor(m))*60;
    html = ctime(h)+" : "+ctime(m)+" : "+ctime(s);
    t = setTimeout("timesp()",300);
  } else {
    clearTimeout(t);
  }
  document.getElementById("datecounter2").innerHTML=html;
}

function ctime(i) {
  i = Math.floor(i);
  if (i<10) {
    i = "0"+i;
  }
  return i;
}

</script>

После загрузки страницы отрабатывает функция start(), которая запускает функцию timesp(). А timesp() уже при помощи команды setTimeout('timesp()',300) будет запускать сама себя через каждые 300 милисекунд. Функция ctime(i) округляет передаваемый аргумент и, если его значение меньше 10, добавляет "0". Это нужно для того, чтобы вместо "1:2:3" было "01:02:03", как в настоящих электронных таймерах.

Пример работы скрипта:

До Нового года:

--:--:--

А, собственно, само время, оставшееся до следующего Нового года, посчиталось так:

var d = new Date();
var ts = new Date(d.getFullYear() + 1,0,1) - d;

вторник, 28 июня 2011 г.

JavaScript. Последний отсчёт

Будем считать количество часов или дней до какой-нибудь знаменательной даты. Например, до дня рождения, до Нового года, до начала отпуска, ну, или как у меня. :) Как всегда, добавляем новый гаджет «HTML/JavaScript» и копируем такой код:

<div id="datecounter"></div>
<script type="text/javascript">
var ts = new Date(2012,0,15) - new Date();
var str = "" + Math.round(ts / 3600000);
var len = str.length;
var html = "<b>уже наступил!</b>";
var t = "часов";
if (ts > 0) {
  if (len == 1 || (len > 1 && str[len - 2] != '1')) {
    switch (str[len - 1]) {
      case '1':
        t = "час";
        break;
      case '2':
      case '3':
      case '4':
        t = "часа";
    }
  }
  html = "через <b>" + str + "</b> " + t;
}
document.getElementById("datecounter").innerHTML = html;
</script>

Дата нашего события задаётся в строчке:

var ts = new Date(2012,0,15) - new Date();

В скобках указываем год, месяц, день. Обратите внимание: счёт месяцев начинается с нуля! Т.е. дата в нашем примере — это 15 января 2012 года. Если интересующее событие начинается не в 0:00, а, скажем, в пол-первого, можно учесть и это, добавив в строчке с датой и время:

var ts = new Date(2012,0,15,12,30) - new Date();

Следующая строка кода переводит отрезок времени (который измеряется в милисекундах) в часы. Если нас интересует измерение в днях, то придётся изменить эту строку так:

var str = "" + Math.round(ts / 86400000);

Кроме того, Капитан Очевидность подсказывает, что дальше в коде нужно заменить "часов" на "дней", "час" на "день", а "часа" на "дня". :)

пятница, 24 июня 2011 г.

JavaScript. Случайная фраза из списка

Итак, у нас есть список наших любимых фраз, цитат, анекдотов или чего-то там ещё. Нужно выбрать наугад одну из этих фраз и показать у себя на сайте или в бложике, чтобы тем самым порадовать себя и позабавить посетителей. Для бложика перейдите в «Дизайн», добавьте новый гаджет «HTML/JavaScript» и скопируйте туда следующий код:

<div id="myphrase">
</div>
<script type="text/javascript">
var div = document.getElementById("myphrase");
var lst = new Array();
lst.push("Моя любимая фраза номер один.");
lst.push("Моя любимая фраза номер два."); 
lst.push("Моя любимая фраза номер три."); 
lst.push("..."); 
lst.push("Моя любимая фраза номер стопицот."); 
div.innerHTML = lst[Math.floor(Math.random() * lst.length)];
</script>

Пример работы этого скрипта можно видеть справа (под ссылкой на мой профиль). Фраза меняется при каждом обновлении страницы. Учтите только, что если в вашем списке мало фраз, то одна и та же фраза может радовать ваш взор несколько раз подряд. А чем фраз больше, тем, соответственно, меньше вероятность выбора одной и той же.

Первая строка кода — это блок div, в котором будет помещаться выбранная фраза. При желании можно поработать со стилем этого блока, задав, к примеру, цвет текста или шрифт. В таком случае первая строка примет какой-то такой вид:

<div id="myphrase" style="color: green; font-size: small; font-style: italic;">
</div>

В данном случае мы установили зелёный цвет текста, малый размер шрифта и наклонный стиль. Если вы хотите поменять стиль блока как-то ещё, можете посмотреть справочник по CSS.

При помощи строк lst.push("какой-то текст"); мы добавляем наши фразы. Строчек этих можно добавить сколько угодно, но не забывайте про точку с запятой в конце каждой строки. Кстати, в тексте фраз можно использовать теги HTML.

понедельник, 13 июня 2011 г.

VB.Net. Пересылка данных по локальной сети

Итак, в качестве примера пересылки данных по локальной сети сделаем простейший чат. В нашем случае будем пересылать текст в кодировке Юникод, но в общем случае это может быть любая последовательность байт. Пересылку организуем при помощи классов UdpClient и Socket из пространства имён System.Net.Sockets.

Отправляем данные мы при помощи функции SendTo(b, ep) экземпляра класса Socket, где b — массив байт (наши данные), а ep — конечная точка (экземпляр класса System.Net.IPEndPoint, для инициализации которого нужно знать IP-адрес и порт адресата).

При загрузке формы запускается таймер, в обработчике события Tick которого мы опрашиваем порт нашей машины, на который должны поступить ответные данные, и получаем их при помощи функции Receive(ep) экземпляра класса UdpClient.

IP-адрес 127.0.0.1 — это так называемая петля. Т.е. данные, отправленные на этот адрес, возвращаются нам.

Полный код формы приведён ниже:

Public Class Form1

    Private lport As Integer
    Private udpc As Net.Sockets.UdpClient
    Private soc As Net.Sockets.Socket
    Private sent As Boolean = False

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        lport = 9999
        udpc = New Net.Sockets.UdpClient(lport)
        soc = New Net.Sockets.Socket(Net.Sockets.AddressFamily.InterNetwork, Net.Sockets.SocketType.Dgram, Net.Sockets.ProtocolType.Udp)
        If ComboBox1.Items.Count > 0 Then ComboBox1.SelectedIndex = 0
        TextBox2.Select()
        Timer1.Start()
    End Sub

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        If udpc.Available > 0 Then
            Dim ep As New Net.IPEndPoint(Net.IPAddress.Any, lport)
            Dim b = udpc.Receive(ep)
            Dim txt = System.Text.Encoding.Unicode.GetString(b)
            TextBox1.Text &= String.Format("{0:HH:mm:ss} from [{1}]:{3}{2}{3}----------------------------{3}", Now, ep.ToString, txt, ControlChars.NewLine)
        End If
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        If TextBox2.Text.Length > 0 AndAlso ComboBox1.Text.Length > 0 Then
            Dim b = System.Text.Encoding.Unicode.GetBytes(TextBox2.Text)
            Dim ipadr = Net.IPAddress.Parse("127.0.0.1")
            Net.IPAddress.TryParse(ComboBox1.Text, ipadr)
            Dim ep As New Net.IPEndPoint(ipadr, lport)
            soc.SendTo(b, ep)
            TextBox1.Text &= String.Format("{0:HH:mm:ss} Me (to [{1}]):{3}{2}{3}----------------------------{3}", Now, ep.ToString, TextBox2.Text, ControlChars.NewLine)
            TextBox2.Text = ""
            TextBox2.Select()
            If Not ComboBox1.Items.Contains(ComboBox1.Text) Then ComboBox1.Items.Add(ComboBox1.Text)
        End If
    End Sub

    Private Sub TextBox2_KeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles TextBox2.KeyDown
        If e.Control AndAlso e.KeyCode = Keys.Enter Then
            Button1_Click(Nothing, Nothing)
            sent = True
        End If
    End Sub

    Private Sub TextBox2_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox2.TextChanged
        If sent Then
            TextBox2.Text = ""
            sent = False
        End If
    End Sub

    Private Sub TextBox1_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged
        TextBox1.SelectionStart = TextBox1.Text.Length - 1
        TextBox1.SelectionLength = 1
        TextBox1.ScrollToCaret()
    End Sub

    Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
        Timer1.Stop()
        udpc.Close()
        soc.Close()
    End Sub
End Class

Архив с проектом Visual Studio:

NetTest.zip (105 КБ)

VB.Net. Как объявить массив

Одной строкой объявить и инициализировать массив можно так:

Dim arr = New ТипЭлементовМассива() {значение0, значение1, значение2 и т.д.}

Где это можно использовать? Ну, например, при задании первичного ключа для таблицы, который должен быть массивом колонок этой таблицы:

Dim dt As New DataTable
dt.Columns.Add("id", GetType(Integer))
dt.Columns.Add("name", GetType(String))
dt.Columns.Add("description", GetType(String))
dt.PrimaryKey = New DataColumn() {dt.Columns("id")}

Го вверх!