rtmpdump – дъмпване на онлайн телевизия – БНТ 1, БТВ и Нова ТВ

На тази тема има публикуван нов материал с включени видео-уроци. Можете да го прочетете тук:
rtmpdump tutorial – урок за начинаещи

Заиграх се малко с rtmpdump. Много готин инструмент, с който може да се прихваща защитено видео. За да си набавя параметрите за дъмпа, използвах Wireshark.
Дъмп за гледане на БНТ1 през VLC:
rtmpdump -r “rtmp://edge2.evolink.net:2020/fls” -a “fls” -f “WIN 11,5,502,149” -W “https://cdn.bg/flash/jwplayer510/player.swf” -p “https://cdn.bg/live/4eViE8vGzI” -T “B@1R1st1077” -y “bnt.stream” –quiet | vlc –

Update [14.03.2016] Променен е стрийма на БНТ1. По долу е работещ към днешна дата код. БНТ1 разпознава само БГ IP-та, затова от чужбина трябва да се ползва прокси.

rtmpdump -r "rtmp://edge2.cdn.bg:2020/fls" -a "fls/" -W "http://i.cdn.bg/eflash/jwplayer510/player.swf" -f "WIN 18,0,0,232" -p "http://cdn.bg/live/4eViE8vGzI" -y "bnt.stream?at=22c035726e941f171f6676751141b491" -T "B@1R1st1077" --quiet | vlc -

БНТ HD

rtmpdump -r "rtmp://edge2.cdn.bg:2020/fls" -a "fls/" -W "http://i.cdn.bg/eflash/jwplayer510/player.swf" -f "WIN 18,0,0,232" -p "http://i.cdn.bg/live/OQ70Ds9Lcp" -y "bntHDt.stream?at=22c035726e941f171f6676751141b491" -T "B@1R1st1077" --quiet | vlc -

Дъмп на БНТ2

rtmpdump -r "rtmp://edge11.cdn.bg:2020/fls" -a "fls/" -W "http://cdn.bg/eflash/jwplayer510/player.swf" -f "WIN 18,0,0,232" -p "http://cdn.bg/live/ZBPbdxDHm7" -y "bnt2.stream?at=22c035726e941f171f6676751141b491" -T "B@1R1st1077" --quiet | vlc -

Дъмп на БТВ
rtmpdump -r “rtmp://46.10.150.111:80/ios” -a “ios” -f “WIN 11,5,502,149” -W “https://images.btv.bg/fplayer/flowplayer.commercial-3.2.5.swf” -p “https://www.btv.bg/live/” -y “btvbglive” –quiet | vlc –

rtmpdump -r "rtmp://46.10.150.113:80/alpha" -a "alpha" -f "WIN 11,5,502,149" -W "http://www.btv.bg/static/bg/shared/app/flowplayer/flowplayer.rtmp-3.2.13.swf" -p "http://www.btv.bg/live/" -y "alpha" --quiet | vlc -

И двата стринга могат да се запазят като изпълними скриптове на десктопа и да се стартират с 2 клика.

Може да се дъмпва и директно до файл, като се посочи output -o. Пример за дъмпване на бТВ до файл:

rtmp://46.10.150.113:80/alpha" -a "alpha" -f "WIN 11,5,502,149" -W "http://www.btv.bg/static/bg/shared/app/flowplayer/flowplayer.rtmp-3.2.13.swf" -p "http://www.btv.bg/live/" -y "alpha" -o "BTV_01.flv"

Нова ТВ
– плей с VLC

rtmpdump -r "rtmp://edge1.evolink.net:2010/fls" -a "fls/_definst_" -y "ntv_2.stream" -p "http://i.cdn.bg/live/" -T "N0v4TV6#2" --quiet | vlc -

– кепчъринг с rtmpdump

rtmpdump -r "rtmp://edge1.evolink.net:2010/fls" -a "fls/_definst_" -y "ntv_2.stream" -p "http://i.cdn.bg/live/" -T "N0v4TV6#2" -o "NovaTV_01.flv"

За да записвам Нова ТВ се наложи да декомпилирам swf-файла в който беше набутана паролата за стринга (Secure Token – TEA). Тази парола се добавя с параметъра -T, в случая е -T “N0v4TV6#2”

