Yet Another Facebook Friendslist Comparer App

What is YAFFCA?
How does it work?
How do I use it?
Frequently Asked Questions
License & Copyright

YAFFCAFacebook Friendslist Backup and Comparer

What is YAFFCA?

YAFFCA stands for “Yet Another Facebook Friendslist Comparer App”. It is a Web browser-based application that allows you to backup your list of active Facebook friends and then compare the different backups in order to identify any missing or appeared friends. In other words, you can use this tool to track any unfriendings, or the account reactivation of previously inactive friends, as well as any new friends you have added.

How does it work?

YAFFCA consists of two parts: (1) a bookmarklet and (2) a webpage.

1) The YAFFCA bookmarklet allows you to backup your friendslist.

2) The YAFFCA webpage allows you to compare the different backups

How do I use it?

Step #1: Getting the YAFFCA bookmarklet

First of all, you will need to make your Web browser’s Bookmarks/Favorites (tool)bar appear. Click on the link that corresponds to the browser you want to use in order to see how this can be done:

Firefox: Bookmarks toolbar
Chrome: Bookmarks bar, or press Ctrl+Shift+B
Opera: Bookmarks bar
Safari (Mac): Favorites bar, press Cmd+Shift+B
IE: Favorites bar It doesn’t work in Explorer. Get a real browser.

(Note: certain other browsers also have a Bookmarks bar.)

Now that you can see this toolbar, it’s time to place the YAFFCA bookmarklet there. To do this, you will need to drag and drop the blue button (below) onto this bar.

YAFFCA v1

If you did this correctly, you should now be able to see a new button in your Bookmarks/Favorites (tool)bar with the title “YAFFCA v1”.

Step #2: Using the YAFFCA bookmarklet

Now that you have the bookmarklet, it’s time to use it. Since YAFFCA does not mess with Facebook’s source code (because it’s against FB’s Terms), you will need to do some manual work first.

1) You have to create a new, empty, list of friends (this only needs to happen once). You can follow Facebook’s instructions here in order to do this. Long story short:

1. Go to https://www.facebook.com/bookmarks/lists
2. Click on “+ Create List”
3. Give the list a name (any name you want)
4. Press the “Create” button (this will create the list and take you inside)

(You should not add any friends to this list because that could prevent you from seeing the “Add Friends to List” button).

If you already have an empty friendslist, you don’t have to create a new one; just click on it to enter it.

Add Friends to List

2) Click the “Add Friends to List” button. This will pop up a list of your friends.

2.5) NEW optional step: if you want to back up your list of Pages instead of your Friends, on the list pop-up that just appeared click on the top-left drop-down menu that says “Friends” and select “Pages” instead.

3) Scroll down to the end of this list. This is important, because it will allow for all your friends to appear. Make sure you reach the bottom of this list.

4) You can now click on the YAFFCA bookmarklet that you placed on your Bookmarks bar.

1. You will be asked a question: “Do you also want the photos?” Click OK if you want the profile photos of your friends to be included in the backup, or click Cancel if you just want the list of names.

2. If you clicked Cancel, you should now be looking at your list which is ready to be backed up. However, if you clicked OK, one more question appears: “Merge the photos with the list (slower)?” If the photos are merged/embedded in your list, you will only have to backup a single file. If the photos are not merged, you will have to backup one file plus one folder full of your friends’ photos. Merging is a bit slower but it’s worth it, in my opinion. Click OK to Merge or Cancel if you prefer separate files. If you click OK, you can watch the progress percentage on the title of the browser’s tab.

3. You should now be looking at a clean and tidy list of your active friends. (Please note that your friends who have deactivated their account will not appear on this list). In order to backup this page, press CTRL+S (or click on File => Save As) and then save this file somewhere safe.

Repeat this process whenever necessary to keep regular backups of your active friendslist.

Step #3: Getting the YAFFCA webpage

In order to compare two YAFFCA backups to each other, you will need to download the YAFFCA webpage (click here to get the latest version).

After you download the zip file, you will need to extract the webpage out of it. Microsoft has a guide on how you can achieve this (= right-click on it and hit Extract all). You can also use other applications for this purpose (e.g. 7-Zip, WinRAR, etc.).

