Let's consider for a fact that we have a very pseudo secure environment. Pseudo referring to something that has been purified of everything that can be a source of vulnerability. So we have no compilers, no runtimes and of course no internet. Also we have some physical security, the whole thing is locked in a box with only the cables for monitor, keyboard etc. and a wire with a button on it to start the machine.
Boss asks, is there any way for someone to harm this system.
YES! SO MANY WAYS!
Just ctrl-A and delete, dude.
PS: My task is too keep the antivirus up to date....
done_
Saturday, August 31, 2019
Sunday, July 21, 2019
Javascript: Do it like php!
So, I just wanted a simple thing... I had a static html page where I wanted to put some things in dynamically: a simple date at the start and an extended date in the middle of the text. (Also what is server side?)
Pure elegant javascript:
Php infected javascript:
plus if in 'I was never here' mode:
done_
Pure elegant javascript:
.... <span data-value="simple"></span> ....
<script>
var data = {
simple: gen_simple(),
....
}
for (var i of document.querySelectorAll('[data-value]')) {
i.innerHTML = data[i.getAttribute('data-value')];
}
<script>
Php infected javascript:
.... <script>document.write(gen_simple())</script> ....
plus if in 'I was never here' mode:
....
<script>
for (var i of document.querySelectorAll('script')) i.parentNode.removeChild(i);
</script>
done_
Thursday, January 10, 2019
Java: Iterable iterator
We all have been in a position with an Iterator in our hands and trying to pass it to a for each loop. And then for some reason that is totally crazy for a second an error pops up:
"Can only iterate over an array or an instance of java.lang.Iterable"
What... a ok... and then what? You could just fix your logic in order or just google for "java iterator to iterable". But could you just make the iterator also an iterable somehow.
Step one, obviously, add the Iterable interface to your iterator:
Step two, add the missing method by return itself as its iterator:
done_
"Can only iterate over an array or an instance of java.lang.Iterable"
What... a ok... and then what? You could just fix your logic in order or just google for "java iterator to iterable". But could you just make the iterator also an iterable somehow.
Step one, obviously, add the Iterable interface to your iterator:
public class SuperIterator<T> implements Iterator<T>, Iterable<T> {
Step two, add the missing method by return itself as its iterator:
@Override
public Iterator<Character> iterator() {
return this;
}
done_
Wednesday, November 14, 2018
Windows: Uninstalling programs
Time to clean up the old windows machine a bit (Linux user here).
So I go looking for the good old control panel, but I find the "Settings" so I go there. Let me skip the whole design and usability comments.
The thing is that when you click tap the Uninstall button there is some times a huge delay until the admin confirm thing pops up. I don't know why this is, if its a security thing or just a bug.
So I thought I could open the whole "Settings" as an admin and then the confirm thing would not pop up.
Long story short, the only relevant thing I could find was to open with admin the command prompt. And from there you can start the control.exe which is actually the old classic control panel.
But nope, your are still in user mode.
After some googling research I found out that this is a fake cmd admin (the one in the start menu), you need to run `runas /u:administrator cmd` to get the actual admin cmd. And before you do that you need to kill the exploer.exe that already runs.
Then to restore the explorer you need to open admin task manager to kill the admin exploer and open non-admin cmd and ....
PS: In this process I had the pleasure to uninstall the microsoft silverlight
done_
Friday, September 28, 2018
Regex: Final v
This is the most greek a proggrammer can be.
Ακολουθεί μία από τις χρήσιμες regex που έχουν γράψει στην ζωή μου.
Εντοπίζει λάθος χρήση του τελικού ν και το αφαιρεί.
πχ. `στην ζωή μου` > `στη ζωή μου`
Οπότε το τρέχω στην πτυχιακή μου:
`227 results found`
Και σκέφτομαι: οι υπόλοιποι άνθρωποι τι κάνουν. Οπότε το τρέχω στην πτυχιακή της Χριστίνας:
`0 results found`
whatever_
Ακολουθεί μία από τις χρήσιμες regex που έχουν γράψει στην ζωή μου.
Εντοπίζει λάθος χρήση του τελικού ν και το αφαιρεί.
/ (τη|αυτή|δε|μη|στη)ν (([βδφθχλρσζ]|(μ[^π])|(ν[^τ])|(γ[^κ]))[^ ]*)/ $1 $2/
πχ. `στην ζωή μου` > `στη ζωή μου`
Οπότε το τρέχω στην πτυχιακή μου:
`227 results found`
Και σκέφτομαι: οι υπόλοιποι άνθρωποι τι κάνουν. Οπότε το τρέχω στην πτυχιακή της Χριστίνας:
`0 results found`
whatever_
Thursday, July 26, 2018
Java: enum or boolean for two value properties
The is always that tip that floats around that you should always use enums instead of booleans, even when there is only two values.
Of course the point is that it will be much easier to read and mainly to extend in the future.
So from a simple
public void setVisible(boolean value) { ...
you go to
public enum Visibility { Visible, Gone }
public void setVisible(Visibility value) { ...
And in the future you could add eg. the Invisible value.
But you miss the simplicity of a boolean and you also get the verbosity of an enum
setVisible(Visibility.Visible)
and this happens
setVisible(value ? Visibility.Visible : Visibility.Gone)
The classic solution is to add methods like show() or hide() to avoid the use of the enum
However a simply solution to collect the benefits of both world:
public void setVisible(boolean value) {
setVisible(value ? Visibility.Visible : Visibility.Gone)
}
public void setVisible(Visibility value) { ...
where the two boolean values will correspond to the two most used values of the enum
And why not add and some methods for the most used values
public void show() {
setVisible(Visibility.Visible)
}
So in the end you have everything
show() setVisible(true) setVisible(Visibility.Visible)
done_
Tuesday, May 16, 2017
C++: Euclidean distance variations
So how about this new std::hypot?
float dx = x1 - x2; float dy = y1 - y2; return std::hypot(dx, dy);
Time: 12139783 ticks
How about the old one std::sqrt?
float dx = x1 - x2; float dy = y1 - y2; return std::sqrt(dx*dx + dy*dy);
Time: 7026125 ticks (1.7 times faster)
Oh, the std::hypot performs an overflow check, so if you don't care about that just use std::sqrt
And of course the very old
float dx = x1 - x2; float dy = y1 - y2; return dx*dx + dy*dy;
Time: 5667812 ticks (2.1 and 1.2 times faster)
Wait, can I just do
return (x1 - x2)*(x1 - x2) + (y1 - y2)*(y1 - y2);
and let the optimizer fix it. Lets check
Time: 5592648 ticks (seems the same)
Source
done_
Friday, November 4, 2016
C++: New keyword exceptions
When new is used, a bad_alloc can be thrown. To return null pointer on error instead of the exception a second format can be used:
done_
Site *maanoo = new (std::nothrow) Site("maanoo.com");
done_
Wednesday, October 12, 2016
Windows: Copy only what's new or changed
Copy all files (/H /G) and directories (/E) that are either new or changed (/D /Y)
done_
xcopy C:\From C:\To /D /E /I /H /Y /G
done_
Monday, September 12, 2016
Java: Open link in browser
Open a link with the default browser:
done_
Desktop.getDesktop().browse(new URL("http://maanoo.com").toURI());
done_
Friday, November 20, 2015
Techniques: Random art with symmetry
So lets add many circles together:
Thats ok but what if we add some symmetry.
Lets add symmetry from one axis:
From two axis:
Those examples are random but the point is that have something not random, they have structure.
I like the more complex symmetry from the center point (not the math definition):
continue_
Thats ok but what if we add some symmetry.
Lets add symmetry from one axis:
From two axis:
Those examples are random but the point is that have something not random, they have structure.
I like the more complex symmetry from the center point (not the math definition):
continue_
Wednesday, November 18, 2015
Javascript: Canvas circles
So we always start:
and we have the basic:
and for all other shapes we use paths
I use a lot of circles so why not add:
We can do that by adding some functions to the prototype of the c with is the CanvasRenderingContext2D:
done_
var canvas = document.getElementById("canvas");
var c = canvas.getContext("2d");
and we have the basic:
c.fillRect c.fillText c.strokeRect c.strokeText
and for all other shapes we use paths
I use a lot of circles so why not add:
c.fillCircle c.strokeCircle
We can do that by adding some functions to the prototype of the c with is the CanvasRenderingContext2D:
CanvasRenderingContext2D.prototype.fillCircle = function(x, y, r) {
this.beginPath();
this.arc(x, y, r, 0, 2 * Math.PI);
this.fill();
};
CanvasRenderingContext2D.prototype.strokeCircle = function(x, y, r) {
this.beginPath();
this.arc(x, y, r, 0, 2 * Math.PI);
this.stroke();
};
done_
Monday, November 16, 2015
HTML: Canvas background
To have a canvas as a html page background we need:
HTML:
CSS:
JavaScript:
Demo 1
done_
HTML:
<body onload="load()"> <canvas id="canvas_back"></canvas> ... </body>
CSS:
#canvas_back {
position: fixed;
top: 0px;
left: 0px;
z-index: -1;
}
JavaScript:
var c, w, h;
function load() {
var canvas = document.getElementById("canvas_back");
c = canvas.getContext("2d");
window.addEventListener('resize', resize, false);
resize();
}
function resize() {
w = canvas.width = window.innerWidth;
h = canvas.height = window.innerHeight;
draw();
}
function draw() {
// use c, w and h to draw the canvas
...
requestAnimationFrame(draw);
}
Demo 1
done_
Friday, November 13, 2015
Android: Store values
We can save and load values, permanently, using Shared Preferences.
The shared preferences framework provides an easy way to store values, not only preference related but any kind of values. It's a file based so keep that in mind.
To get the SharedPreferences object we need:
To save a values we:
And to load a values we:
We can also get a single Preferences for each activity with:
Except MODE_PRIVATE we have MODE_WORLD_READABLE and MODE_WORLD_WRITEABLE which are deprecated, so don't use them.
done_
The shared preferences framework provides an easy way to store values, not only preference related but any kind of values. It's a file based so keep that in mind.
To get the SharedPreferences object we need:
private static final String NAME = "...";
public static SharedPreferences getPreferences(Activity a) {
return a.getSharedPreferences(NAME , Context.MODE_PRIVATE);
}
To save a values we:
public static void save(Activity a) {
SharedPreferences.Editor sp = getPreferences(a).edit();
sp.putString("name1", value1);
sp.putInt("name2", value2);
sp.commit();
}
And to load a values we:
public static void load(Activity a) {
SharedPreferences sp = getPreferences(a);
value1 = sp.getString("name1", default1);
value2 = sp.getInt("name2", default2);
}
We can also get a single Preferences for each activity with:
getPreferences(Context.MODE_PRIVATE)
Except MODE_PRIVATE we have MODE_WORLD_READABLE and MODE_WORLD_WRITEABLE which are deprecated, so don't use them.
done_
Wednesday, November 11, 2015
JavaScript: Local and Session storage
To store values to a browser we can use localStorage and sessionStorage just by:
and to get the values we just:
The localStorage keeps the values for ever (probably).
For each domain our browser has a pair of these objects and not for each page.
To store objects without functions we use JSON:
done_
localStorage["name"] = value;
and to get the values we just:
value = localStorage["name"];
The localStorage keeps the values for ever (probably).
The sessionStorage keeps the values until the page session ends.
For each domain our browser has a pair of these objects and not for each page.
To store objects without functions we use JSON:
localStorage["name"] = JSON.stringify(object);
object = JSON.parse(localStorage["name"]);
done_
Monday, November 9, 2015
JavaScript: jQuery selector
If we want to use JQuery ONLY for selecting elements like:
Why use a whole library, just:
or
Note: The only thing we gain from this is self-something.
continue_
$(".item")
Why use a whole library, just:
document.querySelectorAll(".item")
or
function q(query) {
return document.querySelectorAll(query);
}
q(".item")
Note: The only thing we gain from this is self-something.
continue_
Friday, November 6, 2015
PHP: Simple counter
A simple counter using a text file.
The php code:
To add one to the counter must be called with GET parameter add.
To get the counter value must be called with no parameters.
done_
The php code:
<?php
$path = "./counter.txt";
$count = intval(file_get_contents($path));
if(isset($_GET["add"])) {
$count++;
file_put_contents($path, $count);
}
echo $count;
?>
To add one to the counter must be called with GET parameter add.
To get the counter value must be called with no parameters.
done_
Wednesday, November 4, 2015
CSS: Transition all
In CSS if we define transitions, every time a value changes an animation-transition is created and executed.
So if we want to use transitions for all elements and for all values (which is wrong in many ways), we can just write:
done_
So if we want to use transitions for all elements and for all values (which is wrong in many ways), we can just write:
*{
transition: all 0.7s ease-in-out;
}
done_
Monday, November 2, 2015
Techniques: Base64
Base64: make anything to a "simple" text and reverse.
Where "simple" means that contains only the 'A'–'Z', 'a'–'z', '0'–'9', '+', '/' and '=' characters.
It's not in any way something to use for encryptions its just for converting raw data to text.
It's most used when the data contain small bytes (control characters) which are trick to send handle in some environments.
continue_
Where "simple" means that contains only the 'A'–'Z', 'a'–'z', '0'–'9', '+', '/' and '=' characters.
It's not in any way something to use for encryptions its just for converting raw data to text.
It's most used when the data contain small bytes (control characters) which are trick to send handle in some environments.
continue_
Friday, October 30, 2015
Techniques: Generating colors with HSL and HSV/HSB
Some definitions first:
HSL: Hue Saturation Lightness
HSV: Hue Saturation Value
HSB: Hue Saturation Brightness
HSL != HSV
HSV = HSB (so forget all about the name HSB)
The difference between the two is how the represent the black and white, but they have in common how the represent the actual color referred as hue.
So the colors HSL(h, s1, l) and HSV(h, s2, v) have the same base color in a amount defined by the s1 and s2 and some amount of black or white defined by the l and v.
The point is that these representations can be used in scenarios where classic RGB can't do the work.
done_
HSL: Hue Saturation Lightness
HSV: Hue Saturation Value
HSB: Hue Saturation Brightness
HSL != HSV
HSV = HSB (so forget all about the name HSB)
The difference between the two is how the represent the black and white, but they have in common how the represent the actual color referred as hue.
So the colors HSL(h, s1, l) and HSV(h, s2, v) have the same base color in a amount defined by the s1 and s2 and some amount of black or white defined by the l and v.
The point is that these representations can be used in scenarios where classic RGB can't do the work.
- Imagine a layout (for a site, an application or even a poster) where all elements are darker and brighter versions of the base color.
All these colors will be HS?(h, a, b) where h shared constant and a, b some values.
So if h is a variable of some kind, we can change the whole color scheme by adjusting a single value. - Imagine a need for a array of colors which have the same saturation - lightness - brightness and change smoothly (for animations, transitions or fractal coloring).
We can gererate these colors using the formula HS?(i*step, a, b) where i the index of the items in the array and step, a, b some values.
done_
Wednesday, October 28, 2015
Code: Normalize overflowing values
To normalize values like degrees where the main range is [0, 360) but all other values are accepted too the obvious is:
Which in case of a [min, max) range is:
But when the value is a negative number or even smaller than the min we get wrong result.
What we can do is "overflow" the value one more time:
Which in case of our generic [min, max) range is:
In an extended form:
done_
value = value % 360
Which in case of a [min, max) range is:
value = (value - min) % (max - min) + min
But when the value is a negative number or even smaller than the min we get wrong result.
What we can do is "overflow" the value one more time:
value = ((value % 360) + 360) % 360
Which in case of our generic [min, max) range is:
value = ((value - min) % (max - min) + max - min) % (max - min) + min
In an extended form:
len = max - min value = ((value - min) % len + len) % len + min
done_
Monday, October 26, 2015
Java: Set the Clipboard
The easiest way to make the Clipboard contain a string is:
done_
public void setClipboard(String text) {
Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
StringSelection selection = new StringSelection(text);
c.setContents(selection, selection);
}
done_
Subscribe to:
Posts (Atom)