Дъмп на Канал 3

rtmpdump -V -r "rtmp://edge4.cdn.bg:2017/fls" -a "fls/" -W "http://i.cdn.bg/flash/jwplayer510/player.swf" -f "WIN 18,0,0,232" -p "http://i.cdn.bg/live/FP08SWAJ4v" -y "kanal3.stream?at=22c035726e941f171f6676751141b491" --quiet | vlc -

Дъмп на ТВ Европа

rtmpdump -r "rtmp://lb.blb.cdn.bg:2018/fls" -a "fls/" -y "tvevropa.stream" --quiet | vlc -

Дъмп на SPortal
До файл:

rtmpdump -V -r "rtmp://pri.cdn.bg:2001/fls" -a "fls/" -y "sportal_tv_hd.stream" -p "http://www.novini.bg/tv/703-sportal-bg.html" -o "proba.flv"

До VLC palyer:

rtmpdump -V -r "rtmp://pri.cdn.bg:2001/fls" -a "fls/" -y "sportal_tv_hd.stream" -p "http://www.novini.bg/tv/703-sportal-bg.html" --quiet | vlc -

===========================================
Подробно описание, как прихващам стриймовете (писал съм го за един форум, но го поствам и тук).
Надушвам ги с Wireshark. Ето как:
1. Стартираш Wireshark и “надушваш” кое е IP-то което стриймва. Това може да стане и с друга програма, като SmartSniffer или подобна лека програмка. Там се вижда много ясно кое IP точи постоянен трафик. След това залагаш това IP като филтър в Wireshark:
01.8699
Може да си сложиш IP-то като филтър и автоматично, с 2 клика:
02.8583
2. След това кликам на някой от прихванатите филтрирани пакети и с десен бутон избирам [b]Follow TCP stream[/b].
03.6096
3. Показва се прозореца с данните от прихванатите пакети, като в него намирам всичката ми необходима информация, за да направя дъмп на видеото:
04.7009
pageUrl…https://www.btv.bg/live/
flashVer…WIN 11,5,502,149
app…ios
swfUrl..https://images.btv.bg/fplayer/flowplayer.commercial-3.2.5.swf
tcUrl…rtmp://46.10.150.111:80
play………….btvbglive

4. С тези данни мога да стриймвам директно, ако сървара ми позволи, или пък да дъмпна стрийма с rtmpdump, като просто си заместя инфото като аргументи за стартиране на програмата:

rtmpdump -r “rtmp://46.10.150.111:80/ios” -a “ios” -f “WIN 11,5,502,149” -W “https://images.btv.bg/fplayer/flowplayer.commercial-3.2.5.swf” -p “https://www.btv.bg/live/” -y “btvbglive” -o “BTV_01.flv”

UPDATE: Стрийма на БТВ е променен. Новият е:
rtmpdump -r "rtmp://46.10.150.113:80/alpha" -a "alpha" -f "WIN 11,5,502,149" -W "https://www.btv.bg/static/bg/shared/app/flowplayer/flowplayer.rtmp-3.2.13.swf" -p "https://www.btv.bg/live/" -y "alpha" -o "BTV_01.flv"

5. Пийваш малко биричка и междувременно можеш да си пуснеш дъмпвания файл в някой плеър, за да си го гледаш в реално време.
————–
Междувременно написах проста програма – TV Player, която използва по-горните команди за гледане на онлайн телевизия. Програмката се намира тук:
Simple BG TV Player – прост rtmpdump плеар за гледане на BG-телевизии
Изглежда така:
simple bg tv player - онлайн телевизии

Share and Enjoy !

Shares

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

Share and Enjoy !

Shares

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-скриптове, като добавя всички необходими модули.

Share and Enjoy !

Shares

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

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:
https://www.miraclesalad.com/webtools/md5.php
https://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

Share and Enjoy !

Shares

Калкулатор за пресмятане на течност за електронни цигари

Написах скромен HTML-JavaScript калкулатор за пресмятане на прости рецепти за сокчета (e-juice) за електронни цигари.
Демо на калкулатора.
Изтегляне.

Share and Enjoy !

Shares

Отворено писмо до телевизия Нова във връзка с репортаж в Календар

