Мисловна карта (MindMap) за изграждане на кухненски шкаф

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

MindMap на изграждането на кухненски шкаф (долен)

Прилагам FreeMind сорс файла на картата: Kuhnenski_shkaf-dolen-MindMap-FreeMind.zip

Share and Enjoy !

Shares

evoc – English vocabulary quiz

Пуснах една система за учене на думи на английски. Системата е базирана на тестове. Все още е в процес на девелопинг, но може да се ползва. За превода на думите написах скрапер, за да автоматизирам процеса и някои думи са малко машинно преведени, то в момента има само два базови речника и три fast quiz теста за 20, 50 и100 думи. Добавих опция да се предлагат корекции на думите, които да одобрявам в админ панел. Може да се ползва от тук:

https://evoc.nediko.info

Share and Enjoy !

Shares

Excel split string function

Simple VBA function to split strings into words (or strings):

Function TxtSplit(rngCell As Range, delim As String, nr As Long) As String
    Dim str As String
    Dim arr As Variant
    str = Trim(rngCell.Value)
    arr = Split(str, delim)
    TxtSplit = Trim(arr(nr - 1))
End Function

Sample usage:

=TxtSplit(B2;", ";1)

Share and Enjoy !

Shares

PHP Composer – some commands and tricks

Directory structure:

|   composer.json
|   composer.phar
|   index.php
|
+---app
|   +---controller
|   |       Home.php
|   |
|   \---model
|           FirstDb.php
|
\---vendor
    |   autoload.php
    |
    \---composer
            autoload_classmap.php
            autoload_namespaces.php
            autoload_psr4.php
            autoload_real.php
            autoload_static.php
            ClassLoader.php
            LICENSE

1. Standard case – with namespaces

root/composer.json

{
    "autoload": {
        "psr-4": {
            "App\\": "app/"
        }
    }
}

root/app/controller/Home.php

<?php
namespace App\Controller;

class Home{

	public function index(){
		echo "Hello from Home->Index!";
	}
}

root/app/model/FirstDb.php

<?php
namespace App\Model;

class FirstDb{
	public function db(){
		echo "Hi from first DB";
	}
}

root/index.php

<?php 
use App\Controller\Home;
use App\Model\FirstDb;

require_once __DIR__ . '/vendor/autoload.php';

$h = new Home();
$fdb = new FirstDb();

echo $h->index()."\n";
$fdb->db();

2. Without namespaces

root/composer.json

{
    "autoload": {
        "psr-4": {"": ["app/controller", "app/model"]}
    }
}

root/app/controller/Home.php

<?php

class Home{

	public function index(){
		echo "Hello from Home->Index!";
	}
}

root/app/model/FirstDb.php

<?php

class FirstDb{
	public function db(){
		echo "Hi from first DB";
	}
}

root/index.php

<?php 
require_once __DIR__ . '/vendor/autoload.php';

$h = new Home();
$fdb = new FirstDb();

echo $h->index();
$fdb->db();

3. Mix usage

root/composer.json

{
    "autoload": {
        "psr-4": {
            "": "app/"
        }
    }
}

root/app/controller/Home.php

<?php
namespace controller;

class Home{

	public function index(){
		echo "Hello from Home->Index!";
	}
}

root/app/model/FirstDb.php

<?php
namespace model;

class FirstDb{
	public function db(){
		echo "Hi from first DB";
	}
}

root/index.php

<?php 
require_once __DIR__ . '/vendor/autoload.php';

$h = new controller\Home();
$fdb = new model\FirstDb();

echo $h->index();
$fdb->db();

4. Composer addPsr4() without cnahge composer.json – dynamically add classes

root/composer.json

{
    "name": "some/test",
    "require": {}
}

root/app/controller/Home.php

<?php
namespace App\Controller;

class Home{

	public function index(){
		echo "Hello from Home->Index!";
	}
}

root/app/model/FirstDb.php

<?php
namespace App\Model;

class FirstDb{
	public function db(){
		echo "Hi from first DB";
	}
}

root/index.php

<?php 
use App\Controller\Home;
use App\Model\FirstDb;

$loader = require __DIR__ . '/vendor/autoload.php';
$loader->addPsr4('App\\', 'app/');

$h = new Home();
$fdb = new FirstDb();

echo $h->index()."\n";
$fdb->db();

5.Some important commands

Some important commands:

To initially install the defined dependencies:
php composer.phar update

to make sure the vendor directory is up in sync with your composer.lock file
php composer.phar install

To update to the latest versions
php composer.phar update

After adding the autoload field, you have to re-run this command:
php composer.phar dump-autoload

php composer.phar dump
calls composer dump-autoload.

how to create a composer.json by hand
php composer.phar init

To list all of the available packages
php composer.phar show

It will replace your composer.phar with the latest version:
php composer.phar self-update