Step #4: Using the YAFFCA webpage

When you have two different YAFFCA backup lists that you want to compare, double-click on the YAFFCA webpage that you extracted previously and follow the steps presented in there. You will need to:

1. Select the old YAFFCA backup file
2. Select the new YAFFCA backup file
3. Click the button to see who is missing and who has appeared

Enjoy!

Frequently Asked Questions

Will YAFFCA send any of my Facebook account information to you?

No, everything runs and stays on your computer!

Why did you create YAFFCA?

For many years now, I have been using browser add-ons, scripts and even Facebook apps that others had built, in order to track my “unfriendings”. However, Facebook keeps breaking or removing them because they tend to inject code into Facebook’s source code (which goes against its Terms), so I wanted to create a script that didn’t mess with FB’s source. YAFFCA does not modify Facebook’s code. YAFFCA parses the output of your friendslist (what you see) and presents it in a tidy manner, allowing you to back it up and compare it with your previous YAFFCA backups. Also, since everything stays on your computer, you don’t have to worry about any privacy issues (as long as you keep your backup files in a safe place).

So, is YAFFCA a Facebook hack?

Not with the modern definition of the word “hack” (made popular by the media). The YAFFCA bookmarklet uses the information of your friendlist to produce a cleaner/tidy version of your list which you can keep as a backup on your computer. (You already have access to this information anyway; it’s just presented differently). The YAFFCA webpage just compares the different backups. That’s all!

Why doesn’t Facebook offer this feature already?

You would have to ask them.

If a person is missing from my list, did they unfriend me, disable their profile or delete their account?

If the YAFFCA webpage identifies that a friend is missing, you will need to investigate. Click on their link to go to their Facebook profile. If it’s there and you can see the “Add Friend” button, then they unfriended you (sorry, it happens, don’t take it personally, to each their own, better now than later, you’ll feel better tomorrow, etc. etc.). However, if you see the “Sorry, this page isn’t available” message, then you will need to go to your Friends list and search for them. If you find their name there, it means they just disabled their profile, so they could be back in the future. If not, then they deleted their account (or they blocked you!).

Wow, the YAFFCA webpage sure is ugly!

I originally made this for personal use, and I just wanted something that worked. Please feel free to download the source code and redesign it!

Where can I find the source code of YAFFCA?

You can find the full, readable, version of the source code at the YAFFCA project on GitHub (or here).

Oh, I don’t know how to read JavaScript!

No worries! You can use free Web tutorials (Codecademy, MDN, KhanAcademy) to learn how to read (and write) JavaScript. It takes time and effort (just like everything else in life), but everyone can do it!

Can I compare my YAFFCA backup with someone else’s?

Sure, if that’s what you want. Apart from being an unfriend finder, YAFFCA can also be used to explore potential future friends. If a friend sends you their YAFFCA backup file, you can compare it with yours to see which of their friends you don’t have and which of your friends they don’t have. Just bear in mind that, if you have merged the photos in the backups, it could take YAFFCA a few seconds to load all the different friends.

*NEW*: Can I use YAFFCA to backup my list of Facebook Pages?

Apparently so! As a side-effect (this wasn’t originally planned), YAFFCA can be used to backup the Pages you have liked too! In order to do this, when you open the empty friends list in Step #2, click on its top left drop-down menu and select “Pages” instead of “Friends”, and then follow the normal process as usual! In the end, you may want to rename your backup file to “Active Pages” instead of “Active Friends” (note to self: update script to do this automatically).
P.S.: This method can also be used to backup the list of people you are following, in a similar manner (just select Following instead of Pages).

I have another question that is not listed here!

You can contact me using the form on my homepage.

License & Copyright

GPLv3YAFFCA is distributed under the terms of the GNU General Public License (GPLv3). This Web application is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This Web application is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

YAFFCA – Copyright 2015 – Konstantinos Gkoutzis

Command Prompt in a Batch File

Let’s assume you are on a Windows computer, logged in with a User account, and that you want to execute Command Prompt (a.k.a. whatever is left of DOS).

At that point you realise that the Command Prompt shortcut has been hidden from the Accessories folder of the Start Menu.