Ще цитирам един текст за електронните цигари, който ме вълнува поради факта, че се крие истината от хората и много медии всячески се опитват да убедят пушачи и непушачи, че електронните цигари са едва ли не по-вредни от тютюневите. Аз самият изпарявам с електронна цигара и от личен опит мога смело да заявя, че това е единственият, реално работещ, истински метод за отказване на цигарите – без сложни, съмнителни и продължителни терапии.
Поздравявам Николай Цеков за куража, труда и желанието, да изложи така аргументирано гледната си точка.
Целия текст с приложените линкове за изследвания, статии и документи може да се намери тук.

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

Отворено писмо до телевизия Нова във връзка с репортаж в Календар
(Относно електронните цигари)

Оригинален текст, изпратен до: kalendar@ntv.bg, pr@ntv.bg

От: Николай Цеков

Привет,
Предварително се извинявам за дължината на това писмо, но ми се иска да посоча факти, които може да проверите и сами с подобаващо търсене и интерес към темата, а не просто да ви кажа колко не сте прави по отношение на нещо.

Пиша ви във връзка с излъчения на 13.11.2012 в Календар репортаж за електронните цигари, дело на вашия сътрудник Марина Гашпарова. Като администратор на най-големия български форум, свързан с електронни цигари и потребител на въпросните от повече от 3 години (след 17-годишен “стаж” с тютюневите цигари) се интересувам изключително много от развитието им и всякаква информация, свързана с тях, следя всички новости на пазара и публикации, свързани с разпространението им. Всяко ограничаване на разпространението им под каквато и да е форма би било стъпка към връщането към тютюневите цигари лично за мен, а и за множество хора, които ги използват по подобен на мен начин, мои близки, роднини, познати и приятели; клиенти на фирмата, в която работя и членове на обществото, над които имам наблюдения.

Смятам, че репортажът беше едностранчив и пълен с непроверени факти, включително и цитираните от Йорданка Илиева от РЗИ – Велико Търново, и не прави чест на Нова телевизия, че го излъчи. Не малко хора започнаха да следят основно Нова, тъй като групата на bTV е общоизвестна с едностранчивите си репортажи, и излъчвания като това със сигурност са грешна стъпка в наистина грешна посока.

Това писмо ще бъде публикувано във Facebook, на страниците на няколко български форума. В случай, че не получа смислен отговор в разумен срок, ще го разпратя и до други медии с обяснение за причината за публикуването му. Считам, че всякаква комуникация, извършена относно това писмо, включително чрез имейл, телефон, на хартиен носител или в публичното пространство може да бъде приета за обществен дебат и няма да приема условия за запазване на конфиденциалността и неприкосновеността на информацията, съдържаща се в нея.

Информация:

На фона на доказаните вреди от тютюнопушенето, наличието на над 600 известни и изследвани токсични и канцерогенни съставки и между 1000 и 10000 неизвестни или неизследвани химически съединения в тютюневия дим, потенциалната вреда от електронните цигари е откровено пренебрежима. Това е и причината две от най-големите американски здравни организации неотдавна да призоват FDA (регулаторният орган в САЩ) да промени статуквото на електронните цигари на “потенциално вреден продукт”. Наскоро и СЗО представи подобен едностранчив доклад, базиран на едва 2-3 стари изследвания, и насочен силно негативно към електронните цигари, а същевременно – дори не се обмисля забрана на тютюнопушенето (пълна), въпреки, че доказаните вреди от него са продукт на дългогодишни изследвания и в световен мащаб рискът от него да се оценява на над 4% повишение на риска от заболявания, свързани с пушенето и да се счита за виновник за над 30% от случаите на ракови заболявания, а резултатите от пасивното пушене остават не напълно оценени, но доказано е вредно за здравето.

Нещо повече, тютюнопушенето, въпреки всички мерки за борба с него, продължава да се увеличава в световен мащаб, а и у нас – ръстът, който отбелязват Булгартабак спрямо предходната година, е над 20% на българския пазар и общо 46% от общите продажби на компанията, при над 800% увеличение на печалбите. Подобна е тенденцията и по света, компаниите производители печелят повече и продават повече.

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

Ще се опитам да поясня, изброявайки грешките в репортажа без определен ред:

