• Create Account

# gretty

Member Since 27 Dec 2009
Offline Last Active Yesterday, 05:55 PM

### Given a set of Vertices: Determine Boundary Vertices and Connection Order

02 February 2014 - 03:36 AM

Hello

I am looking for suggestions on algorithms I can use to determine the boundary points/vertices of a list of vertices. I also need to determine which boundary point connects to which other boundary point.

I have my own solution but it involves alot of steps and is more procedurally based rather than mathematically based. Can you suggest any algorithms (both procedural and mathematic)?

My approach:

•    - Organise the vertices into a Dictionary <int, List<Triangle>> vertexTriangleMap. Where the keys are the indexes of the vertices and the values are lists of the triangles that involve that vertex
•    - Pick a random vertex(RV) then pick a random triangle involving that vertex. For eg; vertexTriangleMap[9][0]
•    - Of the 2 other vertices in this triangle: Determine which involves the least triangles (the point w the least triangles = OV)
•        - Search through OV's triangles looking for another triangle that involves the vertices OV AND RV:
•            - if there is more than 1 triangle that involves these 2 points then that means that OV is NOT a boundary point else OV is a boundary point AND I know it connects to RV. OV now becomes RV and I can now repeat the process and I will determine which boundary points connect to which. I'll know when to stop when I reach the beginning again (the first RV).

### Insert Image into SQLite3 Database: Unsure whats causing the error

24 November 2013 - 09:05 PM

Hello

Does anyone have experience inserting binary data into a SQlite3 database using the SQLite3 C API? Note I am using the SQLite3 C API functions imported into a C# application so I am writting C#. I am attempting to write a png to a SQLite3 database in C#. I have managed to correctly import the external DLL function sqlite3_bind_blob. But now I am getting an error when I write the image to my SQLite3 database. When I call the function sqlite3_bind_blob I get the error:

`#define SQLITE_MISUSE      21   /* Library used incorrectly */`

I am unsure how I am causing this error and what I can do to fix it. Can you tell me what I am doing wrong?

Heres my code:

```// Include dll function (unsure if the parameter types are correct)
[DllImport("sqlite3", EntryPoint = "sqlite3_bind_blob", CallingConvention = CallingConvention.Cdecl)]
private static extern int sqlite3_bind_blob (IntPtr stmHandle, int iIndex, byte[] iParam, int iBytes, IntPtr iOperation);

// Code inside my function: Insert image into database
string query = "INSERT OR REPLACE INTO myTable(lat, lon, image) VALUES(-33.555, 151.457, ?1);";

if (sqlite3_prepare_v2 (_connection, query, query.Length, out stmHandle, IntPtr.Zero) != SQLITE_OK) {
IntPtr errorMsg = sqlite3_errmsg (_connection);
throw new SqliteException (Marshal.PtrToStringAnsi (errorMsg));
}

IntPtr SQLITE_TRANSIENT = new IntPtr(-1); // Represents SQLITE_TRANSIENT
int res = sqlite3_bind_blob (stmHandle, 1, blob, blob.Length, SQLITE_TRANSIENT);
// res always equals 21```

From my debugging I know that the blob correctly contains valid png data because I can write it out to a file and open that file. I also know that the length of the blob is correct aswell.

### Remove Multi-Line String from File

30 April 2013 - 05:07 PM

Hello

I am attempting to remove a multiline string from a file. The multiline string comes from another file and is read into a Batch variable. I then read the target file and search for this multiline string, if it exists I want to delete it from the target file.

Is this kind of functionality possible using Batch Windows Scripting? I really hope it is.

My code below is unable to remove the multiline string from the target file. It can successfully read the input file. Can you help me edit my script to search for and remove a multiline string from a file?

```@echo off &setlocal enabledelayedexpansion

Set replace=
Set target=

Rem Read file and store all contents in string
for /f "delims=" %%i in (%infile%) do set "target=!target! %%i"
echo %target%

Rem Remove the target string from outfile
@echo off & setlocal enabledelayedexpansion
for /f "tokens=1,* delims=¶" %%A in ( 'type "%outfile%"') do SET "string=%%A"
SET "modified=!string:%target%=%replace%!"
(echo(%modified%)>> "%outfile%"

ECHO.
PAUSE
ENDLOCAL

```

