Android is on ATT.… and it rocks!

I’ve been an iPhone user since Novem­ber 2008, and tonight I bought my first Android device.  It’s the Motorola Back­flip.  Even though the phone is only run­ning 1.5 (sup­pos­edly to be upgraded to 2.1 in the next cou­ple months), it has a ton of fea­tures that I found myself desir­ing on the iPhone.

First and fore­most, it dis­plays noti­fi­ca­tion icons while locked to let me know if there is a new email from work or not.  Really Apple? Is that so hard?  But Android/MOTO­Blur doesn’t stop there; oh no, they actu­ally dis­play dif­fer­ent noti­fi­ca­tion icons for each email account.  Sweet­ness. Gtalk? Inte­grated and run­ning in the back­ground. AIM? Inte­grated and run­ning in the back­ground. Pho­tos for con­tacts? Face­book. Awesome.

I was even able to cre­ate a new ring­tone with­out hardly any effort. I con­nected via USB, cre­ated a folder called “music” and drop a cou­ple of mp3 files in there. Unmounted it, and bam I can play the music from the media wid­get on my home­screen.  I then down­loaded ring­droid from the Mar­ket­place and selected about 30s worth of a song, sav­ing it as a ring­tone.  I con­nected the USB again, and what do you know: /media/audio/ringtones has been cre­ated and has a new mp3 in it. I copied that up to my linux box, con­nected my fiancé’s phone, copied the folder struc­ture down to her device (also a Motorola Back­flip), and then assigned the ring­tone to my contact.

Done. Less than 5 min­utes and I’ve got­ten a cus­tom ring­tone from my per­sonal music col­lec­tion.  Fan­tas­tic. Well played Motorola and Google!

One down­side: Yahoo! search on the home screen.…. Solu­tion: delete it, and set browser home­page to google.com. Fixed. :)

Posted via email from rarmknecht

Started Reading: Denialism

http://www.amazon.com/Denialism-Irrational-Thinking-Scientific-Threatens/dp/1594202303/ref=sr_1_1?ie=UTF8&s=books&qid=1268102117&sr=8–1

Got through the rather lengthy intro­duc­tion and the first two chap­ters.  So far, I’m intrigued! It’s kept my atten­tion and pro­vided a ton of facts in a clear con­cise manner.

Posted via email from rarmknecht

Frustrations.…

So tonight I tried to import my Word­Press based blog, blog.rarmknecht.com, into pos­ter­ous and real­ized that the import func­tion is.… well, quite frankly, worthless.

All for­mat­ting is lost. Para­graphs, bold, ital­ics.… all of it gone.  I’m at a lost for words.

If that weren’t enough, the dif­fer­ence between ” and ’ when used to define a lan­guage in the code tag is the dif­fer­ence between func­tional and broken.

Per­haps I’ll work on an import script.…. :)

Posted via web from rarmknecht

Jayson Explains CMake

As men­tioned in the pre­vi­ous entry, my good buddy Jayson is going to con­tribute addi­tional programming/technical/geeky arti­cles on the blog. Below is his first such arti­cle. Enjoy!

Today’s arti­cle is going to be about CMake. I started using this at work recently. It took a bit of time for me to get it work­ing with my setup at work; fig­ur­ing out how it oper­ates. So I’m here to pro­vide hints so that maybe if you’re start­ing out using CMake, you can have a bet­ter clue as to how to use it.

This guide is going to be generic and assume a gcc devel­op­ment envi­ron­ment; be that MinGW inside Win­dows or gcc inside Linux.

First and fore­most, as their doc­u­men­ta­tion states, you need a CMakeLists.txt file in each direc­tory you’re going to do some com­pil­ing in.

For just a sim­ple basic sin­gle file appli­ca­tion, you would have this as your direc­tory and file structure:

$ ls
CMakeLists.txt  main.c

Now, the CMakeLists.txt file is pretty sim­ple for this:

$ cat CMakeLists.txt
cmake_minimum_required(VERSION 2.6)
project(mini)

add_executable(mini main.c)

And our main.c file is rather drafty as well:

#include <stdio.h>

int main() {
printf(“Hello, world!\n);
return (0);
}

Now, on a Linux sys­tem, this is what I typed at the com­mand line to gen­er­ate Unix Make files: cmake –G “Unix Makefiles”

The above com­mand will then parse through the CMakeLists.txt file and gen­er­ate every­thing needed to build the project. After it com­pletes, all that is needed is to type make at the com­mand line. Actu­ally, from here on out, if you were to add other source files to the project, all you’d need to do is type make. The only time you ever need to run the cmake com­mand directly is the first time you run it. Every other time, you can sim­ply type make.

