SVG snow animation – smil type
I wrote an SVG animation using only SMIL – no JavaScript or CSS.
The original file can be seen here:
http://blog.nediko.info/examples/svg/snow_001.html
SVG snow animation – smil type
I wrote an SVG animation using only SMIL – no JavaScript or CSS.
The original file can be seen here:
http://blog.nediko.info/examples/svg/snow_001.html
This is a simple tool that can help you rename multiple files with a command line pipe. It can also be used to rename a single file. The code used is not particularly optimized, but I am still learning to write in C#. The code can be compiled on any Windows that has the .NET Framework installed.
Just open a Windows command prompt and specify the path to your csc.exe. For example:
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe /t:exe renfiles.cs
Parameters
-h, –help Print this help
-s, –search Search string
-r, –replace Replace string
Optional
dir /b /s | renfiles -s "search_string" -r "replace_string"
renfiles -s "search_string" -r "replace_string" -f "path_to_file"
cat list_files.txt | renfiles -s "search_string" -r "replace_string"
Download: https://github.com/bained/renfiles
Video tutorial
Simple GUI for pdftk. It can be used only for join, rotate and extract PDF-files. Nothing more. App requires .NET Framework 4.0+. C# source code available as project and can be compiled with SharpDevelop. The reason I wrote this tool is because I couldn’t find an open source GUI that supports the latest versions of pdftk.
Download: PDFTk_Gui-v.1.01-by_Ned.zip
Source code: PDFTk_Gui-v.1.01-SharpDevelop_project.zip
Small Python script witch can make 2d from selected 3D objects in Blender. Useful for furniture. For 2D I use qCad (free version).
import bpy, os
# get the current selection
selection = bpy.context.selected_objects
# initialize a blank result variable
element_width = "-x"
element_height = "z"
list_dims = []
# Put Origin to middle
#bpy.ops.object.origin_set( type = 'ORIGIN_GEOMETRY' )
bpy.ops.object.transform_apply(location=True, rotation=True, scale=True)
bpy.ops.object.origin_set(type='ORIGIN_CENTER_OF_VOLUME', center='MEDIAN')
# iterate through the selected objects
for sel in selection:
# get the current object's dimensions
dims = sel.dimensions
# fix dimensions
a = dims.x*1000
b = dims.y*1000
c = dims.z*1000
# fix locations
lcx = sel.location.x*1000
lcy = sel.location.y*1000
lcz = sel.location.z*1000
w = 0
h = 0
lx = 0
ly = 0
x_and_width = {
# w, lx
"x": [round(a, 1), round(lcx - a/2, 3)],
"y": [round(b, 1), round(lcy - b/2, 3)],
"z": [round(c, 1), round(lcz - c/2, 3)],
"-x": [round(a, 1), round(-(lcx) - a/2, 3)],
"-y": [round(b, 1), round(-(lcy) - b/2, 3)],
"-z": [round(c, 1), round(-(lcz) - c/2, 3)]
}
y_and_height = {
"x": [round(a, 1), round(lcx - a/2, 3)],
"y": [round(b, 1), round(lcy - b/2, 3)],
"z": [round(c, 1), round(lcz - c/2, 3)],
"-x": [round(a, 1), round(-(lcx) - a/2, 3)],
"-y": [round(b, 1), round(-(lcy) - b/2, 3)],
"-z": [round(c, 1), round(-(lcz) - c/2, 3)]
}
celX = x_and_width[element_width]
celY = y_and_height[element_height]
list_dims.append( [ celX[0], celY[0], celX[1], celY[1] ] )
print("");
prnt_rect_funct = """
function rect(x, z, m){
var doc = getDocument();
var pList = [new RVector(0,0), new RVector(x,0), new RVector(x,z), new RVector(0,z)];
var poly = new RPolyline(pList, true);
var polyData = new RPolylineData(poly);
var n = new RPolylineEntity(doc, polyData);
addEntity(n);
move(n, m);
}
"""
print(prnt_rect_funct)
for x in list_dims:
print("rect(", x[0], ", ", x[1], ",", "[", x[2], ", ", x[3], "])")
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)
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
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();
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();
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();
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();
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
Написах едно тулче за калкулиране на оптимално рязане на линейни детайли. Писано е на JavaScript за браузер, защото така ми е най-бързо и удобно. При повече от 22 детайла вероятно ще започне да лагва, защото възможните комбинации стават безкрайни, а всичко го тъпча в масиви. Ако ми остане време, ще го портна до C или C#.
И един пример, как се ползва. В момента си правя стелаж за обувки и искам да знам, колко стоманени профила да си купя и как да разпределя срезовете, за да имам най-малък отпадък. Ей това е проекта:
За да разположа оптимално детайлите по профили с дължина 2 метра въвеждам парчетата в тула:
Резултатите ми показват, че ще ми трябват общо 4 парчета метален профил, като най-големия ми остатък е 1.034m.
Тула е събран в един HTML файл.
Може да се изтегли от тук: Изтегли
Или да се ползва от тук: Демо
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
parts = {
"one": [ 2, 3, 4 ],
"two": [ 5, 6, 7 ],
"tree": [ 8, 9, 10 ]
}
Object.keys(parts).map((part) =>
parts[part].map((el, index) =>
parts[part][index] = el+1
)
);
console.log(parts);
// Result:
// { one: [ 3, 4, 5 ], two: [ 6, 7, 8 ], tree: [ 9, 10, 11 ] }
И що чак сега се сетих, че мога да ползвам SVG text като background?! И не само текст. Че даже мога да си го променям динамично през javascript! Така някои дизайни можеше да станат по-фън-шуй. По-добре късно от колкото без SVG.
Едно примерче:
<!DOCTYPE html>
<html>
<body>
<button onclick="myFunction()">Try it</button>
<p style="min-height: 400px">Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
<script>
function myFunction() {
let txt = "SVG Txt";
let s = window.btoa(`
<svg height="400" width="800" xmlns="https://www.w3.org/2000/svg">
<text x="0" y="120" font-weight="bold" font-size="160" fill="#fef" stroke="#ddd">${txt}</text>
</svg>`
);
document.querySelector("p").style.background = `url('data:image/svg+xml;base64,${s}') no-repeat top left`;
}
</script>
</body>
</html>
Demo: text_as_background.html