Essentially I want my script to remove the following bold text from a file:

// abc

// def

// hij

Button "" {
Walk_Right ""
}
}

### UML Diagrams used to model a websites architecture

07 April 2013 - 09:00 PM

Hello

I am attempting to understand what UML models/diagrams can be used to communicate a websites architecture.

The model or models' purpose is to communicate the architecture and functionality of a website to technical people (other software developers and engineers).

Website Features:
- The website is a recipe search engine
- Server side code is Python. Client side uses HTML, CSS, JQuery and AJAX.
- The website will have a Web Crawler/Indexer
- Infinite Scrolling is utilised when viewing search results so I will need to model asynchronous requests (both GET and POST).

The diagrams I am tending towards are Component Diagram (to communicate the architecture) and Sequence Diagram (to communicate the functionality of a HTTP request).

What diagrams have you used in the past to communicate the architecture and functionality of a website to technical people?

### Edit/Delete Protected Registry Key Value

31 March 2013 - 05:37 AM

My question: Is it possible to edit a registry key's value when it was created using a custom security descriptor? Do I need to call RegSetKeyValueEx with a SECURITY_ATTRIBUTES structure? If not, then I would need to delete the key then recreate it.

I am attempting to edit(or delete then rewrite) a registry key value but its not working. Some important information is that I created the registry key with a custom Security Descriptor. The custom security descriptor only has the KEY_READ Registry Key Security and Access Rights set.

But I cant even delete the key because of its ACL security descriptor. This is a problem because when I uninstall I wont even be able to delete the registry key then either. The reason why I create the registry key with a custom security descriptor is so the user cant change it accidentally or on purpose. The key tells me if my application has run before.

Does anyone know how I can edit/delete a registry key of this type?

My code(that attempts to edit my key and shows how I created the key in the first place):