all directories or files to search for classes:
{
    "autoload": {
        "classmap": ["src/", "lib/", "Something.php"]
    }
}
Wildcards (*) are also supported in a classmap paths, and expand to match any directory name:
{
    "autoload": {
        "classmap": ["src/addons/*/lib/", "3rd-party/*", "Something.php"]
    }
}


if your package includes PHP functions that cannot be autoloaded by PHP:
{
    "autoload": {
        "files": ["src/MyLibrary/functions.php"]
    }
}




HELP
=========================
to see the complete list of commands
composer list

--help combined with any of those can give you more information

Share and Enjoy !

Shares

Оптимизиране рязането на линейни детайли

Написах едно тулче за калкулиране на оптимално рязане на линейни детайли. Писано е на JavaScript за браузер, защото така ми е най-бързо и удобно. При повече от 22 детайла вероятно ще започне да лагва, защото възможните комбинации стават безкрайни, а всичко го тъпча в масиви. Ако ми остане време, ще го портна до C или C#.

И един пример, как се ползва. В момента си правя стелаж за обувки и искам да знам, колко стоманени профила да си купя и как да разпределя срезовете, за да имам най-малък отпадък. Ей това е проекта:

За да разположа оптимално детайлите по профили с дължина 2 метра въвеждам парчетата в тула:

Програма за оптимизиране рязането на линейни детайли

Резултатите ми показват, че ще ми трябват общо 4 парчета метален профил, като най-големия ми остатък е 1.034m.

Тула е събран в един HTML файл.
Може да се изтегли от тук: Изтегли
Или да се ползва от тук: Демо

Share and Enjoy !

Shares

Прихващане на Nova Live stream

В това видео ще покажа, как се взима ръчно файла с live stream на Нова ТВ. Има лека разлика спрямо прихващането на bTV стрийма, защото нова ползва iframe на външна страница.
Използвани инструменти:
firefox
wget (for windows)
pup html parser
ffplay (идва стандартно с ffmpeg)

Share and Enjoy !

Shares

Прихващане на bTV Live stream

bTV имат доста слабичка защита на стрийма. Нова поне ползват криптиране на стрийма с hls.key, което не е никакъв проблем за чупене, но пак е нещо. бТВ се защитават само с един динамично генериран адрес, който обаче е твърде достъпен, поне според мен. Сменят масива с адреси всеки ден, но факта, че присъства статично в ajax адрес, който може да се отвори и прочете от всеки, прави цялата защита смешна. За любителите на кепчъринга и за тираджиите прилагам скромно туториалче. Използваните инструменти са: Firefox, wget, jq, ffmpeg.

И по-лесния вариант за прихващане на видеото само с Firefox.

С тази техника може да се прихване почти всеки видео стрийм или да се свали видео файл. Когато видеото е криптирано, може да се записва стрийма, но по-инстересно е да се свалят всички файлове с високо качество и да се декриптират ръчно, като се ползва hls-ключ и оригиналните ts-файлове.

Ето и простичък PHP-код, който върши цялата работа по екстрактването на линка:

<?php
$wpage = file_get_contents("https://btvplus.bg/live/");

preg_match("@url: +'([^']*)@", $wpage, $m);

$config_page = file_get_contents("https://btvplus.bg".$m[1]);

$j = json_decode($config_page, true);

echo $j['info']['file'];
?>

Трябва да се отбележи, че bTV детектват, дали url-адреса се зарежда от чужбина и го ограничават (с http response code 301), но е много вероятно самия стрийм да не е ограничен. Не съм го пробвал. Хубавото е, че веднъж гепен адреса на стрийма, може да се гледа цял ден.

————————

И един бонус – сорс код за C#, който гепва стринга и го плейва с ffplay. За целта ffplay трябва да е в директорията с компилираното exe или в променливата Path на обкръжението на Win.

using System;
using System.Text.RegularExpressions;
using System.Net;
using System.IO;
using System.Diagnostics;


public class playBtv{
	static void Main(string[] args){
		string baseUrl = "https://btvplus.bg";
		string url1 = baseUrl + "/live/";
		ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
		WebClient client = new WebClient();

		string htmlCode1 = client.DownloadString(url1);
		string pattern = "url:";

		StringReader strReader = new StringReader(htmlCode1);
		string aLine, url2 = null;
		while(strReader.Peek() >= 0){
			aLine = strReader.ReadLine().Trim();

			if(aLine.Contains(pattern)){
				Match match = Regex.Match(aLine, @"([^']*)'([^']*)");
				url2 = baseUrl + match.Groups[2].Value;
				break;
			}
		}
		string htmlCode2 = client.DownloadString(url2);

		Match match2 = Regex.Match(htmlCode2, "(file\":\")([^\"]*)");
		string m3u8 = match2.Groups[2].Value.Replace("\\","");
		Process.Start("ffplay", m3u8);
	}
}

Компилира се с някой от наличните в Windows C# компилатори от .NET Frameworks. Примерно:

C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc /target:exe btv_play.cs

Share and Enjoy !

Shares