Wednesday, December 19, 2018

Instagram Download Links

Hmmm..... this no longer appears to work. Needs reworking, and check here.

To view a full size Instagram picture, append

media/?size=l
, e.g.

https://www.instagram.com/p/B3hoo93BLA1UtIa4QJvMu1iyBPvX1PGbeH5XfI0/

should be updated to:

https://www.instagram.com/p/B3hoo93BLA1UtIa4QJvMu1iyBPvX1PGbeH5XfI0/media/?size=l

A simple Tampermonkey script to add a link to an Instagram page to allow the image to be downloaded.

// ==UserScript==
// @name Instagram Download Link
// @namespace http://tampermonkey.net/
// @version 0.1
// @description Add a link to download photos....
// @author Me
// @match https://www.instagram.com/*
// @grant none
// @require https://code.jquery.com/jquery-3.3.1.min.js
// ==/UserScript==

var currentPage;
var domChangeTimer = '';
var listenerInstalled = false;

$(window).bind('load', MainAction);

function MainAction() {

  // add a listener to the page so this function is run each time the page changes...
  if (!listenerInstalled) {
    document.addEventListener("DOMSubtreeModified", HandleDomChange, false);
    listenerInstalled = true;
  }

  // check the current URL. This will change as AJAX changes the page...
  if (currentPage != window.location.href) {
    currentPage = window.location.href;

    // is the link to the image available...?
    var link = $('meta[property="og:image"]').attr('content');

    // if not, and the page is just of a single image
    // e.g. https://www.instagram.com/p/BuRxiC5Hr4i/
    // then reload the page so the link is available...
    // this is clumsy, but can't find another way to get at the DOM as updated by AJAX
    if (window.location.href.match(/\/p\//) && link == undefined) {
      window.location.reload();
    } else if (!window.location.href.match(/\/p\//) && link != undefined) {

      // and if we've just mmoved off a single image page
      // reload again to get rid of the image metadata from our copy of the DOM
      // that has since been updated by AJAX
      window.location.reload();
    }

    console.log("Download link : " + link);

    // if the link is available, add it to the page...
    if (link != undefined) {
      $("article").append("Download Link");
    }
  }
}

function HandleDomChange(zEvent) {

  // why do we do this here...?
  if (typeof domChangeTimer == "number") {
    clearTimeout(domChangeTimer);
    domChangeTimer = '';
  }

  // DOM has changed, so set a timer...
  // Note that this may be updated numerous times, but the function
  // will only be called when the timer hasn't been set for x ms
  domChangeTimer = setTimeout (function() {
    MainAction();
  }, 500); // in ms
}

Wednesday, November 28, 2018

Counting Files

A quick bash script to count the number of files in a set of directories:

DIRS=`ls -d */`
for D in $DIRS;
do
  printf "$D "
  find $D -type f|wc -l
done

Tuesday, November 27, 2018

MySQL Scheduling

Managing Events

Switch on the event scheduler in the database

SET GLOBAL event_scheduler=on;

To set it on startup, it is necessary to update "/etc/mysql/my.cnf" to add the following:

[mysqld]
event_scheduler = on

Create event to periodically update the database

USE temperatures;
CREATE DEFINER = 'root'@'localhost' event
  IF NOT EXISTS snapshot
ON SCHEDULE EVERY 15 minute STARTS '2018-11-27 00:00:00'
DO
  INSERT INTO temperatures.minmax
    SELECT curdate(), round(min(outside_temp), 1) as min, round(max(outside_temp), 1) AS max
      FROM temperatures.readings WHERE datetime > curdate()
    ON DUPLICATE KEY UPDATE
      min = min, max = max;
Show and delete events

SHOW EVENTS;
SHOW CREATE EVENT snapshot;
DROP EVENT snapshot;
SHOW PROCESSLIST;

Note that code blocks may need the delimiter to change to allow the client to accept nested statements:

DELIMITER //

BEGIN
  SELECT * FROM mytable;
END //

To show all events:

SHOW EVENTS;

To show existing event scripts for a given event

SHOW CREATE EVENT snapshot;

And to alter event scripts

ALTER EVENT snapshot
DO
[new code];

Wednesday, October 24, 2018

Basic MySQL

To get rid of the annoying Ctrl+c issue use mysql -u root -p --sigint-ignore

Managing Users

SELECT user, host FROM mysql.user;
CREATE USER 'user'@'server' IDENTIFIED BY 'mypassword';

SHOW GRANTS FOR 'user'@'server';
GRANT INSERT, SELECT, UPDATE ON stuff.* TO 'user'@'server';
REVOKE INSERT ON stuff.* from 'user'@'server';

DROP USER 'user'@'server';

Managing Databases

CREATE DATABASE stuff;
SHOW DATABASES;
USE stuff;
DROP DATABASE stuff;

Managing Tables

CREATE TABLE music (
  id INT unsigned NOT NULL AUTO_INCREMENT,
  artist VARCHAR(50) NOT NULL,
  title VARCHAR(50) NOT NULL,
  PRIMARY KEY (id)
);
SHOW TABLES;
DESCRIBE music;

ALTER TABLE music ADD release_date DATETIME AFTER title;
ALTER TABLE music CHANGE COLUMN release_date rel_d DATE NOT NULL;
ALTER TABLE music DROP COLUMN rel_d, RENAME TO media;

DROP TABLE music;

Managing Records

INSERT INTO music (artist, title) VALUES
  ('Prefab Sprout', 'Steve McQueen'),
  ('Elbow', 'Asleep at the Back');

SELECT COUNT(*) AS total FROM music WHERE artist LIKE 'Elb%';
SELECT * FROM music WHERE release_date IS NULL ORDER BY artist;
SELECT * FROM stuff WHERE datetime > curdate() - INTERVAL 1 DAY;
SELECT * FROM temperatures.readings
  WHERE pressure=(SELECT min(pressure) FROM temperatures.readings);

UPDATE music SET title='Cast of Thousands' WHERE title='Asleep at the Back';
DELETE FROM music WHERE artist='Elbow';

Tuesday, July 03, 2018

systemd

Time to move on from using the init daemon to manage starting and stopping processes and services.

systemd is a system management daemon that replaces init.d and is available on most distributions.

Fedora documentation can be found here.

To create a new service, create a new configuration file /etc/systemd/system/foo.service (note that absolute path names are required, even for interpreters etc.):

[Unit]
Description=My service
Requires=network.target mysql.service

[Service]
Type=simple
ExecStart=/usr/bin/java -Dapp.properties=/home/pi/clock.properties -jar /home/pi/clock-1.1.jar

[Install]
WantedBy=multi-user.target

To start:
sudo systemctl start foo

To enable on startup:
sudo systemctl enable foo

To check if enabled
sudo systemctl is-enabled foo