Now, the above small lit­tle project isn’t exactly using any­thing use­ful. Most of the time, if you’re doing a project, you’re using other libraries. CMake includes search func­tions for a lot of libraries. The syn­tax for search­ing for each library is fairly sim­i­lar, so I’m only going to give some exam­ples for a couple[1].

First, we’ll high­light using the wxWid­gets library. We’ll start with the struc­ture in the CMakeLists.txt file as to how to search for wx.

$ cat CMakeLists.txt
cmake_minimum_required(VERSION 2.6)
project(first_wx)

find_package(wxWid­gets COMPONENTS base core aui REQUIRED)
include(${wxWidgets_USE_FILE})

set(FIRST_WX_SRC app.cpp)

add_executable(first_wx ${FIRST_WX_SRC})
target_link_libraries(first_wx ${wxWidgets_LIBRARIES})

Now, this is still pretty sim­ple, but I’ve added a few things that I’d like to elab­o­rate upon. First, find_package(). Shipped with CMake are, as men­tioned above, some func­tions to search for pop­u­lar libraries. To use these, just call find_package() with the library name, some COMPONENTS you’d like to use from the library, and whether those com­po­nents are REQUIRED. What this does is searches the sys­tem for the pack­age, and the sub-components. If it finds them, the com­po­nents listed are auto­mat­i­cally added to the link stage. How­ever, as the code states below the find_package() call, you still need to explic­ity add the include and link direc­to­ries. Each library may have dif­fer­ent syn­tax for these vari­ables, so don’t blindly assume they are all the same.[1][2]

Next I add a vari­able to store the source files in. I just use this as a con­ve­nience, so that just in case I use it in mul­ti­ple places, I only have to type the variable.

Our direc­tory struc­ture is flat, for now:

$ ls
CMakeLists.txt  app.cpp  app.h

Our app.h and app.cpp files are simple:

#ifn­def __app_file_h_included__
#define __app_file_h_included__

#include “wx/app.h“

class app : pub­lic wxApp
{
pub­lic:
bool OnInit();
int OnExit();
};

#endif
#include “app.h“

#include <wx/frame.h>
#include <wx/intl.h>

IMPLEMENT_APP(app)

bool app::OnInit()
{
wxFrame* frame = new wxFrame (0L, wxID_ANY, _(“Hello, World!”));
if (!frame) {
return (false);
}
frame-&gt;Show ();
return (true);
}

int app::OnExit()
{
return (0);
}

Now that we have that work­ing, we’ll move on to add boost to our pro­gram. We’ll still not have it be very elab­o­rate. We’ll take one of the asio demo’s, so that we can use actual libraries; in addi­tion to some header only stuff.[3]

The lay­out stays the same, but here’s the mod­i­fied CMakeLists.txt file:

$ cat CMakeLists.txt
cmake_minimum_required(VERSION 2.6)
project(wx_boost)

find_package(wxWid­gets COMPONENTS base core aui REQUIRED)
include(${wxWidgets_USE_FILE})

set(Boost_USE_MULTITHREADED ON)
find_package(Boost 1.39.0 COMPONENTS date_time thread sys­tem)
include(${Boost_INCLUDE_DIRS})

set(FIRST_WX_SRC app.cpp)

add_executable(wx_boost ${FIRST_WX_SRC})
target_link_libraries(wx_boost ${wxWidgets_LIBRARIES} ${Boost_LIBRARIES})

The app.h file was not mod­i­fied, but here’s the changed app.cpp:

#include “app.h“

#include <wx/frame.h>
#include <wx/intl.h>
#include <wx/msgdlg.h>

#include <boost/asio.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>

IMPLEMENT_APP(app)

sta­tic wxFrame* frame = 0;

void popup(const boost::sys­tem::error_cc lang=“c”&amp; /*e*/)
{
wxMes­sage­Box (_(“Pop up!”), _(“Box”), wxOK, frame);
}

bool app::OnInit()
{
frame = new wxFrame (0L, wxID_ANY, _(“Hello, World!”));
if (!frame) {
return (false);
}
boost::asio::io_service io;

frame-&gt;Show ();
boost::asio::deadline_timer t (io, boost::posix_time::sec­onds(5));
t.async_wait (popup);

io.run ();
return (true);
}

int app::OnExit()
{
return (0);
}

So, now that we’ve seen how to imple­ment a cou­ple libraries into an exe­cutable, I’ll go through a handy set­ting for the install() function.

install() is as it states[2], it will install things to the des­ig­nated loca­tions. When using cmake to build libraries, I found the fol­low­ing to be very handy:

install(DIRECTORY   DESTINATION ${}
FILES MATCHING PATTERN “*.h“
PATTERN “.svn” EXCLUDE
)

Now, the above will copy all the header files in the direc­tory list­ing, exclud­ing the .svn direc­tory. With­out the exclude, the .svn direc­tory would get copied to the instal­la­tion path. That will han­dle include pathing for your own cus­tom library, but the instal­la­tion of the library itsel would go like this:

add_library(  STATIC )
install(TARGETS     ARCHIVE DESTINATION lib)

This would cre­ate a sta­tic library [.a|.lib] for your project and then copy it to the lib direc­tory on the DESTINATION path. This path can be set up by set­ting the following:

set(MY_LIB_INSTALL_PATH ${CMAKE_INSTALL_PREFIX}/lib)

[1] The wiki page for Find­ing Libraries on your system

[2] The offi­cial doc­u­ment page for CMake detail­ing _every_ avail­able call

[3] The full source list­ing for the Boost only ASIO code

Extended Euclidean Algorithm

I’ve started a cryp­tog­ra­phy class at DePaul and dur­ing the first lec­ture we first reviewed the Extended Euclid­ean Algo­rithm.  It pro­vides a method, using only a table, pen­cil, and paper, to eas­ily find not just the gcd of two inte­gers, but the s and t val­ues as well. Aca­d­e­m­i­cally: Let a and b be two inte­gers, at least one of which is nonzero, and let d = gcd(a,b). There exists some val­ues s,t such that d = sa + tb.

When it was cov­ered in class, the table didn’t have the k col­umn as it does in Wikipedia so I didn’t quite grasp it the first time through.  When I’m unsure of some­thing I attempt to write imple­ment it in code. So below is my quick Python imple­men­ta­tion of the Extended Euclid­ean Algo­rithm for find­ing d, s, and t, given a and b in d = gcd(a,b) = sa + tb . Not quite sure what we’ll use it for, but I have no doubt that I will learn that soon enough!

# Uses the Extended Euclid­ean Algo­rithm (Table Method) to find the gcd, s, and t
def gcd(a,b,dis­play=False):
    # Setup the first two rows of the table
    s2 = 1; t2 = 0; d2 = a; k2 = 1;
    s1 = 0; t1 = 1; d1 = b; k1 = d2/d1;
   
    # Com­pute Rows until the GCD is found
    while True:
        # Cal­cu­late a Table Row
        s0 = s2 — k1*s1
        t0 = t2 — k1*t1
        d0 = d2 — k1*d1
        k0 = d1/d0
       
        # Shift all the Row Vari­ables
        d2 = d1;    d1 = d0;
        s2 = s1;    s1 = s0;
        t2 = t1;    t1 = t0;
        k2 = k1;    k1 = k0;
       
        # We’ve found the GCD
        if d2%d1 == 0:
            break
           
    # Print the Results
    if dis­play == True:
        print “gcd(a,b)=sa+tb: gcd(“+‘a‘+”,”+‘b‘+”)=(“+‘s1‘+”)(“+‘a‘+”)+(“+‘t1‘+”)(“+‘b‘+”) = “+‘d1‘
   
    # Return the results
    return d1, s1, t1

Auditing NTFS Permissions

Recently I’ve wanted to review the account per­mis­sions on my home server that I use for backup. It has some­times served as a sand­box of sorts; not best prac­tice, but real­ity for hardware/monetary lim­its. Rather than spend the time right-clicking and check­ing the per­mis­sions on each folder I thought it’d be nice to write a WMI script to gen­er­ate a report.

I knew this had to have been done before, and after some quick googlefu I can across this script by Amine Abdelka­der that basi­cally did every­thing I wanted.

I didn’t like the HTML out­put though, I want CSV so that it can be eas­ily sorted, fil­tered, manip­u­lated in Excel. I also wanted to con­trol the depth of the search into sub­fold­ers and the total num­ber of fold­ers it would report on.

The script, mod­i­fied for these changes, is listed below:

‘========================================================================================
’ Orig­i­nal Author:  Abdelka­der, Amine
’ Orig­i­nal Date: 10/03/2006
’ Orig­i­nal Ouput: HTML File

’ Mod­i­fied by: Randy Armknecht
’ Mod­i­fied Date: 2009-11-05
’ Mod­i­fied Out­put:  CSV File, with abil­ity to con­trol depth of sub­folder search (depth)
’           and abil­ity to con­trol total num­ber of fold­ers reported on (max_seen)
’          
’========================================================================================
Const For­Read­ing = 1, For­Writ­ing = 2, ForAp­pend­ing = 8

Const Ful­lAc­cess­Mask = 2032127, Mod­i­fy­Ac­cess­Mask = 1245631, WriteAc­cess­Mask = 118009
Const ROAc­cess­Mask = 1179817



str­Com­puter = “.“
sPar­ent­Folder = Input­Box(“Please Enter folder to gather infor­ma­tion on”, “Par­ent Folder”)
SParentFoldern=replace(sParentFolder,”\”,””)
SParentFoldern=replace(sParentFoldern,”:”,””)

max_seen = 1000
depth = 1
count = 0


