Tuesday, September 30, 2014
Shellshock
After upgrading all my VM's and computers which are *nix based they release some more updates. I guess I'll have to start over. It is great they are able to patch the problem so quickly after it became a known issue.
Saturday, April 12, 2014
Lenovo Fail
Since I stopped using Apple products a while back I've been a Lenovo consumer. Today they lost me. The wireless card supplied with the laptop doesn't work well with 64 bit OS's. After researching this issue I wanted to change the card. I opened up one of my old Thinkpads and removed the mini PCI wirelesscard and plugged it in. Guess what happened next? The machine refused to boot "Unauthorized Network card". Lenovo uses whitelists. I didn't unauthorize this. I will no longer recommend any lenovo products.
Thursday, March 6, 2014
Ability Scores in Bash
#!/bin/bash
for run in {1..6};do for run in {1..5};do shuf -i 1-6 -n 1; done | sort -r | head -n 3 | paste -s -d + | bc; done;
for run in {1..6};do for run in {1..5};do shuf -i 1-6 -n 1; done | sort -r | head -n 3 | paste -s -d + | bc; done;
Monday, February 17, 2014
Image Management
Depending on your camera most of the file names do not add value the real information is in the exif tags on the pictures.
Sometimes you just want to name the pictures by taken date:
Sometimes you just want to name the pictures by taken date:
exiv2 -r '%Y%m%d-%H%M%S' rename *.JPG
Tuesday, February 11, 2014
Counting calories with a few commands
Lets say you like to use the Linux shell for totaling up your calories. Maybe you've got a file something like this:
590<tab>soft beef tacos
290<tab>fish sandwich
380<tab>fries
You could manually calculate these or... you could use some nifty Linux programs. First lets get those numbers away from the rest of the file.
cat 20140211.calories | cut -f 1
gives you:
590
290
380
cut uses <tab> as the default delimiter and we want the first field.
Now you've got the numbers but they are not in a usable math expression so you can use "paste"
cat 20140211.calories | cut -f 1 | paste -s -d+
gives you:
590+290+380
now you just need to total it all up with "bc"
ExplainShell.com can give a complete break down:
cut -f 1 | paste -s -d+ | bc
590<tab>soft beef tacos
290<tab>fish sandwich
380<tab>fries
You could manually calculate these or... you could use some nifty Linux programs. First lets get those numbers away from the rest of the file.
cat 20140211.calories | cut -f 1
gives you:
590
290
380
cut uses <tab> as the default delimiter and we want the first field.
Now you've got the numbers but they are not in a usable math expression so you can use "paste"
cat 20140211.calories | cut -f 1 | paste -s -d+
gives you:
590+290+380
now you just need to total it all up with "bc"
ExplainShell.com can give a complete break down:
cut -f 1 | paste -s -d+ | bc
Saturday, January 25, 2014
Xmonad - Random Background at Interval
Make a file randombackgroundatinterval:
#!/bin/bash
while x=0;do find $1 | grep 'jpg\|png' | shuf | head -n 1 | xargs -i xloadimage -border black -onroot -fullscreen '{}'; sleep $2; done
run it with the top directory for images and how often you want them to change.
example:
./randombackgroundatinterval /home/<YOUR USER NAME>/Pictures 3
Would pick a random jpg or png from the /home/<YOUR USER NAME>/Pictures directory, and its subs and display a new one every three seconds.
#!/bin/bash
while x=0;do find $1 | grep 'jpg\|png' | shuf | head -n 1 | xargs -i xloadimage -border black -onroot -fullscreen '{}'; sleep $2; done
run it with the top directory for images and how often you want them to change.
example:
./randombackgroundatinterval /home/<YOUR USER NAME>/Pictures 3
Would pick a random jpg or png from the /home/<YOUR USER NAME>/Pictures directory, and its subs and display a new one every three seconds.
Tuesday, January 7, 2014
Music
Current script for starting Music
#!/bin/bash
echo "Spawning jackd -d alsa"
jackd -d alsa &
echo "Waiting For Jack to Wake Up...."
sleep 3
echo "Spawning a2jmidid -e"
a2jmidid -e &
sleep 3
echo "Spawning qjacktl"
qjackctl &
echo "Spawning qsynth"
qsynth &
echo "Finished"
Current script for Starting Midi listener
#!/usr/sbin/python2.7
from bottle import run, route, request
import alsaseq
from time import sleep
alsaseq.client('WebMIDI', 1,1, False)#http://127.0.0.1/midi?note=60&duration=100
alsaseq.connectfrom(0,129,0)
IP = "127.0.0.1"
VOICE = 127
PLAYBACK_RATE = .5
notes = []
def save_note(note, duration, channel):
notes.append({"note":note,"duration":duration,"channel":channel})
def play_note(note, duration, channel):
alsaseq.output( (6, 1, 0, 1, (5, 0), (0, 0), (0, 0), (channel,
int(note), 127, 0, int(duration))) )
def playback():
for note in notes:
sleep(PLAYBACK_RATE)
play_note(note["note"],note["duration"],note["channel"])
@route('/midiclear',method="GET")
def midiclear():
notes[:] = []
@route('/midiplayback',method="GET")
def midiplayback():
playback()
@route('/midi',method="GET")
def midi():
note = int(request.query['note'])
duration = int(request.query['duration'])
channel = int(request.query['channel'])
save_note(note, duration, channel)
play_note(note, duration, channel)
return {"data":{"note":note,"duration":duration,"status":alsaseq.status()}}
run(host=IP, port=8080)
Current html page:
<html>
<head>
<script src="js/jquery-1.9.1.js"></script>
<script src="js/jquery-ui-1.10.3.custom.js"></script>
<link href="css/sunny/jquery-ui-1.10.3.custom.css" rel="stylesheet">
<meta name='viewport' content='width=device-width, initial-scale=1.0, user-scalable=no'>
<script type="text/javascript" src="midi.js"></script>
<style>
div.normal,div.upper,div.lower,#playback,#clear,#channel,#channel_up,#channel_down {height:60px;width:80px;position:
fixed;
text-align: center;
vertical-align:middle;
display: table-cell;}
div.lower {background-color:blue}
div.upper {background-color:green}
div.bnote {background-color:black; color:white}
div.pinky.lower {top:140px}
div.pinky.normal {top:80px}
div.pinky.upper {top:20px}
div.ring.lower, div.middle.lower {top:120px}
div.ring.normal, div.middle.normal {top:60px}
div.ring.upper , div.middle.upper {top:0px}
div.pointer.lower {top:130px}
div.pointer.normal {top:70px}
div.pointer.upper {top:10px}
div.thumb.lower {top:420px}
div.thumb.normal {top:360px}
div.thumb.upper {top:300px}
div.b {left:900px}
div.as {left:800px}
div.a {left:700px}
div.gs {left:600px}
div.g {left:620px}
div.fs {left:520px}
div.e {left:300px}
div.f {left:400px}
div.ds {left:300px}
div.d {left:200px}
div.cs {left:100px}
div.c {left:0px}
#playback{background-color:red;color:white;bottom:20px;left:20px;}
#clear{background-color:green;color:yellow;bottom:20px;right:20px;}
#channel{background-color:green;color:yellow;bottom:20px;right:400px;}
#channel_up{background-color:green;color:yellow;bottom:20px;right:300px;}
#channel_down{background-color:green;color:yellow;bottom:20px;right:500px;}
</style>
</head>
<body>
<div class='lower pinky c' id='c3' ></div>
<div class='normal pinky c' id='c4' ><p>C</p></div>
<div class='upper pinky c' id='c5' ></div>
<div class='lower ring cs' id='cs3' ></div>
<div class='normal ring cs bnote' id='cs4' ><p>C#</p></div>
<div class='upper ring cs' id='cs5' ></div>
<div class='lower middle d' id='d3' ></div>
<div class='normal middle d' id='d4' ><p>D</p></div>
<div class='upper middle d' id='d5' ></div>
<div class='lower pointer ds' id='ds3' ></div>
<div class='normal pointer ds bnote' id='ds4' ><p>D#</p></div>
<div class='upper pointer ds' id='ds5' ></div>
<div class='lower thumb e' id='e3' ></div>
<div class='normal thumb e' id='e4' ><p>E</p></div>
<div class='upper thumb e' id='e5' ></div>
<div class='lower thumb f' id='f3' ></div>
<div class='normal thumb f' id='f4' ><p>F</p></div>
<div class='upper thumb f' id='f5' ></div>
<div class='lower thumb fs' id='fs3' ></div>
<div class='normal thumb fs bnote' id='fs4' ><p>F#</p></div>
<div class='upper thumb fs' id='fs5' ></div>
<div class='lower thumb g' id='g3' ></div>
<div class='normal thumb g' id='g4' ><p>G</p></div>
<div class='upper thumb g' id='g5' ></div>
<div class='lower pointer gs' id='gs3' ></div>
<div class='normal pointer gs bnote' id='gs4' ><p>G#</p></div>
<div class='upper pointer gs' id='gs5' ></div>
<div class='lower middle a' id='a3' ></div>
<div class='normal middle a' id='a4' ><p>A</p></div>
<div class='upper middle a' id='a5' ></div>
<div class='lower ring as' id='as3' ></div>
<div class='normal ring as bnote' id='as4' ><p>A#</p></div>
<div class='upper ring as' id='as5' ></div>
<div class='lower pinky b' id='b3' ></div>
<div class='normal pinky b' id='b4' ><p>B</p></div>
<div class='upper pinky b' id='b5' ></div>
<div id='playback'><p>Playback</p></div>
<div id='clear'><p>Clear</p></div>
<div id='channel'><p id='channel_label'> 0 </p></div>
<div id='channel_up'><p>+</p></div>
<div id='channel_down'><p>-</p></div>
</body>
</html>
Current Javascript:
(function(){
var ip = "127.0.0.1:8080", channel = 0, channel_label;
function update_channel(){
channel_label.text(channel);
}
function up_channel(){
if(channel<120){
channel += 1;
update_channel();
}
}
function down_channel(){
if(channel>0){
channel -= 1;
update_channel();
}
}
function play_note(note){
$.get("http://"+ip+"/midi?note="+note+"&duration=100&channel="+channel, function(){});
}
$(document).ready(function(){
var offset = 12,i = 0, notes =[
"c",
"cs",
"d",
"ds",
"e",
"f",
"fs",
"g",
"gs",
"a",
"as",
"b"
];
channel_label = $("#channel_label");
$("#playback").click(function(){
$.get("http://"+ip+"/midiplayback",function(){});
});
$("#clear").click(function(){
$.get("http://"+ip+"/midiclear",function(){});
});
$("#channel_up").click(function(){ up_channel(); });
$("#channel_down").click(function(){ down_channel(); });
$(notes).each(function(ni){
var item = 60+i, note = notes[ni];
i+=1;
$("#"+note+"3").click(function(){
play_note(item-offset);
});
$("#"+note+"4").click(function(){
play_note(item);
});
$("#"+note+"5").click(function(){
play_note(item+offset);
});
});
});
}());
Screen shot:
Subscribe to:
Posts (Atom)