You are almost certain that you saw some log-on batch file scripts run when you logged in, which means that CMD is not disabled – you just can’t see it.

First, you can try opening My Computer and looking for C:\Windows\System32\cmd.exe but, most probably, the Windows folder (or the entire C:\ drive) will be hidden as well.

Fear not, there is a way around this: you can create your own batch file and execute the hidden CMD inside.

Create a new plain text file using Notepad, or any other text editor you can get your hands on, and put only this command in it:

cmd

Now save this file somewhere (e.g. external hdd, memory stick) with the extension .bat (example: mycmd.bat).

As soon as you execute it, you are in the Command Prompt.

But, let’s say this didn’t work either because, even though the batch file ran, cmd was not accessible for some reason.

Don’t worry, you can still simulate cmd by creating your own scripted version of it.

Edit that text file and change the code to:

@echo OFF
cls
:MYCMD
set /p _doscmd="%cd%>" %=%
%_doscmd%
echo.
goto MYCMD

If you execute this, you will stay in the batch file, able to execute commands as if you were using cmd, until you exit.

Of course, make sure your actions do not abuse any rules/agreements/policies and always use this wisely.

K.

Greeklish Converter (ver 1.0)

/**************************************/
/*                                    */
/*     Greeklish Converter ver 1.0    */
/*        Implemented by Thunder      */
/*           thunder@isee.gr          */
/*                                    */
/* Usage: grklsh inputflnm outputflnm */
/*                                    */
/**************************************/

#include <stdio.h>
#include <string.h>
#define LOGO "\n\n[ Greeklish Converter ~ Thunder (C) 2002 ]\n"

const int FLNM_SIZE=12;

int greeklish(char input[], char output[])
{
 FILE *ifile; /* the file which will be created */
 FILE *ofile; /* the file to use as source */
 unsigned char cur_ch; /* represents each character of the input file */
 char new_ch[3]; /* the string which will replace the character */

 if ( (ifile=fopen(input,"r"))==NULL || (ofile=fopen(output,"w"))==NULL )
 { /* checks if the input can be read and if the output can be written */
 printf("\nError opening files! Exiting...");
 return (1);
 }
 else
 { /* then we proceed */
 while ( (fread(&cur_ch,sizeof(cur_ch),1,ifile))!=0 )
 { /* while it hasn't reached an end of file */
 if (cur_ch<=143 || cur_ch>=255)
 { /* english letters and other symbols */
 new_ch[0]=cur_ch;
 new_ch[1]='\0';
 }
 else
 {
 switch (cur_ch)
 { /* Greek to Greeklish correspondence */
 case 193:
 case 162: { strcpy(new_ch,"A");  break; }
 case 194: { strcpy(new_ch,"B");  break; }
 case 195: { strcpy(new_ch,"G");  break; }
 case 196: { strcpy(new_ch,"D");  break; }
 case 197:
 case 184: { strcpy(new_ch,"E");  break; }
 case 198: { strcpy(new_ch,"Z");  break; }
 case 199:
 case 185: { strcpy(new_ch,"H");  break; }
 case 200: { strcpy(new_ch,"Th"); break; }
 case 201:
 case 186: { strcpy(new_ch,"I");  break; }
 case 218: { strcpy(new_ch,"'I'");  break; }
 case 202: { strcpy(new_ch,"K");  break; }
 case 203: { strcpy(new_ch,"L");  break; }
 case 204: { strcpy(new_ch,"M");  break; }
 case 205: { strcpy(new_ch,"N");  break; }
 case 206: { strcpy(new_ch,"Ks"); break; }
 case 207:
 case 188: { strcpy(new_ch,"O");  break; }
 case 208: { strcpy(new_ch,"P");  break; }
 case 209: { strcpy(new_ch,"R");  break; }
 case 211: { strcpy(new_ch,"S");  break; }
 case 212: { strcpy(new_ch,"T");  break; }
 case 213:
 case 190: { strcpy(new_ch,"Y");  break; }
 case 219: { strcpy(new_ch,"'Y'");  break; }
 case 214: { strcpy(new_ch,"F");  break; }
 case 215: { strcpy(new_ch,"X");  break; }
 case 216: { strcpy(new_ch,"Ps");  break; }
 case 217:
 case 191: { strcpy(new_ch,"W");  break; }
 case 225:
 case 220: { strcpy(new_ch,"a");  break; }
 case 226: { strcpy(new_ch,"b");  break; }
 case 227: { strcpy(new_ch,"g");  break; }
 case 228: { strcpy(new_ch,"d");  break; }
 case 229:
 case 221: { strcpy(new_ch,"e");  break; }
 case 230: { strcpy(new_ch,"z");  break; }
 case 231:
 case 222: { strcpy(new_ch,"h");  break; }
 case 232: { strcpy(new_ch,"th"); break; }
 case 233:
 case 223: { strcpy(new_ch,"i");  break; }
 case 192:
 case 250: { strcpy(new_ch,"'i'");  break; }
 case 234: { strcpy(new_ch,"k");  break; }
 case 235: { strcpy(new_ch,"l");  break; }
 case 236: { strcpy(new_ch,"m");  break; }
 case 237: { strcpy(new_ch,"n");  break; }
 case 238: { strcpy(new_ch,"ks"); break; }
 case 239:
 case 252: { strcpy(new_ch,"o");  break; }
 case 240: { strcpy(new_ch,"p");  break; }
 case 241: { strcpy(new_ch,"r");  break; }
 case 242:
 case 243: { strcpy(new_ch,"s");  break; }
 case 244: { strcpy(new_ch,"t");  break; }
 case 245:
 case 253: { strcpy(new_ch,"y");  break; }
 case 224:
 case 251: { strcpy(new_ch,"'y'");  break; }
 case 246: { strcpy(new_ch,"f");  break; }
 case 247: { strcpy(new_ch,"x");  break; }
 case 248: { strcpy(new_ch,"ps");  break; }
 case 249:
 case 254: { strcpy(new_ch,"w");  break; }
 default : { new_ch[0]=cur_ch; new_ch[1]='\0'; break; }
 }
 }
 fwrite(new_ch,strlen(new_ch),1,ofile); /* writes the character */
 }
 }
 fwrite(LOGO,strlen(LOGO),1,ofile); /* writes the logo */
 fclose(ofile); /* closes the output */
 fclose(ifile); /* closes the input */
 printf(LOGO); /* prints the logo on the screen */
 return (0); /* returns all clear to main */
}

