TX-CP Modern Beige Purple Hangul

This was my first choice of keycap set to use with my TX-CP... I feel it compliments the colors of the case. Tell me what you think in the comments.

TX-CP Modern Beige Purple Hangu

Sound Test: TX-CP Vintage Brown 64g springs Modern Beige PBT

I used my Oco Modern Beige Purple Hangul as my first keyset of choice for my TX-CP. I sound I believe is still different from how it sounds now since the springs and switches have since broken in. But just to give you guys an idea on how it sounds like on newly built Vintage cherry mx brown with 64g korean springs.

The keyboard is still kinda quite so you may have to turn up the volume for this one

TX-CP My first Korean Custom Keyboard

I've had this keyboard kit for quite sometime now but did not know what switches to used on them hence I never really built it and kept it until I figure out which switches do I really like. That I think is one of the reasons why I bought different kind of keyboards to try and get the feel of which switch did I actually like. I tried several type of switches which included an 80g R3 Zealios. In the process I found out that I really like Cherry MX Browns even when it was compared to Gateron Browns. For me Gateron Browns were really too soft and too smooth. I wanted the scratchiness of the MX Brown switches but I had problem with the both of them, both of them feel too soft for me. I tried 80g springs and they were fucking too hard to even be able to use.

I did like my old Cherry MX Blacks and Greens but I had problems with them. The Greens where really hard to press and I do not like clicky switches. The blacks were perfectly fine for me but it didn't have a subtle bump. You see most people complain about the Cherry MX Brown because they cannot really feel the bump, but you see not all people like the cherry mx clear or zealios bump. I think everyone has their taste for food and same goes for fingers and keyboards. For me I didn't want linear but I didn't want a very large bump hence I always liked browns and their subtle bump which I feel is just enough for me. That is when I had the idea to create basically a Cherry MX Black switch with a bump. I was able to acquire some vintage browns from Korea and some 64g Springs. After building the switches they were the perfect switches for me. Spring resistance is just enough and the spring enhanced the brown switch bump to a certain degree.

I finally had the switches I liked to put on my TX-CP. Finally I was able to build the keyboard I always wanted with the springs I was looking for. For me this layout is just about right for home and office use. I like using the numpad for work and if I am doing some calculator stuff. I always wanted a dedicated F-Row for work as well. The size is just about right a tad bigger than a TKL but smaller than a full size keyboard. The lubed vintage browns with 64g springs seems to be the switch resistance that I have been looking for.

This keyboard has just made my KBD75 look like paper in terms of overall weight. I mean the bottom of the case is even heavier than my KBD75

Hope you like my build and here are the specs

  • TX-CP
  • Leeku L3 Compact v1.3 PCB with RGB underglow
  • Titanium Grey Top
  • Silver Bottom
  • Stainless Steel bottom weight
  • Stainless steel plate
  • Vintage Cherry MX Browns lubed with gap films
  • Cherry MX Clear for the function key
  • Cherry MX Silver with 64g springs for the space bar
  • 64g Springs from Korea
  • Original Cherry screw-in pcb mounted stabilizer clipped and lubed
  • Modern Beige Purple Hangul (I plan to use my SA Godspeed set with this until I burn in the switches for a few weeks)
  • Skull artisan from /u/vanexe from reddit
  • White LED leds

TX-CP

Delete all members of a Facebook group and delete a facebook group

Facebook groups has been around for a long time. Facebook groups has been mostly used for selling things online and is a good alternative for sites like ebay and other selling/action sites basically because it is free and you mostly sell to your target market.

Some people like me admin/own some facebook groups and there are instances that we want to delete a group to create a new one or simply remove the group since it is not being used anymore. Unfortunately for facebook there is no automated way of doing it within their website.

To delete a facebook group, you have to first remove all the members of the group and then you will have to leave the group to complete remove that group. If you have like 50k+ members, removing them one by one is such a big task and will eat up a lot of your time.

Here is an automated way to remove the members of your group. You will need to either use google chrome or mozilla firefox and leave it open while the script is running.

  1. Open the facebook group and browse the members link
  2. Scroll to the bottom of the page and click on "see more"
  3. Now open up your browser the console for your browser. For google chrome the shortcut is "ctrl + shift + j" and for firefox it is "ctrl + shift + k"
  4. paste the code below in the console and let it run and do it's own thing