– електронните цигари НЕ СА ЗАБРАНЕНИ в Китай – елементарна справка в Интернет би ви го показала. Китай е най-големият производител на електронни цигари (всъщност почти ексклузивен производител на устройствата в момента) и т.нар никотинови течности с разнообразно качество – от марковите Joyetech, Dekang, Boge, Hangsen, Smoktech, Microcig и Vision, до непроизносими марки и модели.

– някои от големите марки течности се произвеждат в Европа – полските Inawera и течностите на италианската компания FlavourArt. последните са производител на разнообразни аромати, който постоянно развива дейността си и спонсорира изследвания на вредите от използването, като това е единствената компания, която прави опити с живи белодробни клетки, изследвания за влияние над сърдечната дейност, усвояване на никотин, наличие на токсични вещества, и вероятно усилията на марката, вложени в насока това течностите за електронни цигари да са по-безопасни, надминават общият списък с усили, положени от всички тютюневи гиганти в света. Не казвам “никотинови течности”, тъй като FA произвеждат и такива без никотин, които са пълен заместител на тютюнопушенето без следа от вредата от никотина.

– В допълнение – изследвания, които не са свързани с електронните цигари показват, че никотинът сам по себе си няма силно пристрастяващо действие, но наличието на инхибитори, които се формират вследствие от ферментацията на различни продукти (вкл. тютюна) усилва многократно това действие и усвояването му от организма. такива монооксидазни инфибитори в течностите за електронни цигари няма. Чистият никотин води до незначително повишение на риска от заболявания и със сигурност е пристрастяващ наркотик, но такива са и кофеинът (също токсичен в големи количества, при това доста по-лесно постижими) в кафето и колата, алкохолът (няма смисъл да споменавам вредите от употребата му, вкл. антиобществените), освен това – когато не е приеман със стотици или хиляди вредни вещества и особено – такива, усилващи действието му (обществена тайна е, че такива се добавят в тютюневите цигари умишлено, дори ментолът е една такава съставка), асоциацията му с канцерогенните им свойства следва да не се прави.

– електронните цигари сами по себе си са напълно безопасно устройство – поне внесените от големите дистрибутори модели до един разполагат с CE и RoHS сертификати и отговарят на европейските стандарти, а течностите, внесени от Китай, са тествани в лабораториите на SGS и приети от българските власти (всяка подобна пратка се проверява на митница), което гарантира липсата на невключени в описанието химически съединения. За да не поднасям едностранчива информация – нелегалният внос (обикновено през съседни държави) и бумът им в момента водят и до появата на модели и течности, които не идват от сертифицирани производители и като цяло са с неясен произход, но обемът на тези продукти е малък, той като цените им вече са твърде близки до тези на продуктите от известни марки, и се разпространяват от малки търговци.

– Йорданка Илиева цитира изследване в Германия, за което не намирам референции; изследвания за наличие на нитрозамини, тежки метали и др. токсични съединения може да намерите при няколко от родните дистрибутори – правени са в независими и уважавани лаборатории в страната. В световен мащаб подобни изследвания са нещо съвсем нормално, особено в държавите, където продажбата на течности е регулирана, са задължителна и неразделна част от вноса и продажбата на течности.