```    // Code to change key value
LONG lResult = RegOpenKeyEx(HKEY_CURRENT_USER, _T("Software/MyApplication"), 0, KEY_READ, &hKey);
LONG setValueRes = RegSetValueEx(hKey, _T("FirstRunSignafier"), 0, REG_DWORD, (LPBYTE) &firstRunSignafierValue,
(DWORD) sizeof(firstRunSignafierValue));
// Error Value of setValueRes is 5. lResult succeeds

// Code that creates the registry key
int  recordFirstApplicationRun()
{
tstring REG_FIRST_RUN_SIGNIFIER = _T("Software\\MyApplication");
HKEY hKey;
LONG lResult;
int      res                      = 1;
DWORD dwValue, dwType, dwSize = sizeof(dwValue);
DWORD firstRunSignafierValue  = 1;
DWORD keyAlreadyExists;    // Two potential values: REG_CREATED_NEW_KEY or REG_OPENED_EXISTING_KEY
PSID pEveryoneSID              = NULL;
PACL pACL                      = NULL;
PSECURITY_DESCRIPTOR pSD      = NULL;
SECURITY_ATTRIBUTES secAttr;

createSecurityAttributes(&secAttr, pEveryoneSID, pACL, pSD);
LONG createRes = RegCreateKeyEx(HKEY_CURRENT_USER, &REG_FIRST_RUN_SIGNIFIER[0], 0, NULL, REG_OPTION_NON_VOLATILE,
if (createRes != ERROR_SUCCESS) {
//_tprintf(_T("Failed to create key: Last Error: %x, Return Val: %x\n"), GetLastError(), createRes);
CPP_Utilities::outputLastError("Failed to create key");
res = -1;
goto Cleanup;
}

//CPP_Utilities::outputLastErrorEx( (keyAlreadyExists == REG_CREATED_NEW_KEY) ? _T("Created new registry key"):_T("Registry key already exists") );
_tprintf( (keyAlreadyExists == REG_CREATED_NEW_KEY) ? _T("Created new registry key\n"):_T("Registry key already exists\n") );

// To Write a DWORD to the registry
LONG setValueRes = RegSetValueEx(hKey, _T("FirstRunSignafier"), 0, REG_DWORD, (LPBYTE) &firstRunSignafierValue,
(DWORD) sizeof(firstRunSignafierValue));
if (setValueRes != ERROR_SUCCESS) {
_tprintf(_T("B: %X\n"), setValueRes);
CPP_Utilities::outputLastError("Failed to set registry value");
res = -2;
goto Cleanup;
}

Cleanup:
if (pEveryoneSID)
FreeSid(pEveryoneSID);
if (pACL)
LocalFree(pACL);
if (pSD)
LocalFree(pSD);
if (hKey)
RegCloseKey(hKey);

return res;
}

int createSecurityAttributes(SECURITY_ATTRIBUTES* secAttr, PSID pEveryoneSID, PACL pACL, PSECURITY_DESCRIPTOR pSD)
{
// Pre:    Memory release for parameters MUST be handled by caller

EXPLICIT_ACCESS ea;
DWORD dwRes;
/*PSID*/ pEveryoneSID                    = NULL;
/*PACL*/ pACL                            = NULL;
/*PSECURITY_DESCRIPTOR*/ pSD            = NULL;
SID_IDENTIFIER_AUTHORITY SIDAuthWorld    = SECURITY_WORLD_SID_AUTHORITY;

// Create a well-known SID for the Everyone group.
if(!AllocateAndInitializeSid(&SIDAuthWorld, 1, SECURITY_WORLD_RID, 0, 0, 0, 0, 0, 0, 0, &pEveryoneSID)) {
_tprintf(_T("AllocateAndInitializeSid Error %u\n"), GetLastError());
CPP_Utilities::outputLastError("AllocateAndInitializeSid Error");
return -1;
}

// Initialize an EXPLICIT_ACCESS structure for an ACE. The ACE will allow Everyone read access to the key.
ZeroMemory(&ea, sizeof(EXPLICIT_ACCESS));
ea.grfAccessMode        = SET_ACCESS;
ea.grfInheritance        = NO_INHERITANCE;
ea.Trustee.TrusteeForm    = TRUSTEE_IS_SID;
ea.Trustee.TrusteeType    = TRUSTEE_IS_WELL_KNOWN_GROUP;
ea.Trustee.ptstrName    = (LPTSTR) pEveryoneSID;

// Create a new ACL that contains the new ACEs.
dwRes = SetEntriesInAcl(1, &ea, NULL, &pACL);
if (ERROR_SUCCESS != dwRes) {
_tprintf(_T("SetEntriesInAcl Error %u\n"), GetLastError());
CPP_Utilities::outputLastError("SetEntriesInAcl Error");
return -2;
}

// Initialize a security descriptor.
pSD = (PSECURITY_DESCRIPTOR) LocalAlloc(LPTR, SECURITY_DESCRIPTOR_MIN_LENGTH);
if (NULL == pSD) {
_tprintf(_T("LocalAlloc Error %u\n"), GetLastError());
CPP_Utilities::outputLastError("LocalAlloc Error");
return -3;
}

if (!InitializeSecurityDescriptor(pSD, SECURITY_DESCRIPTOR_REVISION)) {
_tprintf(_T("InitializeSecurityDescriptor Error %u\n"), GetLastError());
CPP_Utilities::outputLastError("InitializeSecurityDescriptor Error");
return -4;
}

// Add the ACL to the security descriptor.
if (!SetSecurityDescriptorDacl(pSD, TRUE, pACL, FALSE)) {
_tprintf(_T("SetSecurityDescriptorDacl Error %u\n"), GetLastError());
CPP_Utilities::outputLastError("SetSecurityDescriptorDacl Error");
return -5;
}

// Initialize a security attributes structure.
secAttr->nLength                = sizeof (SECURITY_ATTRIBUTES);
secAttr->lpSecurityDescriptor    = pSD;
secAttr->bInheritHandle            = FALSE;

return 1;
}
```

PARTNERS