int main(int argc, char *argv[])
{
 char input[FLNM_SIZE+1];
 char output[FLNM_SIZE+1];

 if (argc==1)
 { /* if no parameters are given, it exits */
 printf("\n** An input file must be defined!");
 return (1);
 }
 else
 { /* if at least on parameter is given, we proceed */

 if (strlen(argv[1])>FLNM_SIZE)
 { /* makes sure the filenames are not over the allowed size */
 printf("\n** Filename too big. %d characters max.",FLNM_SIZE);
 return(1);
 }
 else
 {
 strcpy(input,argv[1]); /* stores the input file name */
 printf("\n** Input file name : %s",input);
 }

 if (argc==2)
 { /* if no output filename has been given, we store a default one */
 strcpy(output,"default.txt");
 printf("\n** Setting output file name to default : %s",output);
 }
 else
 {
 if (argc==3)
 {
 strncpy(output,argv[2],12); /* stores the output file name */
 printf("\n** Output file name : %s",output);
 }
 else
 { /* if more than two parameters are present, it exits */
 printf("\n** Too many parameters");
 return (1);
 }
 }
 }

 return (greeklish(input,output)); /* returns the int from greeklish */
}

Unit Converter (ver 1.0)

program uconv;
uses crt;
var
	ans: char; choice: integer;
	x: integer; y: real; k: integer; u1: integer; g: integer;
begin
	ans:= 'y';

	while(ans <> 'n') do
	begin
		clrscr;
		textcolor(lightgreen);
		textbackground(black);

