יום שבת, 19 בנובמבר 2022

Script for creating html bookmarks file for Chrome to import

#!/bin/bash
#
# Run this script on a file named urls.txt with all your URLs and pipe the output to an HTML file.
# Example: ./convert_url_file.sh > bookmarks.html

echo "<!DOCTYPE NETSCAPE-Bookmark-file-1>"
echo '<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8">'
echo '<TITLE>Bookmarks</TITLE>'
echo '<H1>Bookmarks</H1>'
echo '<DL><p>'
  cat urls.txt |
  while read L; do
    echo -n '    <DT><A HREF="';
        echo ''"$L"'">'"$L"'</A>';
  done
echo "</DL><p>"

 

 

יום שני, 11 ביולי 2022

Simple Using SQUID proxy server for Ubuntu 20.04

sudo apt install squid

sudo cp /etc/squid/squid.conf /etc/squid/squid.conf.original
sudo chmod a-w /etc/squid/squid.conf.original

sudo nano /etc/squid/squid.conf
 

inside squid.conf
http_port XXXXX
http_access allow all

sudo update-rc.d squid disable
sudo systemctl restart squid.service
sudo systemctl status squid
sudo systemctl disable squid
sudo systemctl stop squid
 

יום שבת, 25 ביוני 2022

The right way to use rsync

 rsync -avW -LK --progress ./from /to

 

Enable snap mysql-workbench to have access to the network

 sudo snap connect mysql-workbench-community:password-manager-service :password-manager-service

יום שבת, 19 במרץ 2022

Making sure my linux system does not wake up on suspend

Had this annoying problem in my linux Xubuntu 20.04 when putting on suspend the system then starts even though I put it in suspend and sleep.

Using acpitool to turn off wake-up from unnecessary devices.

But the problem the change is not permanent and does not survive a restart.

So I used cron @reboot to make sure it is always off:

@reboot acpitool -W 3 && acpitool -W 9 && acpitool -W 10 && acpitool -W 17 && acpitool -W 63 && acpitool -W 64 && acpitool -W 66 && acpitool -W 68 && acpitool -W 74
 

 


יום חמישי, 17 במרץ 2022

Scanning Local Network for Devices

 nmap -sT 192.168.1.1/24

 

 

יום שבת, 5 במרץ 2022

MySQL Test Timezone Script

 CREATE TABLE tzt(
id MEDIUMINT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
ts TIMESTAMP NOT NULL,
dt DATETIME NOT NULL
);

SELECT @@global.time_zone, @@session.time_zone;


SET GLOBAL time_zone = 'Asia/Jerusalem';
SET SESSION time_zone = 'Asia/Jerusalem';

INSERT INTO tzt SET ts='2021-08-22 13:30:00', dt='2021-08-22 13:30:00';

SELECT * FROM tzt\G

SET GLOBAL time_zone = 'America/Sao_Paulo';
SET SESSION time_zone = 'America/Sao_Paulo';


SELECT * FROM tzt\G

rsync backup command

 rsync -avW --progress ./from /to


יום שני, 10 בינואר 2022

Connecting to mysql with TLS 1.2 SSL encrypted connection

In order to be able to connect to MySQL remote server using encrypted connection overt TLS1.2 you will need a .pem certificate of CA.

 You can obtain the certificate here: https://dl.cacerts.digicert.com/DigiCertGlobalRootCA.crt.pem

(DigiCertGlobalRootCA.crt.pem)

Read more here:

https://docs.microsoft.com/en-us/azure/mysql/flexible-server/how-to-connect-tls-ssl

Here is a PHP sample for connection with SSL to MySQL encrypted connection on TLS1.2:

self::$mysqli = mysqli_init();
//self::$mysqli->options(MYSQLI_OPT_SSL_VERIFY_SERVER_CERT, true);
self::$mysqli->ssl_set(NULL, NULL, "DigiCertGlobalRootCA.crt.pem", NULL, NULL);
self::$mysqli->real_connect(host', 'username', 'password', 'database'); // , 3306, MYSQLI_CLIENT_SSL);

//self::$mysqli = new mysqli('hots', 'username', 'password', 'database');   
self::$mysqli->set_charset('utf8');
return self::$mysqli;

Here is the full certificate for MySQL secure connection

    -----BEGIN CERTIFICATE-----
MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD
QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT
MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j
b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG
9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB
CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97
nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt
43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P
T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4
gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO
BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR
TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw
DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr
hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg
06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF
PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls
YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk
CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=
-----END CERTIFICATE-----
  

יום שבת, 20 בנובמבר 2021

Some pitfalls for using PWA and ServiceWorkers I hoped I knew before

Some pitfalls for using PWA and ServiceWorker I hoped I knew before - So I am writing them here so maybe others will get to rid them before or I can find them again when I'll need them again.

This is not a tutorial for PWA, ServiceWorker. Those are just a few points that I encountered while developing a PWA (Progressive Web App) and ServiceWorker using Vanilla JavaScript and caching mechanism for Offline usage. There are plenty of good PWA ServiceWorker Caching tutorial on the internet.

Full Vanilla JavaScript code is attached all the way at the bottom

Double caches:

First, the cache made by the cache mechanism which you as a coder decide what will be saved in this cache using the cache.addAll() command.

And the second cache is the one the browser automatically caches for example images and javascripts code or others.

Hence might be that when you work offline the browser will return cached images which you did not stated that should be cached only because the browser caching mechanism have cached them.


Cache is empty offline from the website {ignoreVary: true}:

You develop and everything works cool from your localhost server but when deploying and installing on production on your website the offline cache of the serviceworker is empty in the devtools of your Chrome browser. When you work Online you do see the cache.

Now weather I think it appears empty it is a Chrome bug because the cache is there - apparently your code does not recognize the cache using caches.match and tries to request it from the network.

There are two things needed to be done:

  1. Use caches.match(e.request, {ignoreVary: true}) in your code telling the cache match comparing mechanism to ignore the request type and use only the URL itself
  2. When installing the serviceWorker it should be by default working under the same directory it is installed from. Unfortunately it doesn't always work. So when installing the serviceWorker use the scope parameter: navigator.serviceWorker.register('sw1.js', {scope: './'}) 

There can be only one instance of the ServiceWorker for the domain:

So no need to reinstall the worker when you go offline and the list of resources need to be relative to the service worker location:

const includeToCache = [
  './',
  'index.php',
//  'loader.js?20211118a', // the serviceWorker loader
//  'sw1.js', // the serviceWorker itself
]; 


The full code of the serviceWorker

// service worker for PWA loaded from loader.js in pwa.class.php

const cacheName = 'pwa_v10';

const includeToCache = [
  './',
  'index.php',
//  'loader.js?20211118a',
//  'sw1.js',
];

// Start the service worker and cache all of the app's content
self.addEventListener('install', e => {
    self.skipWaiting();
    e.waitUntil(
        caches.open(cacheName).then(cache => {
            let c = cache.addAll(includeToCache).catch(err => console.log('SW install addAll FAIL:', err));
            return c;
        })
    );
});

// Serve cached content when offline
self.addEventListener('fetch', e => {
    e.respondWith(
        caches.match(e.request, {ignoreVary: true}).then(response => {
            return response || fetch(e.request);
        })
    );
});

// replacing new cache if needed
self.addEventListener('activate', e => {
    // delete any caches that aren’t in cacheName
    // which will get rid of older versions
    e.waitUntil(
        caches.keys().then(keys => Promise.all(
            keys.map(key => {
                if(cacheName !== key) {
                    return caches.delete(key);
                }
        }))).then(() => {
            console.log(cacheName + ' now ready to handle fetches!');
        })
    );
});

יום רביעי, 7 באוקטובר 2020

Using phpword to merge two Mircrosoft Office Word .docx documents

How to combine or embed and insert another .docx file (Microsoft office docx word document) into another one using PHPWord

Joining two .docx document using php (phpword library)

$mainTemplateProcessor = new \PhpOffice\PhpWord\TemplateProcessor("file1");
//$mainTemplateProcessor ->setValue('var_name', $value);

$innerTemplateProcessor = new \PhpOffice\PhpWord\TemplateProcessor("file2");
//$innerTemplateProcessor->setValue('var2_name', $value2);

// extract internal xml from template that will be merged inside main template
$innerXml = $innerTemplateProcessor->gettempDocumentMainPart();
$innerXml = preg_replace('/^[\s\S]*<w:body>(.*)<\/w:body>.*/', '$1', $innerXml);

// remove tag containing header, footer, images
$innerXml = preg_replace('/<w:sectPr>.*<\/w:sectPr>/', '', $innerXml);

// inject internal xml inside main template
$mainXml = $mainTemplateProcessor->gettempDocumentMainPart();
$mainXml = preg_replace('/<\/w:body>/', '<w:p><w:r><w:br w:type="page" /><w:lastRenderedPageBreak/></w:r></w:p>' . $innerXml . '</w:body>', $mainXml);
$mainTemplateProcessor->settempDocumentMainPart($mainXml);

$mainTemplateProcessor->saveAs($result_file_name);


In order for the above code to work, you need to modify edit and add to the TemplateProcessor.php file those two functions:

public function gettempDocumentMainPart()
{
    return $this->tempDocumentMainPart;
}

public function settempDocumentMainPart($new)
{
    return $this->tempDocumentMainPart = $new;
}


This answer is based on the answer of @pfleu here: https://github.com/PHPOffice/PHPWord/issues/1130



 

יום שבת, 26 בספטמבר 2020

Teu Sonho - Online Interprete Seus Sonhos (teusonho.org)

Teusonho.org - Online Interprete Seus Sonhos

https://teusonho.org é um software de interpretatação online de sonhos usando IA para análise em tempo real de sonhos repetidos e símbolos de sonhos.I took my website for dream analysis using Artificial Intelligence and Machine Learning that I have created in Hebrew https://dreamon.co.il and also in English https://understandmydreams.com and created a version in Portuguese https://teusonho.org with new dream symbols and new dreams.

Peguei meu site para análise de sonhos usando Inteligência Artificial e Aprendizado de Máquina que criei em hebraico https://dreamon.co.il e também em inglês https://understandmydreams.com e criei uma versão em português https://teusonho.org com novos símbolos de sonho e novos sonhos.

Also on twitter: https://twitter.com/OrgTeusonho

 

Online Interprete Seus Sonhos

יום ראשון, 30 באוגוסט 2020

nginx rewrite and redirect rule like .htaccess in apache

In order to rewrite for example:

https://www.teusonho.org/symbol/casa to /symbol.php=casa

You can use:

location /symbol {
         rewrite ^/symbol/([^/\.]*)$ /symbol.php?symbol=$1;
    }

Loading (importing) an .sql mysql dumpfile and showing progress bar

When loading and importing a large .sql mysql dump file and you wish to know how long is it going to take and where does the process status is standing using a progress bar from the mysqldump loading you can us pv (pipe viewer)

For example:

pv sqldumpfile.sql | mysql database name

About pv (pipe viewer) utility for Linux:


יום שלישי, 26 במאי 2020

Connecting to MySQL 8 from Old PHP version using mysqli

If you have upgraded your MySQL to MySQL 8 version and still using older version of PHP you might encounter a few problems in the connection using mysqli connector library.

1.
The first problem we are going to solve is:

php mysql 8: "Server sent charset (255) unknown to the client. Please, report to the developers"

The problem is that MySQL have changed the default character set from utf8 to utf8mb4 and it is not supported by mysqli connector (nor PDO as I have checked) in older versions of php.

"The default collation for utf8mb4 differs between MySQL 5.7 and 8.0 ( utf8mb4_general_ci for 5.7, utf8mb4_0900_ai_ci for 8.0). When the 8.0 client requests a character set of utf8mb4 , what it sends to the server is the default 8.0 utf8mb4 collation; that is, the utf8mb4_0900_ai_ci."

The way to solve it easily (there are other ways, such as upgrading php or connectors and more ...) is to force MySQL 8.0 to use UTF8 as default charset for connection.

Add those lines at the end of the my.cnf configuration file. In Ubunutu 20.04 it will be /etc/mysql/mysql.conf.d/mysqld.cnf

So:
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

And add at the end (must be at the end of the file):
[client]
default-character-set=utf8

[mysql]
default-character-set=utf8

[mysqld]
collation-server = utf8_unicode_ci
character-set-server = utf8
default_authentication_plugin = mysql_native_password

do not forget to restart the server after:
sudo service mysql restart

2.
Second problem is new plugin for MySQL 8 passwords. Instead of the default mysql_native_password it is now using caching_sha2_password so you will get the error:  mysqli::__construct(): The server requested authentication method unknown to the client [caching_sha2_password]

The last line we added to the my.cnf file should fix it but not entirely. When creating the users inside your database make sure to CREATE USER or ALTER USER to use the mysql_native_password like that:

CREATE USER 'username'@`location` IDENTIFIED WITH mysql_native_password BY '[somepassword]'; 

That solved me some problems.

יום שני, 25 במאי 2020

The way I use mysqldump



sudo mysqldump --master-data=1 --flush-logs --single-transaction --routines --quick --all-databases > db.sql

יום שישי, 15 במאי 2020

Simple system to track errors in code and find them easily

Hi,

Here is a trick I developed during my years as a developer / programmer and team code leader. This system not just helps you to find the location of the error or warning in the code, but also who wrote it (without the need to open Git Blame or SVN log) and when was it coded in written.

They say that grep (find in all files) is the best friend of the programmer. Hence if you see an error in text or log file, let's say "Error: can't find configuration file". So you copy the text and "grep" it. It might be you would find this string in a few places scattered around the code.

So, we have started to give some Error Codes to the error. For example "Error: can't find configuration file (1029)". This will make it much easier and this unique error code is easy to search inside all the code files.

So how do you keep all the Error Codes unique ? Maybe a new programmer will add the same code number.

Do you keep a file with all Error Codes ?

Here is my system for assigning error codes:

"Error: some error description (ErrorCode: 20200515.1271726)"

And here is the format of the Error Code

YYYYMMDD.XXXHHII

YYYY, MM, DD - is obvious the date the code was written

HH, II - is the hour and minutes

The XXX is a unique number each of the coder team member identifier.

So let's say a programmer called Dani with code 019 have to add a new log  line with some warning or error. He will add 20200515.0191727 as the Error Code.
Next time I will see this code I can easily 'grep' it and I can also know who wrote this piece of code and when.

Believe me, it helps when the team is large.

Cheers.
Cnaan

יום שלישי, 24 במרץ 2020

Defragmentation and resizing to minimize HD size of a Virtual Machine Drive for Virtual Box

When creating a Virtual HD for Virtual Machine in Virtual Box, you can create a large disc space but the actual size on the disc can be much smaller until you fill it up.
But after you fill it, and then delete and try to free space the size on the host disc still remain large.

Here is how to resize the Virtual Drive HD on the host machine:

You have to do the following steps:

Run defrag in the guest (Windows only)
Nullify free space:

With a Linux Guest run this:
dd if=/dev/zero of=/var/tmp/bigemptyfile bs=4096k ; rm /var/tmp/bigemptyfile
Or:

telinit 1
mount -o remount,ro /dev/sda1
zerofree -v /dev/sda1
With a Windows Guest, download SDelete from Sysinternals and run this:

sdelete.exe c: -z
(replace C: with the drive letter of the VDI)

Shutdown the guest VM

Now run VBoxManage's modifymedium command with the --compact option:

With a Linux Host run this:

vboxmanage modifymedium --compact /path/to/thedisk.vdi
With a Windows Host run this:

VBoxManage.exe modifymedium --compact c:\path\to\thedisk.vdi
With a Mac Host run this:

VBoxManage modifymedium --compact /path/to/thedisk.vdi
This reduces the vdi size.

https://superuser.com/questions/529149/how-to-compact-virtualboxs-vdi-file-size

יום רביעי, 11 במרץ 2020

גרף שעוקב אחר התפשטות והדבקות נגיף הקורונה בארץ

העיתונות מפרסמת הרבה מספרים והרבה מלל. אז אני מנסה לתמצת את זה, ותמונה שווה יותר מאלף מילים וגרף שווה יותר. אז אני אוסף את פרומי העיתונות ועוקב כמה חולי קורונה חדשים יש לנו כל יום ושם את זה על גרף בשאיפה לראות מגמות, כמה נדבקים, כמה נדבקו בארץ מקורונה ולכמה תחלואה בארץ ישראל גורם הנגיף COVID-19. 

ניתן גם לראות את המספרים הגולמיים של חולי הקורנה, הדבקות חדשות, חולים קשה וכמה הבריאו מהנגיף ישירות במסמך Google Sheets שיצרתי על חולי הקורונה.

והנה גרף חולי הקורונה בארץ:

יום שבת, 7 במרץ 2020

Firefox notifications permissions fix for non secured domains (http and not https)

I had a running internal service inside an organization intranet. We wanted to allow notifications (web notifications) but we couldn't. In order to allow notifications for website and domains, both Firefox and Chrome requires https. Quite annoying since it is an Intranet inside the organization.

Trying to install a self-sign certificate or a signed certificate inside the organization (where there is no outside internet connectivity) it's really a pain in the a** and does not work well - and if you ask me it should be much easier and simple than it is.

I found a nice bypass workaround to allow notifications from websites and domains without SSL, hence http:// and not https:// for Firefox.

Firefox holds a file inside the Mozilla directory called permissions.sqlite which is a sqlite database file that holds the permissions for domains. You can add your domain there http://yourdomainname with permissions for notifications and it will work.

I have created a demonstration for Windows here
https://gist.github.com/caviv/8df5fa11a98e0e33557f75215f691d54 in go (golang)

יום שלישי, 28 בינואר 2020

Fixing screen not waking up (xorg) on Ubuntu from command line

Sometimes after xubunutu screen is in hibernate mode the screen does not wake up.

Open terminal ALT+CTRL+F1 (tty)

Run:
  sleep 5 && xrandr -d :0 --output 'eDP-1' --primary --auto

Then switch fast back to the graphic mode (ALT+CTRL+F7) wait a few seconds for the screen to wake up.

'eDP-1' is the name of your screen

You can see connected screens running
    xrandr -d :0


יום שני, 16 בספטמבר 2019

יום שלישי, 28 במאי 2019

Find files with BOM in linux command line

 grep -rl $'\xEF\xBB\xBF' .

יום ראשון, 13 בינואר 2019

Enlrage, resize bash command line linux history line to remember

nano ./.profile
nano ./.bashrc

# for setting history length see HISTSIZE and HISTFILESIZE in bash(1)
HISTSIZE=10000
HISTFILESIZE=20000

יום חמישי, 3 בינואר 2019

Disconnecting second monitor display from command line

xrandr --output eDP-1 --auto
xrandr --output VGA-1  --off


יום רביעי, 21 בנובמבר 2018

תזכורת פקודות הרשאות linux groups


Chmod for files:
chmod u=rwx,g=rx,o=r myfile

Get user and groups:
id
id www-data


Adding a user to a group:
sudo usermod www-apache --append --groups [groupname]

Removing user from group
sudo deluser username group

Change ownership:
chown {-R} [user]{:group} [file|directory]

Change group:
chgrp {-R} [group] [file|directory]

Login with www-data user (www-data is set to /usr/sbin/nologin):
sudo su -l www-data -s /bin/bash

יום שישי, 24 באוגוסט 2018

Finding all elements with z-index inside a a page

var all = document.querySelectorAll('*');
for(var i = 0; i < all.length; i++) {if(all[i].style.zIndex > 0) {console.log(all[i].style.zIndex); console.log(all[i]);}}

יום חמישי, 23 באוגוסט 2018

דף שמעדכן את חברות הביטוח וקרנות ההשתלמות לשלוח את הדוחות השנתיים בנייר

הי,
אני רוצה דו"ח בנייר.
אם גם אתכם זה מרגיז שחברות הביטוח וקרנות ההשתלמות עברו באופן חד-צדדי לשלוח את הדוחות בהודעת SMS, אז כתבתי כאן שירות קטן שמעדכן את החברות לשלוח שוב את הדו"ח בנייר כמו פעם.

יום רביעי, 22 באוגוסט 2018

Download a webpage and all needed data,files,css,js and more

 wget --page-requisites https://thewebsite