Note to self:
To save:
$ dpkg --get-selections > installedPackagesDate.txt
To recover:
# dpkg --set-selections < installedPackagesDate.txt && apt-get dselect-upgrade
Just another blog.
Note to self:
To save:
$ dpkg --get-selections > installedPackagesDate.txt
To recover:
# dpkg --set-selections < installedPackagesDate.txt && apt-get dselect-upgrade
Here's a list of known process names for Mac applications that I think is formatted in a helpful way:
http://triviaware.com/macprocess/all
A site that ranks some of the Roku channels and channels that are not in the Channel Store:
http://streamfree.tv/
Between the Roku, iTunes and Podcasts, I am overloaded on things I really want to watch, but don't have time.
MarsEdit works well for what I want to do with it.
http://www.red-sweater.com/marsedit/
My old favorite Blogo, appears to now be a dead product. It doesn't work with Mac OS X Lion, and there doesn't seem to be any activity to fix it.
I also give MarsEdit extra points for being available in the Mac App store.
My quick list of things to look for when deleting Mac applications manually. Most mac applications seem well behaved and only populate things in /Applications and maybe a couple things in ~/Library. Other applications seems to try to put things in all sort of directories and even their own uninstaller doesn't clean up after them. Today's problem child is Mark/Space's Missing Sync. I ran the uninstaller, but it left behind a lot of stuff. So this is just my list of places to go look to uninstall the remaining pieces of applications.
A good quick article on how to manually log into an IMAP Server using SSL is at:
http://www.jaharmi.com/2007/09/26/using_openssl_securely_connect_your_imap_account
The important part is:
As an example, here’s how you could log into an Exchange account, select the “Inbox” folder, and log out:
$ openssl s_client -connect server:port -crlf
? LOGIN username password
? SELECT Inbox
? LOGOUT
Here is a good quick description of the I2C bus:
http://www.robot-electronics.co.uk/acatalog/I2C_Tutorial.htm
Here is a minimal OpenGL program on RedHat EL 4.0. The Makefile:
all:
gcc -L/usr/X11R6/lib -L/usr/X11R6/lib/modules/extensions exampleGlx.c -o dssglx -lX11 -lglx -lGL
And the program:
#include <GL/glx.h>
#include <GL/gl.h>
#include <X11/Xdmcp.h>
#include <unistd.h>
static int attributeListSgl[] = { GLX_RGBA, GLX_RED_SIZE, 1, GLX_GREEN_SIZE, 1, GLX_BLUE_SIZE, 1, None };
static int attributeListDbl[] = { GLX_RGBA, GLX_DOUBLEBUFFER, GLX_RED_SIZE, 1, GLX_GREEN_SIZE, 1, GLX_BLUE_SIZE, 1, None };
static Bool WaitForNotify(Display *d, XEvent *e, char *arg)
{
return (e->type == MapNotify) && (e->xmap.window == (Window)arg);
}
int main(int argc, char **argv)
{
Display *dpy;
XVisualInfo *vi;
Colormap cmap;
XSetWindowAttributes swa;
Window win;
GLXContext cx;
XEvent event;
int swap_flag = FALSE;
dpy = XOpenDisplay(0);
vi = glXChooseVisual(dpy, DefaultScreen(dpy), attributeListSgl);
if (vi == NULL)
{
vi = glXChooseVisual(dpy, DefaultScreen(dpy), attributeListDbl);
swap_flag = TRUE;
}
cx = glXCreateContext(dpy, vi, 0, GL_TRUE);
cmap = XCreateColormap(dpy, RootWindow(dpy, vi->screen), vi->visual, AllocNone);
swa.colormap = cmap;
swa.border_pixel = 0;
swa.event_mask = StructureNotifyMask;
win = XCreateWindow(dpy, RootWindow(dpy, vi->screen), 0, 0, 100, 100,
0, vi->depth, InputOutput, vi->visual,
CWBorderPixel|CWColormap|CWEventMask, &swa);
XMapWindow(dpy, win);
XIfEvent(dpy, &event, WaitForNotify, (char*)win);
glXMakeCurrent(dpy, win, cx);
glClearColor(1,1,0,1);
glClear(GL_COLOR_BUFFER_BIT);
glFlush();
if (swap_flag) glXSwapBuffers(dpy,win);
sleep(10);
}
</unistd.h>
From
http://smalltalk.gnu.org/blog/bonzinip/all-you-should-really-know-about-autoconf-and-automake
A very good description of a simple use of autoconf and automake:
The problem with autotools is that it is used for complicated things, and people cut-and-paste complicated things even when they ought to be simple. 99% of people just need a way to access .pc files and generate juicy Makefiles, the portability part is taken care by glib, sdl and so on.
The most basic autotools setup is 9 lines.
configure.ac:
AC_INIT([package], [version])
AM_INIT_AUTOMAKE([foreign subdir-objects])
AC_CONFIG_SRCDIR([configure.ac])
AC_CONFIG_HEADERS([config.h]) # not really needed
AC_PROG_CC # or AC_PROG_CXX
AC_CONFIG_FILES([Makefile])
AC_OUTPUT
Makefile.am:
bin_PROGRAMS = hello
hello_SOURCES = hello.c
And you're ready for:
$ autoreconf -fvi
$ ./configure
$ make
On top of this, for each package you need, you add:
PKG_CHECK_MODULES([cairo], [cairo])
PKG_CHECK_MODULES([fontconfig], [fontconfig])
AM_CFLAGS = $(cairo_CFLAGS) $(fontconfig_CFLAGS)
LIBS += $(cairo_LIBS) $(fontconfig_LIBS)
respectively in configure.ac (after AC_PROG_CC) and Makefile.am. Is that complicated?
I recently had a disk go bad in my iMac. The disk would often boot if the computer was cold but then would start having errors as it warmed up and ... corrupting files.
I have never had to test any of my Time Machine backups for a real purpose. I was concerned that I would find that not all the files I needed would be restored or I would find I only really had partial backups. I have had many bad experiences over the years with untested backups, including backups done by sys admins. So I doubted that Apple's magic backup would be complete.
So I stuck a blank hard disk in the machine and booted the 10.5 install CD. At this point you have two options, install a fresh copy of Mac OS X and restore your files and settings, or just restore everything from Time Machine. I chose to restore everything from Time Machine, started it and went to bed.
I was pleasantly surprised to find a complete restore. I had to resync my dot mac data and a couple little things. The worst one was the ~/Library/Caches directory was not created with permissions for me to write to it. But overall, I was very happy.
Here is a simple example of code to use an OpenGL Texture.
// Apple gcc program0.c -framework opengl -framework glut
// A simple OpenGL and glut program
#include <GLUT/glut.h> /* Header File For The GLut Library*/
#include <stdint.h>
//
// You need to generate the texture data that you are going to
// use. GIMP will convert a bitmap, jpg, etc. to a "C" structure
// that you can use almost directly.
//
// GIMP RGBA C-Source image dump (f35_schem_02_edit_4.c)
static const struct {
uint32_t width;
uint32_t height;
uint32_t bytes_per_pixel; /* 3:RGB, 4:RGBA */
uint8_t pixel_data[128 * 128 * 4 + 1];
} planform = {
128, 128, 4,
"\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0"
"\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0"
"\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0"
"\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377"
// ... much of the texture deleted
"\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0"
"\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377",
};
// The routine to draw the screen
void display() {
// A value to hold our texture handle
static uint32_t texture = 0;
static int32_t firstTimeDone = 0;
// Clear the display
glClear(GL_COLOR_BUFFER_BIT);
// Set the color to white
glColor3f(1.0, 1.0, 1.0);
// Setup the coordinates to what I am used to
glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0);
// Get a texture number if we dont have one
if (!firstTimeDone)
{
// Get a texture number
glGenTextures(1, &texture);
// Tell OpenGL that we want to use that texture
glBindTexture(GL_TEXTURE_2D, texture);
// You have to tell OpenGL how to take the raw bitmap data
// in the structure above to put it into a texture. We
// do this with a glTexImage2D() call. We will describe the
// structure above and how we want it stored internally in
// OpenGl.
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, planform.width, planform.height,
0, GL_RGBA, GL_UNSIGNED_BYTE, planform.pixel_data);
// OpenGl lets you describe how you want to scale the
// texture data when the destination is bigger or smaller
// than the original texture data. In this case, we want
// simple linear scaling.
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
// First Time is done
firstTimeDone = 1;
}
else
{
// Tell OpenGL that we want to use that texture
glBindTexture(GL_TEXTURE_2D, texture);
}
// We are going to put the texture on a 2D surface, much
// like we would apply a decal.
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
// Normally you leave GL_TEXTURE_2D turned off unless
// you are applying a decal to a surface. Since we are
// doing that, we turn it on here.
glEnable(GL_TEXTURE_2D);
// Draw the square
glBegin(GL_POLYGON);
// Here we want to associate a point in the texture with the
// vertex we are drawing on the screen. So these are paired up.
glTexCoord2f(0.0f, 1.0f); glVertex2f(-0.5, -0.5);
glTexCoord2f(0.0f, 0.0f); glVertex2f(-0.5, 0.5);
glTexCoord2f(1.0f, 0.0f); glVertex2f(0.5, 0.5);
glTexCoord2f(1.0f, 1.0f); glVertex2f(0.5, -0.5);
// End of the list of verticies
glEnd();
// Turn texture drawing back off, normally we leave if off.
glDisable(GL_TEXTURE_2D);
// Flush the data. In many drivers, this causes the
// actual draw to the Frame Buffer.
glFlush();
}
int main(int argc, char **argv) {
// A minimal GLUT setup to get GLUT up and going.
// If you use EGL or some other windowing system
// other than GLUT, you need to replace this.
glutInit(&argc, argv);
glutInitWindowSize(512,512);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutCreateWindow("The glut hello world program");
glutDisplayFunc(display);
glClearColor(0.0, 0.0, 0.0, 1.0);
glutMainLoop(); // Infinite event loop
return 0;
}
</stdint.h>
This is an example of how to parse a binary file in perl. This reads an mpeg-2 file and chops the first 8 Mbyte chunk out of the file, closing at the next clean sequence header boundary.
#! perl
use Getopt::Std;
use strict;
sub chopMpegFile
{
my ($fileName) = @_;
open FILE, "$fileName" or die "Could not open file: $!\n";
open OUT, ">out.mpg" or die "Could not open file: $!\n";
binmode(FILE);
binmode(OUT);
my $buffer = '';
my $count = 0;
my $done = 0;
while ((! $done) && ( sysread(FILE, $buffer, 4) ))
{
my $value = unpack 'N', $buffer;
if (($count++ > 2 * 1024 * 1024) && ($value == 0x000001b3))
{
print "Closing file.\n";
$done = 1;
}
else
{
syswrite(OUT, $buffer, 4);
}
if (($count % (1024*100)) == 0)
{
print "Count $count\n";
}
}
close(FILE);
close(OUT);
}
my @args = splice(@ARGV, 0);
foreach my $arg (@args)
{
print "$arg\n";
&chopMpegFile($arg);
}
To log binary serial data from an RS-232 stream using CKermit, these are the settings I use:
Then when you are ready:
Note to self.
To check where packages are installed:
$rpm -ql package
To see where RPM files will install or have been installed.
$rpm -qlp package.rpm
I like my Mac computers, but there are a few development tools I really miss from windows:
// Apple gcc program0.c -framework opengl -framework glut
// A simple OpenGL and glut program
#include <GLUT/glut.h> /* Header File For The GLut Library*/
void display() {
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0, 1.0, 1.0);
glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0);
glBegin(GL_POLYGON);
glVertex2f(-0.5, -0.5);
glVertex2f(-0.5, 0.5);
glVertex2f(0.5, 0.5);
glVertex2f(0.5, -0.5);
glEnd();
glFlush();
glFlush();
}
int main(int argc, char **argv) {
glutInit(&argc, argv);
glutInitWindowSize(512,512);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutCreateWindow("The glut hello world program");
glutDisplayFunc(display);
glClearColor(0.0, 0.0, 0.0, 1.0);
glutMainLoop(); // Infinite event loop
return 0;
}
As part of the Windows Installer CleanUp Utility, Microsoft has the MSIZap utility:
Description of the Windows Installer CleanUp Utility
The command "msizap g!" will clean up orphaned installer files that often add up to a large amount of space.