Tuesday, May 30, 2017
Utility to remind you to keep a task diary
The "ask every hour" button creates a Windows Scheduled Task. Note that if you move the location of the exe file, you will need to click the "ask every hour" button again.
https://acoby.com/utils/WhatAmIDoing.exe
Thursday, September 29, 2016
Mailing list manager
These are its features:
- Free for noncommercial use.
- Your own custom domain.
- Or @mailgroup.io as domain if you prefer.
- Your choice of members-only mailing lists, or everyone-may-write.
- Detailed Postfix delivery reports for each mail for each recipient.
- Max 50 recipients per account (negotiable).
- Mail triggers. These are special email addresses that trigger HTTP POSTs with the email content to a defined URL when they receive email. Useful if you want some logic on your website to be triggered by email.
Wednesday, September 14, 2016
GLaDOS-like sound pack for Taranis
Sunday, May 01, 2016
Heap sort implementation in C#
class HeapSort
{
public void Sort(int[] a)
{
// Turn the array into a max heap
for (int i = (a.Length / 2) - 1; i >= 0; i--)
{
MaxHeapify(a, i, a.Length);
}
// Remove the largest element from the max heap and put it on the end,
// and then max heapify the heap which is now 1 smaller
for (int i = a.Length - 1; i >= 1; i--)
{
Swap(a, 0, i);
MaxHeapify(a, 0, i);
}
}
private void MaxHeapify(int[] a, int i, int n)
{
int idxLeft = (i + 1) * 2 - 1;
int idxRight = (i + 1) * 2 - 1 + 1;
int largest = i;
if (idxLeft < n && a[idxLeft] > a[largest])
{
largest = idxLeft;
}
if (idxRight < n && a[idxRight] > a[largest])
{
largest = idxRight;
}
if (largest != i)
{
Swap(a, i, largest);
MaxHeapify(a, largest, n);
}
}
private void Swap(int[] a, int i, int j)
{
int tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
}
Friday, March 25, 2016
Segment tree implementation in Java
class SegmentTreeNode {
public int aggregateValue;
public SegmentTreeNode left;
public SegmentTreeNode right;
public int origLowIndex;
public int origHighIndex;
}
class SegmentTreeTest {
public static SegmentTreeNode buildSegmentTree(int[] a, int low, int high) {
SegmentTreeNode n = new SegmentTreeNode();
n.origLowIndex = low;
n.origHighIndex = high;
if(low == high) {
n.aggregateValue = a[low];
return n;
}
int mid = (high - low)/2 + low;
n.left = buildSegmentTree(a, low, mid);
n.right = buildSegmentTree(a, mid+1, high);
// This segment tree is for summation. Could also be min, max, or any other associative func.
n.aggregateValue = n.left.aggregateValue + n.right.aggregateValue;
return n;
}
public static SegmentTreeNode getAggregateValue(SegmentTreeNode n, int low, int high) {
if(n.origLowIndex == low && n.origHighIndex == high) {
return n;
}
// The interval is fully contained within the left node
if(low >= n.left.origLowIndex && high <= n.left.origHighIndex) {
return getAggregateValue(n.left, low, high);
}
// The interval is fully contained within the right node
if(low >= n.right.origLowIndex && high <= n.right.origHighIndex) {
return getAggregateValue(n.right, low, high);
}
// Split into queries on the left subtree and the right subtree
SegmentTreeNode leftResult = getAggregateValue(n.left, low, n.left.origHighIndex);
SegmentTreeNode rightResult = getAggregateValue(n.right, n.right.origLowIndex, high);
SegmentTreeNode result = new SegmentTreeNode();
result.origLowIndex = low;
result.origHighIndex = high;
// This segment tree is for summation. Could also be min, max, or any other associative func.
result.aggregateValue = leftResult.aggregateValue + rightResult.aggregateValue;
return result;
}
public static void update(SegmentTreeNode n, int index, int val) {
if(n.origLowIndex == index && n.origHighIndex == index) {
n.aggregateValue = val;
return;
}
if(n.left.origLowIndex <= index && index <= n.left.origHighIndex) {
update(n.left, index, val);
} else {
update(n.right, index, val);
}
// This segment tree is for summation. Could also be min, max, or any other associative func.
n.aggregateValue = n.left.aggregateValue + n.right.aggregateValue;
}
public static void main(String[] args) {
// 0 1 2 3 4 5 6 7 8 9 10
int[] a = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };
SegmentTreeNode r = buildSegmentTree(a, 0, a.length-1);
System.out.println(r.aggregateValue);
System.out.println(getAggregateValue(r, 1, 3).aggregateValue);
System.out.println(getAggregateValue(r, 4, 7).aggregateValue);
update(r, 2, 10);
System.out.println(r.aggregateValue);
System.out.println(getAggregateValue(r, 4, 7).aggregateValue);
System.out.println(getAggregateValue(r, 1, 3).aggregateValue);
}
}
Friday, June 19, 2015
Windows scheduled task to auto logoff
function InstallAutoLogoff($computer)
{
invoke-command -computer $computer `
{
schtasks.exe /delete /tn AutoLogOff /f 2>&1 | Out-Null
set-content c:\windows\temp\AutoLogOffTask.xml `
'<?xml version="1.0" encoding="UTF-16"?>
<Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
<Triggers>
<TimeTrigger>
<Repetition>
<Interval>PT30M</Interval>
</Repetition>
<StartBoundary>2015-01-01T00:00:00</StartBoundary>
</TimeTrigger>
</Triggers>
<Actions Context="Author">
<Exec>
<Command>PowerShell.exe</Command>
<Arguments>-Command $r1 = quser.exe; $idPos = $r1[0].IndexOf(''ID ''); foreach($row in $r1) { $r2 = $row.Substring($idPos).Trim() -split '' +''; if($r2[2].Contains('':'')) { $t = $r2[2].Replace('':'', ''.''); if($t.Contains(''+'') -or ($t -as [double] -ge 2)) { rwinsta.exe $r2[0] } } }</Arguments>
</Exec>
</Actions>
</Task>'
schtasks.exe /create /tn AutoLogOff /ru system /xml c:\windows\temp\AutoLogOffTask.xml
del c:\windows\temp\AutoLogOffTask.xml
}
}
InstallAutoLogoff 'myserver1'
InstallAutoLogoff 'myserver2'
InstallAutoLogoff 'myserver3'
Monday, March 23, 2015
VoCore OpenWRT as NAT access point
I recently bought a VoCore. It came pre-flashed with OpenWRT Chaos Calmer (as of 2015-03-16). OpenWRT was configured as a wireless access point, bridging with the ethernet port. Here is what I did to get it to a configuration where it acts as a NAT'ing wireless access point, similar to most consumer routers/access points:
SSH'ed to its default IP of 192.168.61.1.
Edited /etc/config/network:
...
#config interface 'lan'
config 'interface' 'wan'
option macaddr 'b8:d8:12:60:00:01'
option proto 'dhcp'
config interface 'lan'
option force_link '1'
option macaddr 'b8:d8:12:60:00:02'
option proto 'static'
option ipaddr '192.168.61.1'
option netmask '255.255.255.0'
...
Edited /etc/config/wireless:
...
config wifi-iface
option device radio0
option network lan
option mode ap
option ssid gaffel8080
option encryption psk2
option key palle123
...
Edited /etc/config/dhcp:
... #config odhcpd 'odhcpd' # option maindhcp '0' # option leasefile '/tmp/hosts/odhcpd' # option leasetrigger '/usr/sbin/odhcpd-update' ...
To enable SSH from the ethernet port, I also edited /etc/config/firewall:
...
config rule
option src wan
option proto tcp
option dst_port 22
option target ACCEPT
This was all that was needed for the basic scenario of using VoCore as an accesspoint combined with a NAT'ing router.
I went a little further and installed some nice to have packages like openssh-sftp-server, nano, htop, ip, etc. However, in order to do this, I first had to fix /etc/opkg.conf:
... #src/gz cheese_base http://downloads.openwrt.org/snapshots/trunk/ramips/packages/base #src/gz cheese_luci http://downloads.openwrt.org/snapshots/trunk/ramips/packages/luci src/gz chaos_calmer_base http://downloads.openwrt.org/snapshots/trunk/ramips/generic/packages/base/ src/gz chaos_calmer_luci http://downloads.openwrt.org/snapshots/trunk/ramips/generic/packages/luci/ src/gz chaos_calmer_management http://downloads.openwrt.org/snapshots/trunk/ramips/generic/packages/management/ src/gz chaos_calmer_packages http://downloads.openwrt.org/snapshots/trunk/ramips/generic/packages/packages/ src/gz chaos_calmer_routing http://downloads.openwrt.org/snapshots/trunk/ramips/generic/packages/routing/ src/gz chaos_calmer_telephony http://downloads.openwrt.org/snapshots/trunk/ramips/generic/packages/telephony/
After that I could install the extra packages by running the following:
opkg update opkg install openssh-sftp-server opkg install nano opkg install htop opkg install ip
Also, I recommend disabling Luci, as it is buggy, and a security concern:
rm /www/cgi-bin/luci echo "A private box" > /www/index.html