– Вече са на лице множество изследвания, които показват липса на пасивно пушене, значително по-ниски нива на никотин в кръвта и пълно отсъствие на CO (въглероден оксид) при използване на електронни цигари, огромно намаление на рисковете, свързани със сърдечната дейност (последното изследване, представено на конференцията на кардиолозите в Мюнхен т.г., показва, че електронните цигари не увеличават риска от сърдечни заболявания, за разлика от тютюневите.

– елементарно допитване ще покаже, че електронните цигари, когато се ползват за заместител на цигарите, водят до възвръщане на усещанията за вкус и аромат (които тютюневите цигари буквално премахват), липсва типичното за цигарите задъхване (поради липсата на катрани и въглероден оксид)

– В допълнение към горното – употребата, вдишването и въобще – използването на пропилен гликол (PG) няма доказани вреди в количествата, които може да употребите чрез електронна цигара (под 2-3 мл на ден). Пропилен гликолът рядко предизвиква алергични реакции и е токсичен в концентрации, които бихте постигнали, ако го пиете (говорим за няколко милилитра на килограм живо тегло), но като цяло е една от най-широко използваните съставки в световен мащаб заради антибактериалните му свойства и възможностите да разтваря водоразтворими продукти. Един от най-големите потребители на PG са тютюневата (тютюнът се обработва с PG, за да не се овлажнява), козметичната (вкл. интимни гелове и лубриканти, които се продават във всеки супермаркет), лекарствената (повечето сиропи), хранителната и т.н. промишлености. Това, че се ползва в антифриза, го прави отровен точно толкова, колкото и водата, която е втората основна съставка на антифриза, “виновна” за свойствата му да замръзва при ниски температури (според съотношението на водата и пропилен гликола). Изказванията за вреди от употребаа на PG в подобни количества са нелепи и лесно опровержими. Отровната съставка в антифриза е етилен гликол; нещо повече – антифризите, използващи само пропилен гликол дори са са маркирани като “не отровни”, но се използват само за критични приложения, като например в машини, участващи в производството на хранителни продукти. Друга част от токсичността на антифриза се дължи а използваните близо 5% разнообразни органични киселини, буфери, лубриканти и антикорозионни средства.

– втората най-често използвана съставка на никотиновите течности е растителният глицерин, който също се използва за разнообразни цели и е се приема за безвреден, също така е към него са далеч по-редки алергичните реакции. Като цяло – алергиите към някоя от тези две съставки са известни на носителите им, тъй като ще ги изпитат и при простото миене на зъбите – всички пасти за зъби съдържат глицерин или пропилен гликол, често и двете, да не говоря за милионите други продукти, в чиито състав влизат.

– В световен мащаб има тенденция да се защитават корпоративните интереси на тютюнопроизводителите – вместо страната ни да откаже да бъде последовател на тези движения, позовавайки се на така наречената борба с тютюнопушенето, която е доказано неефективна и дори водеща до ръст в потреблението (за справка – финансовите резултати на преработвателите на тютюневи изделия) за сметка на пренебрежим процент откази от тютюнопушене, може да сме първите, които да предложат на обществеността масова и далеч, далеч, далеч по-безопасна алтернатива. Не твърдя, че електронните цигари са безопасни – все пак течностите с никотиново съдържание съдържат от 0 до 2.4% никотин и тези с високо съдържание могат да са токсични, ако ги поемете наведнъж (ако например дете изпие бутилката), но усилията по-скоро следва да са насочени към “просветляване” на потребителите относно потенциалните вреди от използване на течности от недоказани или непроследими производители и тези от използване на несертифицирани продукти*, а не към постоянно натякване на вредите от използването на електронни цигари – такива почти няма, а на фона на тютюневите цигари, електронният им вариант буквално може да се приеме за безвреден заместител.

– Още едно допълнение – за разлика от използването на заместители на никотин или алтернативни методи за доставянето му (таблетки, дъвки и лепенки), чиято ефективност се оценява на под 1% (на практика “неизследвано ниска”), елементарно допитване и статистика от страна на вносители и потребители ще покаже, еч електронните цигари имат далеч по-добра ефективност, като причините и резултатите са:
а) немалка част от потребителите закупуват електронна цигара, но са разочаровани, понеже очакват тя да е като тютюнева – т.е. същите вкус и усещане, което е невъзможно; също така не харесват грижата за нея, зареждане на батерии, замяна на износени части и т.н., като анкети в големите форуми и обемите на продажби показват, че това се случва с над 30% от потребителите.
б) огромна част от потребителите ги използва за заместител или като средство за намаляване на пушенето на тютюневи цигари – в тази група влизат близо 50% от ползващите електронни цигари (вкл. аз самият, понеже не пуша и изключително и само ползвам електронни цигари, но нямам намерение да ги спирам). Тези хора приемат недостатъците като липсата на същия вкус и лекотата на употреба, но оценяват по-ниската вреда над организма и възвръщането на усещанията за вкус, аромат, липсата на задъхване, липсата на вреда за околните и т.н. ползи и това, че е-цигарите не нарушават навиците им и позволяват да ги ползват където поискат без да нанасят вреди никому, включително и над себе си. немалка част от тази група хора често съчетава пушенето на обикновени цигари, но го намалява многократно – обикновено пушачи с над кутия дневно потребление падат до 2 до 5 цигари дневно (със сутрешното кафе или при употреба на алкохол, второто по-често), като с времето дори разреждат пушенето за сметка на изпаряването. Причини за преминаване към електронни цигари за тази и предишната група често са и финансови – е-цигарите са около 3 до 6 пъти по-евтини от тютюневите цигари при ползване над 3 месеца.
в) между 15 и 20% от ползващите електронна цигара в даден момент спират или почти спират да ползват дори и нея, като това е резултат от по-лесното “откачане” от зависимостта от никотина поради липсата на вещества, които да помагат за усвояването и усилването на действието им, както и по-ниските нива на усвояване то му при е-цигарите. Това са масово хора, ползвали електронната си цигара над половин година, след което постоянното занимаване с електронното устройство им омръзва и в даден момент го оставят настрана. Разбира се, възможно е и някаква част от тях да се върнат към ползването му или дори пушенето на тютюн, но дори и при това положение, това остава ИЗКЛЮЧИТЕЛНО ефективен метод за отказване – въпреки, че рядко се рекламира смислено като такъв.