var deleteAllGroupMembers = (
    function () 
    {
        var deleteAllGroupMembers = {};
        // the facebook ids of the users that will not be removed.
        // IMPORTANT: add your own facebook id here so that the script will not remove yourself!
        var excludedFbIds = ['jessica.manoo.7']; // make sure each id is a string!
        var totalDeleted = 0;
        var usersToDeleteQueue = [];
        var scriptEnabled = false;
        var processing = false;
        deleteAllGroupMembers.start = 
        function() 
        {
            scriptEnabled = true;
            deleteAll();
        };
        deleteAllGroupMembers.stop = function() 
        {
            scriptEnabled = false;
        };
        function deleteAll() 
        {
            if (scriptEnabled) 
            {
                queueMembersToDelete();
                processQueue();
            }
        }
 
        function queueMembersToDelete() 
        {
            var adminActions = document.getElementsByClassName('adminActions');
            console.log(excludedFbIds);
            for(var i=0; i<adminActions.length; i++) 
            {
                var gearWheelIconDiv = adminActions[i];
                var hyperlinksInAdminDialog = gearWheelIconDiv.getElementsByTagName('button')[0];
                //var fbMemberId = gearWheelIconDiv.parentNode.parentNode.id.replace('member_','');
                //var fbMemberName = getTextFromElement(gearWheelIconDiv.parentNode.parentNode.getElementsByClassName('fcb')[0]);
                var fbMemberName = gearWheelIconDiv.parentNode.parentNode.parentNode.children[0].children[0].text;
                if (gearWheelIconDiv.parentNode.parentNode.parentNode.children[0].children[0].attributes[0] == null)
                    continue;
                var str = gearWheelIconDiv.parentNode.parentNode.parentNode.children[0].children[0].attributes[0].value;
 
                str = str.substring(str.indexOf('.com') + 5);
                fbMemberId = str.substring(0,str.indexOf('?'));
                if (excludedFbIds.indexOf(fbMemberId) != -1) 
                {
                    console.log("SKIPPING "+fbMemberName+' ('+fbMemberId+')');
                    continue;
                } 
                else 
                {
                    console.log('Queing: ' + fbMemberName+ ', (' + fbMemberId + ')');
                    usersToDeleteQueue.push({'memberId': fbMemberId, 'gearWheelIconDiv': gearWheelIconDiv});
                }
            }
        }
 
        function processQueue() 
        {
            if (!scriptEnabled) 
            {
                return;
            }
            if (usersToDeleteQueue.length > 0) 
            {
                removeNext();
                setTimeout(
                function()
                {
                    processQueue();
                },1000);
            } 
            else 
            {
                getMore();
            }
        }
        function removeNext() 
        {
            if (!scriptEnabled) 
            {
                return;
            }
            if (usersToDeleteQueue.length > 0) 
            {
                var nextElement = usersToDeleteQueue.pop();
                removeMember(nextElement.memberId, nextElement.gearWheelIconDiv);
            }
        }
        function removeMember(memberId, gearWheelIconDiv) {
        if (processing) 
        {
            return;
        }
        var gearWheelHref = gearWheelIconDiv.getElementsByTagName('button')[0];
        gearWheelHref.click();
        processing = true;
        setTimeout(
            function()
            {
                var popupRef = gearWheelHref.id;
                var popupDiv = getElementByAttribute('data-ownerid',popupRef);
                var popupLinks = popupDiv.getElementsByTagName('a');
                for(var j=0; j<popupLinks.length; j++) 
                {
                    if (popupLinks[j].getAttribute('href').indexOf('remove.php') !== -1) 
                    {
                        // this is the remove link
                        popupLinks[j].click();
                        setTimeout(function(){
                        var confirmButton = document.getElementsByClassName('layerConfirm uiOverlayButton selected')[0];
                        var errorDialog = getElementByAttribute('data-reactid','.4.0');
                        if (confirmButton != null) {
                        if (canClick(confirmButton)) {
                        confirmButton.click();
                        } else {
                        console.log('This should not happen memberid: '+memberId);
                        5/0;
                        console.log(gearWheelIconDiv);
                        }
                        }
                        if (errorDialog != null) {
                        console.log("Error while removing member "+memberId);
                        errorDialog.getElementsByClassName('selected layerCancel autofocus')[0].click();
                        }
                        else
                        {
                            console.log("Now Deleting "+ memberId + ', (' + totalDeleted + ')');
                            totalDeleted = totalDeleted + 1;
                        }
                        processing = false;
                        },1500);
                        continue;
                    }
                }
            },1000);
        }
        function canClick(el) 
        {
            return (typeof el != 'undefined') && (typeof el.click != 'undefined');
        }
        function getMore() 
        {
            processing = true;
            more = document.getElementsByClassName("pam uiBoxLightblue uiMorePagerPrimary");
            if (typeof more != 'undefined' && canClick(more[0])) 
            {
                more[0].click();
                setTimeout(
                    function()
                    {
                        deleteAll();
                        processing = false;
                    }, 4000);
            } 
            else 
            {
                deleteAllGroupMembers.stop();
            }
        }
        function getTextFromElement(element) 
        {
            var text = element.textContent;
            return text;
        }
        function getElementByAttribute(attr, value, root) 
        {
            root = root || document.body;
            if(root.hasAttribute(attr) && root.getAttribute(attr) == value) 
            {
                return root;
            }
            var children = root.children,
            element;
            for(var i = children.length; i--; ) 
            {
                element = getElementByAttribute(attr, value, children[i]);
                if(element) 
                {
                    return element;
                }
            }
            return null;
        }
 
        return deleteAllGroupMembers;
    })();
deleteAllGroupMembers.start();

Let me know in the comments section if this works out for you. I've used it just today and it seems to be working fine. Please take note that facebook updates their website from time to time and change the code, so the code above might stop working after sometime.

The International 2017

In case you do not know yet. Today is the first day of the main stage for Dota 2's largest yearly tournament. You can watch it live HERE

So hype a lot of Filipino players in year's tournament. Hopefully they can go better than last year. It is still a dream for a Philippine team to be a champion, hopefully this is the year but I have my doubts. I hope they prove me wrong.