Простичък код на batch който взима последния csc.exe от Microsoft.NET\Framework. Кода се пейства в bat-файл и при двоен клик компилира script.cs.
1
2
3
4
5
6
7
@echo offfor/f "TOKENS=1"%%x in('dir %windir%\Microsoft.Net\framework\v* /b ^| findstr "v[1-9]"') do (
set myPID=%%x
)
set csc=%windir%\Microsoft.Net\framework\%myPID%\csc.exe
%csc%/t:winexe script.cs
@echo off
for /f "TOKENS=1" %%x in ('dir %windir%\Microsoft.Net\framework\v* /b ^| findstr "v[1-9]"') do (
set myPID=%%x
)
set csc=%windir%\Microsoft.Net\framework\%myPID%\csc.exe
%csc% /t:winexe script.cs
Ще се опитам да опиша простичко, как се разработва прост extension add-on за Chrome. Понякога е много полезно да се работи с подобни скриптове, особено при скрапване на web-съдържание, когато конвенционалните методи не работят или изискват прекалено много усилия.
За да се създаде подобен скрипт с потребителски интерфейс ще са ни необходими няколко файла: manifest.json – всяка добавка (extension) за Chrome (а и за другите браузери) съдържа подобен скрипт, който предоставя важна информация на браузера. Повече тук: Manifest File Format popup.html – стандартно наименование на файла с потребителския интерфейс, който се появява при клик с мишката върху добавката. Разбира се, можем да създадем добавка, която няма нужда от потребителски интерфейс, но в случая аз искам да имам. Името на този файл се посочва в manifest.json. popup.js – файл, който се зарежда чрез popup.html. Можем и да нямаме подобен файл и да поместим javascript кода направо в popup.html. Но тенденциите в модерното програмиране съветват да се диференцира всичко – стилове, скриптове, html. В моя случай popup.js е двигателя на Chrome добавката. Той посочва какво, кога и къде да се активира. getPagesSource.js – файл за инжектиране в web-страницата и извлича информацията от нея. Този файл се зарежда от popup.js. icon.png – някаква иконка, която да се показва в листата с добавките на Chrome.
Нека създадем скрипт, който извлиза съдържанието на определени тагове, като използваме javascript функцията querySelectorAll(). Много приятна функция, която заменя в известна степен нуждата от XPath при web-скрапинга.
Да започваме! Първо създаваме manifest.json, като описваме какво прави тая добавка:
1
2
3
4
5
6
7
8
9
10
11
{
"name": "Simple web scraper",
"version": "1.0",
"manifest_version": 2,
"description": "Get content from tags through querySelector",
"browser_action": {
"default_icon": "icon.png",
"default_popup": "popup.html"
},
"permissions": ["tabs", "<all_urls>"]
}
{
"name": "Simple web scraper",
"version": "1.0",
"manifest_version": 2,
"description": "Get content from tags through querySelector",
"browser_action": {
"default_icon": "icon.png",
"default_popup": "popup.html"
},
"permissions": ["tabs", "<all_urls>"]
}
След това си правим потребителския интерфейс popup.html – бутончета, поленца, форми, стилове, каквото ни е кеф. В случая ще се огранича на минимума за моите нужди – текстово поле, бутон, слой за резултата:
chrome.runtime.onMessage.addListener(function(request, sender){
selElements(document, request.customSelector);});function selElements(document_root, s){// Tova go dobaviam zaradi kefa da polzvam foreach() v JavaScriptvar forEach =function(array, callback, scope){for(var i =0; i < array.length; i++){
callback.call(scope, i, array[i]);}};var myNodeList = document.querySelectorAll(s);var concatenateall ='';
forEach(myNodeList,function(index, value){
concatenateall = concatenateall + value.innerHTML+"<hr />";});// return concatenateall;
chrome.runtime.sendMessage({
action:"getSlectedContent",
source: concatenateall
});}
chrome.runtime.onMessage.addListener(function(request, sender) {
selElements(document, request.customSelector);
});
function selElements(document_root, s){
// Tova go dobaviam zaradi kefa da polzvam foreach() v JavaScript
var forEach = function (array, callback, scope) {
for (var i = 0; i < array.length; i++) {
callback.call(scope, i, array[i]);
}
};
var myNodeList = document.querySelectorAll(s);
var concatenateall = '';
forEach(myNodeList, function (index, value) {
concatenateall = concatenateall + value.innerHTML + "<hr />";
});
// return concatenateall;
chrome.runtime.sendMessage({
action: "getSlectedContent",
source: concatenateall
});
}
Това е.
Сега остава да заредим добавката в Chrome. Това става като отворим More Tools -> Extensions. След това кликаме на бутона Load unpacked и избираме директорията с файловете на нашата добавка.
На базата на тази добавка могат да се направят много други, тъй като съдържа базата за писане на добавки за Chrome.
Viber е удобен чат клиент, но възможностите за експортиране на разговор са никакви. За това написах проста програмка на AutoIt, която да експортира разговор с избран потребител до по-достъпен формат. За сега експортира до Excel и HTML. Програмката се казва Viber Export Conversation. Сорса е много прост и е писан набързо, колкото да свърши работа. За сега е тествана под Windows 7 64bit. Няма си на идея, дали ще работи под други Windows-и. Ще съм благодарен, ако някой намери бъг или не може да подкара програмата и ми сподели като коментар.
В архива се намира и сорса за компилиране с AutoIt.
За да се ползва програмката, трябва да се разархивира. Конвертираните файлове (excel или html) се записват в директорията на exe-то.
PS: Имах желание да портна програмата до Android, но ще иска root, за да чете базата данни на Viber, а не всеки потребител иска да си рутва телефона. За това, поне за сега я оставям във версия за PC.
Bootstrap и tinyMCE са ми редовна комбинация. И за да не откривам топлата вода всеки път, ще постна малко подсетки с прост мой плъгин за tinyMCE.
Важно е да се промени javascript променливата current_host. Demo Download
Беше ми необходима проста програма за конвертиране на видео до webm и ogg video (ogv), която да ми позволява пълен контрол на изходния файл. Тъй като не намерих такава безплатна, освен конзолния ffmpeg, реших да спретна едно GUI за ffmpeg с просто кодиране в AutoIt. Чудих се за името на програмата и реших да не се правя на оригинален, затова е Ned video converter.
Програмата в момента конвертира до webm, avi, ogv, mp4, flv и mkv. Но позволява да се стартира кодиране до всякакъв формат, ако познавате инструментите на ffmpeg. Стартирането на процеса взима стринга от полето Command и така могат ръчно да се променят всички параметри. Например можем да зададем ръчно команда за конвертиране на видео до mp3-файл, като в полето Command въведем следния тринг:
Разбира се ръчните настройки са само опционални, спокойно могат да се ползват вградените скромни опции на GUI-то.
Важно е да се отбележи, че при ресайзване на видео по широчина, тогава височината се променя в съотношение, за това зададената височина трябва да е кратна на 2. Това е причината понякога ресайването да не работи. Просто се въвежда нова стойност на широчината, увеличена или намалена с +1 (примерно 600 не работи, тогава се пробва с 601, 602 и т.н.) и се натиска бутона Generate Command.
Ако файловете се получават големи или с недобро качество е добре да се попрочете документацията на ffmpeg. Параметрите за конвертиране могат да се променят и от външния ini-файл, така че да паснат на конкретните нужди.
Прилагам и сорса, който е доволно прост. Отделил съм GUI-частта и фукциите от основния файл, за да има по-добра четимост.
При конжертиране на avi и mkv (matroska) съм задал да се използва параметъра -crf за контрол на качеството. По принцип за запазване на качеството, каквото е във входния файла, параметъра се сетва на -crf 23. За по-малък файл и по-лошо качество може да се остави на -crf 25 или повече. За по-добро качество на картината може да се пробва с -crf 19.
Сорса е абсолютно свободен за ползване, променяне, споделяне.
Изтегляне за 32 и 64bit Windows: Ned_video_converter-32bit-0.02.zip Ned_video_converter-64bit-0.02.zip
Ако има проблеми с програмката, моля да ги споделите в коментарите.
По-долу може да се види кратко видео с примерно конвертиране до webm и mp4 формати. Видеото е конвертирано до тези формати, за да мога да го вградя в тази страница. Видеото, което конвертирам е свален от YouTube клип Camila Cabello – Havana ft. Young Thug.
В програмирането има едно правило, което перефразирано гласи да не търсиш топлата вода всеки път. За това качвам няколко базови кода за Bootstrap 3, които съм писал или копирал и променял. Помогнал съм си леко с Less за някои стилове.
Custom menu
Нищо ново. Добавено е само малко CSS-кодиране на менюто, което се предлага стандартно с Bootstrap.
От известно време се каня да променя логин формата за админ панела на проектите, които правя. Направих една форма, която не знам дали ще ползвам, но ще ми е полезна като отправна точка. За да си помогна за стиловете използвах Less (език за стилови множества или CSS) и GUI-то SimpLESS – портабъл е и работи доста леко за разлика от други подобни.
Често ми се налага да преминавам от Linux към Windows и обратно. И под двете операционни системи ползвам Transmission за торент клиент. Настроил съм го под Linux да зарежда торент-файловете от директория на версията за Windows. Проблема е, че в такива случаи Transmission под Linux добавя разширението “*.added” на торент файловете. Ако файловете са десетки, трябва да се помисли за автоматизирано преименуване, за да не се губи време. Прилагам няколко варианта, които вършат работата за премахване на *.added разшиернието:
for file in *.added; do mv "$file" "${file%.added}"; done;
с командата rename (не съм октрил читава версия за Windows, освен в CygWin):
rename 's/.added$//'*.added
rename 's/.added$//' *.added
Или още по-просто:
rename .sss .txt *.sss
rename .sss .txt *.sss
с командата mmv – инструмент за масивно местене на файлове по определени критерии
Ако го няма във вашата Linux дистрибуция, можете да си го добавите. Примерно за Ubuntu:
sudoapt-get install mmv
sudo apt-get install mmv
Ако използвате CygWin под Windows, ще трябва да го инсталирате с инсталатора:
След като го имаме наличен, можем да разкарваме разширения така:
mmv '*.added''#1'
mmv '*.added' '#1'
Ако искаме да преименуваме разширения:
mmv '*.html''#1.txt'
mmv '*.html' '#1.txt'
В случая не преименувам, а премахвам разширението. Но командите спокойно могат да се ползват за преименуване.
Под Windows използвам конзолата на CygWin – страхотен Unix емулатор за Windows.
Amascrap е програма тип “web scraper”, която извлича и логва цени от Amazon.co.uk. Програмата е базирана на PHP, HTML, Javascript (jQuery). Вградил съм Traktor на цените, за да имат някаква проследяемост във времето. Скриптовете могат да се използват и като Web-сайт.
Програмата я написах за мен, защото често ми се налага да пазарувам от Amazon.co.uk. Забелязах, че в сайта доста продукти си сменят цените през няколко дни и има значение, дали ще си купиш нещо с 10 паунда по-ниска цена. Все пак съм си българче :). Traktora позволява да следиш, през колко време някой продукт си сменя цената, което си е идеална статистика. Помогна ми да разбера, че някои продукти имат абсолютно точен цикъл на смяна на цената. Особено добре се вижда преди или след празници.
Не съм писал демон за автоматичен ъпдейт, за това цените трябва да се ъпдейтват ръчно. При много продукти и ъпдейт на всички се получава лаг, който няма как да се избегне. Все пак нямам достъп до базата данни на Амазон, нит ползвам API. Чист и класически Web-скрапер с XPath и cURL под PHP.
За GUI използвах PHP Desktop с MSIE (не ме целете с камъни, просто Chrome вдигна много мегабайтите).
Кратък видео урок, как се работи с програмата:
[flv:https://blog.nediko.info/examples/amascrap/Amascrap-v.0.01-Tutorial.flv https://blog.nediko.info/examples/amascrap/Amascrap.jpg 584 406]
Програмата с сорс-кода може да се изтегли от тук: Amascrap v.0.04 – Ъпдейт на 13.06.2016. Оправени са проблеми при сваляне на данните през HTTPS.
Има един досаден бъг в Laravel 4.2. Не иска да обработва post-заявка, насочена към root-адреса. Говоря за това:
1
2
3
Route::post('/',function(){// ...});
Route::post('/',function(){
// ...
});
В такива случаи Laravel сеправи на чук и просто рефрешва страницата.
Открих 2 трики-метода за заобикаляне на бъг-а:
1. Поставя се шпация, ако формата е насочена към текущата страница:
This website uses cookies to improve your experience. We'll assume you're ok with this, but you can opt-out if you wish.AcceptRead More
Privacy & Cookies Policy
Privacy Overview
This website uses cookies to improve your experience while you navigate through the website. Out of these, the cookies that are categorized as necessary are stored on your browser as they are essential for the working of basic functionalities of the website. We also use third-party cookies that help us analyze and understand how you use this website. These cookies will be stored in your browser only with your consent. You also have the option to opt-out of these cookies. But opting out of some of these cookies may affect your browsing experience.
Necessary cookies are absolutely essential for the website to function properly. This category only includes cookies that ensures basic functionalities and security features of the website. These cookies do not store any personal information.
Any cookies that may not be particularly necessary for the website to function and is used specifically to collect user personal data via analytics, ads, other embedded contents are termed as non-necessary cookies. It is mandatory to procure user consent prior to running these cookies on your website.