Един относително лесен начин за намаляване на употребата на никотин чрез използване на електронна цигара, рядко описван от производители и търговци, е постепенното преминаване към ниско съдържание на никотин. Ако смесите течност с 1.8% никотин и такава с 1.1% никотин, ще получите течност с 1.45% никотин. Това може да се използва, като постепенно преминавате към все по-ниско съдържание на никотин, като в даден момент (при използване на течности с под 1.1% ниво) нивото на пристрастяване ще е силно занижено и ще приемате сериозно намалени дози никотин. Елементарно е, но това го правят относително малко хора.

В заключение
Електронните цигари претърпяват бум в момента поради няколко причини – забраните за пушене на обществени места, чисто финансовото отражение над бюджета на относително бедния българин, нарастващо осъзнаване от вредите от тютюнопушенето.
Електронните цигари са алтернативен, многократно по-безвреден или почти напълно безвреден продукт, който отговаря на съвременните стандарти и не бива да се принизяват до “риск за здравето”, той като в сравнение с тютневите продукти са откровено незначителен фактор по отношение на вредите.
Електронните цигари са де факто най-добрият терапевтичен продукт и са без аналог по отношение на ефективността им в това отношение – нито един от алтернативните методи за борба с тютюнопушенето няма подобен успех. И това се споделя от почти всички потребители, с изключение на предубедените и такива, които “само са слушали по новините” за тях.
Електронните цигари причисляват потребителите им към групата на “непушачите”, което има силно отражение в обществото и отношението към пушачите, както и във вечната борба между пушачи и непушачи относно правата за чист въздух или ползване на цигари на едните и другите.
Електронните цигари са безвредни за околните – не нанасят нито вреди над здравето им, нито водят до негативно отношение заради миризмата на тютюневият дим.
Електронните цигари подобряват усещанията за вкус, аромат и улесняват дишането на пушачите и това са безспорно положителни ефекти за всеки от тях.
Смятам, че не е редно да бъдат принизявани до “вредни продукти, с които да внимавате”, дори напротив, отговорност на медиите и държавата трябва да е доказването на ползите и оценката на потенциалните вреди от тях, като за база де приемат вредата и ефектите от пушенето на тютюневи цигари и нарастващия пазар на тютюневи продукти.

Моля да обърнете подобаващо внимание на това писмо – и тази молба е чисто човешка, като на потребител на въпросните продукти. Следя пазара, работя за една от фирмите, които продават такива продукти, поддържам форум, в който всеки има свободно право на глас и единствената цензура, която се налага там, е върху “търгашите”. Намирам, че всеки средно интелигентен човек трябва да проверява фактите, които “знае” и не би следвало да разпространява откровено невярна информация, особено, когато може да е в ущърб на множество хора, и това би следвало да важи и за репортери и държавни служители.

С уважение,
Николай Цеков
========================

Share and Enjoy !

Shares

C read text file line by line

Код, който чете от текстов файл ред по ред:

#include <stdio.h>
int main ( void ){
	static const char filename[] = "file.txt";
	FILE *file = fopen ( filename, "r" );
 
	if ( file != NULL )	{
		char line [ 128 ]; /* maximum line size */
		while ( fgets ( line, sizeof line, file ) != NULL ) { /* read a line */
			fputs ( line, stdout ); /* write the line */
		}
		fclose ( file );
	} else {
		perror ( filename ); /* why didn't the file open? */
	}
	return 0;
}