Set fso = Cre­ateOb­ject(“Scripting.FileSystemObject”)
’File name Same As Folder Name with­out spe­cial Car­ac­teres
fullfilename=SParentFoldern&”.csv“
’WScript.echo full­file­name

Set fsOut = fso.OpenTextFile(fullfilename, ForAp­pend­ing, True)

On Error Resume Next

    fsOut.Writeline “Folder, User Name, Per­mis­sion“

fsOut.Close



Show­Sub­Fold­ers FSO.GetFolder(sParentFolder),fullfilename

Out­put­Folder­Info sPar­ent­Folder, full­file­name

Set fsOut = fso.OpenTextFile(fullfilename, ForAp­pend­ing, True)
fsOut.Writeline strTable­Foot
fsOut.Close
Msg­Box “Done “
WScript.Quit

Pub­lic Sub OutputFolderInfo(FolderName , sOut­file)
    Const Ful­lAc­cess­Mask = 2032127, Mod­i­fy­Ac­cess­Mask = 1245631, WriteAc­cess­Mask = 1180095
    Const ROAc­cess­Mask = 1179817
    Const For­Read­ing = 1, For­Writ­ing = 2, ForAp­pend­ing = 8
   
    str­Com­puter = “.“

    ‘Build the path to the folder because it requites 2 back­slashes
    fold­er­path = Replace(FolderName, “\”, “\\”)

    object­path = “winmgmts:Win32_LogicalFileSecuritySetting.path=’” & fold­er­path & “‘“

    ‘Get the secu­rity set for the object
    Set wmi­FileSec­Set­ting = GetO­b­ject(object­path)

    ‘ver­ify that the get was suc­cess­ful
    Ret­Val = wmiFileSecSetting.GetSecurityDescriptor(wmiSecurityDescriptor)
    If Err Then
        ‘Msg­Box (“Get­Se­cu­ri­ty­De­scrip­tor failed” & vbCrLf & Err.Number & vbCrLf & Err.Description)
        Err.Clear
    End If

    Set objWMIS­er­vice = GetO­b­ject(“win­mgmts:” & “{impersonationLevel=impersonate}!\\” & str­Com­puter & “\root\cimv2”)
    Set col­Fold­ers = objWMIService.ExecQuery(“SELECT * FROM Win32_Directory WHERE Name =’” & fold­er­path & “‘”)

    For Each obj­Folder In col­Fold­ers
        ’ Retrieve the DACL array of Win32_ACE objects.
        DACL = wmiSecurityDescriptor.DACL

        Set fso = Cre­ateOb­ject(“Scripting.FileSystemObject”)
        Set fsOut = fso.OpenTextFile(sOutfile, ForAp­pend­ing, True)
   

        For Each wmi­Ace In DACL
            ’ Get Win32_Trustee object from ACE
            Set Trustee = wmiAce.Trustee
           
            fsOut.Write objFolder.Name&”,”&Trustee.Domain&”\”&Trustee.Name&”,“

            FoundAc­cess­Mask = False
            Cus­tom­Ac­cess­Mask = Flase
           
            While Not FoundAc­cess­Mask And Not Cus­tom­Ac­cess­Mask
                If wmiAce.AccessMask = Ful­lAc­cess­Mask Then
                    AccessType = “Full Con­trol“
                    FoundAc­cess­Mask = True
                End If
                If wmiAce.AccessMask = Mod­i­fy­Ac­cess­Mask Then
                    AccessType = “Mod­ify“
                    FoundAc­cess­Mask = True
                End If
                If wmiAce.AccessMask = WriteAc­cess­Mask Then
                    AccessType = “Read/Write Con­trol“
                    FoundAc­cess­Mask = True
                End If
                If wmiAce.AccessMask = ROAc­cess­Mask Then
                    AccessType = “Read Only“
                    FoundAc­cess­Mask = True
                Else
                    Cus­tom­Ac­cess­Mask = True
                End If
            Wend
     
            If FoundAc­cess­Mask Then
                fsOut.Write AccessType&vbCrLf
            Else
                fsOut.Write “Cus­tom”&vbCrLf
            End If
        Next

        Set fsOut = Noth­ing
        Set fso = Noth­ing
    Next

    Set fsOut = Noth­ing
    Set fso = Noth­ing
end Sub

Sub Show­Sub­Fold­ers (Folder,fname)
    On Error Resume Next
        If count < depth then
            count = count + 1
            total_seen = 0
            For Each Sub­folder in Folder.SubFolders
            if total_seen < max_seen then
                total_seen = total_seen + 1
                Call OutputFolderInfo(Subfolder.Path,fname)
                ‘Wscript.Echo Subfolder.Path
                call Show­Sub­Fold­ers (Subfolder,fname)
            end if
            Next
        end if
End Sub