writeln ('*****************************************************************');
writeln ('Welcome to Thunder''s Unit Converter! Have a nice time converting!');
writeln ('*****************************************************************');
		writeln; writeln; writeln; writeln;
		writeln ('Choose a number and hit Enter!');
		writeln;
		writeln ('1. Celsius to Fahrenheit...');
		writeln ('2. Celsius to Kelvin...');
		writeln ('3. Fahrenheit to Celsius...');
		writeln ('4. Fahrenheit to Kelvin...');
		writeln ('5. Kelvin to Celsius...');
		writeln ('6. Kelvin to Fahrenheit...');
		writeln ('0. Exit this program...');
		writeln;
		readln (choice);

		if choice=1 then
		begin
		 clrscr;
		 writeln ('************************************************');
		 writeln ('Welcome to the ''Celsius to Fahrenheit'' converter!');
		 writeln ('************************************************');
		 writeln; writeln; writeln;
		 writeln ('Input your Celsius Degrees...');
		 writeln;
		 readln (x);
		 y := ( 9 / 5 ) * x + 32;
		 writeln; writeln; writeln;
		 writeln (x,' Celsius is equal to ', y:16:2,' Fahrenheit');
		end;

		if choice=2 then
		begin
		 clrscr;
		 writeln ('*********************************************');
		 writeln ('Welcome to the ''Celsius to Kelvin'' converter!');
		 writeln ('*********************************************');
		 writeln; writeln; writeln;
		 writeln ('Input your Celsius degrees...');
		 writeln;
		 readln (x);
		 k := x + 273;
		 writeln; writeln; writeln;
		 writeln (x,' Celsius is equal to ', k,' Kelvin');
		end;

		if choice=3 then
		begin
		 clrscr;
		 writeln ('********************************************');
		 writeln ('Welcome to ''Fahrenheit to Celsius'' converter!');
		 writeln ('********************************************');
		 writeln; writeln; writeln;
		 writeln ('Input your Fahrenheit degrees...');
		 writeln;
		 readln (x);
		 y:=((5*x) - (160)) div 9;
		 writeln; writeln; writeln;
		 writeln (x,' Fahrenheit is equal to ', y:16:2,' Celsius');
		end;

		if choice=4 then
		begin
		 clrscr;
		 writeln ('*******************************************');
		 writeln ('Welcome to ''Fahrenheit to Kelvin'' converter!');
		 writeln ('*******************************************');
		 writeln; writeln; writeln;
		 writeln ('Input your Fahrenheit degrees...');
		 writeln;
		 readln (x);
		 y:=(((5*x) - (160)) div 9) + 273;
		 writeln; writeln; writeln;
		 writeln (x,' Fahrenheit is equal to ',y:16:2,' Kelvin');
		end;

		if choice=5 then
		begin
		 clrscr;
		 writeln ('*********************************************');
		 writeln ('Welcome to the ''Kelvin to Celsius'' converter!');
		 writeln ('*********************************************');
		 writeln; writeln; writeln;
		 writeln ('Input your Kelvin degrees...');
		 writeln;
		 readln (u1);
		 g:= u1 - 273;
		 writeln; writeln; writeln;
		 writeln (u1,' Kelvin is equal to ', g,' Celsius');
		end;

		if choice=6 then
		begin
		 clrscr;
		 writeln ('***********************************************');
		 writeln ('Welcome to the ''Kelvin to Fahrenheit'' converter!');
		 writeln ('***********************************************');
		 writeln; writeln; writeln;
		 writeln ('Input your Kelvin degrees...');
		 writeln;
		 readln (u1);
		 g:= u1 - 273;
		 y:= ( 9 / 5 ) * g + 32;
		 writeln; writeln; writeln;
		 writeln (u1,' Kelvin is equal to ',y:16:2,' Fahrenheit');
		end;

		if choice=0 then
		begin
		 ans:= 'n';
		end
		else
		begin
		 writeln; writeln; writeln; writeln;
		 writeln ('Thank you for using ''Unit Converter'' by Thunder');
		 writeln ('Have a nice day!');
		 writeln;
		 write ('Do you want to keep on converting? (Y/N) ');
		 readln (ans);
		end;

	end;

	clrscr;
	writeln ('*******************************************************');
	writeln ('* *');
	writeln ('* Thank you for using ''Unit Converter'' by Thunder *');
	writeln ('* *');
	writeln ('* Have a nice day! *');
	writeln ('* *');
	writeln ('*******************************************************');
end.