Share and Enjoy !

Shares

C external command output – popen (_popen)

C external command output – popen (_popen)

Прилагам два кода на C, които прихващат резултат от изпълнение на конзолна програма и ред по ред го принтират към стандартния изход:

#include <stdio.h>
#include <stdlib.h>
 
int main( void ){
 
   char   psBuffer[128];
   FILE   *pPipe;
 
   if( (pPipe = _popen( "ping 10.317.112.201", "rt" )) == NULL )
      exit( 1 );
 
   while(fgets(psBuffer, 128, pPipe)) {
      if(strstr(psBuffer,"TTL")) printf("Ima ping\n");
      printf(psBuffer);
   }
 
 
   /* Close pipe and print return value of pPipe. */
   if (feof( pPipe)) {
     printf( "\nProcess returned %d\n", _pclose( pPipe ) );
   }
   else {
     printf( "Error: Failed to read the pipe to the end.\n");
   }
}
#include <stdio.h>
#include <stdlib.h>
 
 
int main( int argc, char *argv[] ){
  FILE *fp;
  int status;
  char path[1035];
 
  /* Open the command for reading. */
  fp = popen("dir ..", "r"); // Dir one directory Up
  if (fp == NULL) {
    printf("Failed to run command\n" );
    exit;
  }
 
  /* Read the output a line at a time - output it. */
  while (fgets(path, sizeof(path)-1, fp) != NULL) {
    if(strstr(path,"Edit")){    // check file/dir name contains 'Edit'
        printf("%s", path);
    }
  }
 
  /* close */
  pclose(fp);
 
  return 0;
}

И в двата кода използвам функцията strstr(), която проверява, дали върнатия стринг съдържа определен текст.

Share and Enjoy !

Shares

C string array and pointers

Няколко примера, които описват почти едно и също нещо – обхождане на елементи на масив с пойнтери. Много важно е да се схване, че масивите от стрингове всъщност представляват масиви от пойнтери от тип char!!!!
Костваше ми много време, докато се убедя, че е така, но не всеки може лесно да свикне да мисли на C :).
Пример 1

#include <stdio.h>
int main(){
 char words[][18] = {"edno", "dve", "tri", "chetiri", "pet"};
 int i;
 
 for (i = 0; i < 5; i++){
     char *words_ptr = *(words + i);
     printf("words_ptr + %d = %s \n", i, words_ptr);
 }
 return 0;
}

Пример 2

#include <stdio.h>
char words[][18] = {"edno", "dve", "tri", "chetiri", "pet"};
char *ptr;
 
int main(){
 int i;
 
 for (i = 0; i < 5; i++) {
     printf("--%s--\n",words + i);
     ptr = *(words + i);
     printf("ptr + %d = %s \n", i, ptr);
 }
 return 0;
}

Пример 3

#include <stdio.h>
char *words[] = {"edno", "dve", "tri", "chetiri", "pet"};
 
int main(){
 int i;
 
 for (i = 0; i < 5; i++) {
     printf("ptr + %d = %s \n", i, *(words + i));
 }
 return 0;
}

Share and Enjoy !

Shares

C read word line from text file

C read word from file
Прост C код, който чете от текстов файл line-by-line и показва резултата като думи. Идеята е, ако имаме файл, на който всеки ред представлява дума, да можем да вземем тази дума и да я обработим.

#include <stdio.h>
#include <stdlib.h> // ANSI C exit() prototype
 
#define MAX 40
 
int main(){
	FILE * fp;
	char words[MAX];
 
	if ((fp = fopen("in.list", "r")) == NULL){
		printf("Can't open file\n");
		exit(1);
	}
 
	while (fscanf(fp,"%s",words) == 1){
		puts(words);
	}
 
	if (fclose(fp) != 0) printf("Error in closing file \n");
}

Текстовия файл in.list съдържа следните редове:
foo
bar
biz

Естествено изхода от по-горната програма е същия.
Програмаката е много удобна, ако искаме да направим нещо като речник, който да обработваме с регулярни изрази или нещо подобно.

Share and Enjoy !

Shares