Desktop app for Facebook Workplace for Mac and Windows

workplace_share

Facebook officially launched it’s Slack competitor in late 2016 targeting the corporate teams. It’s fairly new and frankly it has hardly any new features besides the regular facebook that helps your productivity like Slack or Microsoft Teams does.

But we thought to give FB Workplace a try and one fine day, we ditched Slack. Major reason for the decision was the competitive price point, and we knew the features part would be fulfilled by FB soon.

A minor problem besides the feature problems was that there was no app for facebook Workplace, which felt less productive by going to a browser and switching to the tab everytime there’s a message, or a need to message someone. So I thought to create a wrapper app for Mac OS which you can quick open like any other app, it nicely sits on your Dock, get notifications just like any other application, and very quick to reach at.

workplace-dock

fbwok

Facebook Workplace app docked in your Mac OS Dock

 

Note that it’s not an official app from Facebook. It’s simply a wrapper that helps to use it like a Slack app until Facebook comes with an official version.

Steps to use: Just unzip the file, and run the Workplace.app file. If you want to quickly access the app everyday from your spotlight / search, you can put the app in your /Applications folder

 

Download link: GitHub

Download size: 38.8mb

Make sure you allow apps download from places outside App store. You can follow a guide here.

 

Hope it helps.

If you do need a windows version, do comment below. I’ll make one and update the link here.

Advertisements

Creating Twitter application in PHP

In this post we will look into accessing Twitter REST API in PHP. This can be useful if you need to post Tweets from your PHP application or anaylze, search Tweets. In the following examples we will use the twitter-api-php PHP wrapper for Twitter v1.1 API. Although there are a few wrappers around, this one I like for its simplicity.

Installation

If you use composer, here’s what you need to add to your composer.json file to have TwitterAPIExchange.php (Twitter PHP wrapper) automatically imported into your vendor’s folder:

{
    "require": {
        "j7mbo/twitter-api-php": "dev-master"
    }
}

You’ll then need to run ‘composer install’.

If you don’t use composer, just download the zip from git and include TwitterAPIExchange.php in your application path.

Registering your Twitter app

Before writing any code, you will first need to create a Twitter app and register it onhttps://apps.twitter.com/. You will be greeted with the following screen. (The following screenshot shows you an existing app. If this is your first app than the page will be blank).

twitter-app-1

Click on the ‘Create New App’ button and enter the required details in the fields provided. Leave the ‘Callback URL’ field blank for now. Once the app is created, click on the app name and note down the various access and security tokens, we will be needing these later. Change your Access Level to ‘Read and Write’. ‘Read Only’ access does not allow you to update, add or delete Tweets. If your purpose is to only read tweet data, it is safer to set the Access Level to ‘Read Only’.

Note that you will need to regenerate the access tokens if you change the Access Levels anytime and modify the same in your PHP code.

twitter-app-2

Accessing the Twitter API from PHP

Now that you have created and registered a Twitter app, we can now use PHP to acccess the API. First include the ‘TwitterAPIExchange.php’ class and set various security tokens collected earlier.

require_once('TwitterAPIExchange.php');
 
$settings = array(
    'oauth_access_token' => "YOUR_ACCESS_TOKEN",
    'oauth_access_token_secret' => "YOUR_ACCESS_TOKEN_SECRET",
    'consumer_key' => "YOUR_CONSUMER_KEY",
    'consumer_secret' => "YOUR_CONSUMER_SECRET"
);

For this example we will be using the ‘https://api.twitter.com/1.1/statuses/user_timeline.json‘ resource url. This returns a collection of the most recent Tweets posted by the user indicated by thescreen_name or user_id parameters. This particular method is one of the dozens of various methods available to access and modify Twitter data; others can be found here.

A complete GET request method is shown below. Here we are requesting the recent 3 tweets for the user ‘johndoe123’.

$url = "https://api.twitter.com/1.1/statuses/user_timeline.json";
$requestMethod = "GET";
$getfield = '?screen_name=johndoe123&count=3';

Once we specify the request methods and fields, we can call Twitter.

$twitter = new TwitterAPIExchange($settings);
 
$response = $twitter->setGetfield($getfield)
                    ->buildOauth($url, $requestMethod)
                    ->performRequest();

The complete code is shown below.

<?php
 
require_once('TwitterAPIExchange.php');
 
$settings = array(
    'oauth_access_token' => "YOUR_ACCESS_TOKEN",
    'oauth_access_token_secret' => "YOUR_ACCESS_TOKEN_SECRET",
    'consumer_key' => "YOUR_CONSUMER_KEY",
    'consumer_secret' => "YOUR_CONSUMER_SECRET"
);
 
$url = "https://api.twitter.com/1.1/statuses/user_timeline.json";
$requestMethod = "GET";
$getfield = '?screen_name=johndoe123&count=3';
 
$twitter = new TwitterAPIExchange($settings);
 
$response = $twitter->setGetfield($getfield)
                    ->buildOauth($url, $requestMethod)
                    ->performRequest();
 
print_r($response);

Executing the above code will return the recent 3 tweets for the given user in JSON format. You can specify the number of tweets to return using the ‘count parameter. The maximum that can be returned is 200.

$getfield = '?screen_name=johndoe123&count=3';

Note that all GET fields for this method are optional. Not specifying any GET parameters will return 20 recent tweets for the current user, i.e the user with the given access tokens. You can query without the GET parameters as shown below.

$url = "https://api.twitter.com/1.1/statuses/user_timeline.json";
$requestMethod = "GET";
 
$twitter = new TwitterAPIExchange($settings);
 
$response = $twitter->buildOauth($url, $requestMethod)
                    ->performRequest();
 
print_r($response);

Also, the response is returned in JSON, so will need to decode the JSON first before working further.

$tweets = json_decode($response);
print_r($tweets);

The tweet is stored in the ‘text’ field of the response, so we can enumerate all returned tweets with the following. Various other fields can be accessed in similiar manner.

$tweets = json_decode($response);
 
foreach($tweets as $tweet)
{
    echo $tweet->text . PHP_EOL;
}

Posting a new Tweet

Posting a new Tweet can be done with the following code, which uses a POST method instead of a GET. The initial code remains the same.

<?php
 
$url = "https://api.twitter.com/1.1/statuses/update.json";
 
$requestMethod = 'POST'; 
 
$postfields = array(
    'status' => 'Testing Twitter app'
);
 
$twitter = new TwitterAPIExchange($settings);
 
$response = $twitter->buildOauth($url, $requestMethod)
                   ->setPostfields($postfields)
                   ->performRequest();
 
print_r($response);

There are additoinal parameter you can use, the details for which are given here.

Searching for Tweets

Searching for Tweets based on a query is as easy as the above examples. Here in the following example we query for the ‘laravel’ keyword and ask o return 10 statuses.

$url = "https://api.twitter.com/1.1/search/tweets.json";
 
$requestMethod = "GET";
 
$getfield = '?q=laravel&count=10';
 
$twitter = new TwitterAPIExchange($settings);
$response = $twitter->setGetfield($getfield)
                    ->buildOauth($url, $requestMethod)
                    ->performRequest();
 
$tweets = json_decode($response);
 
foreach($tweets->statuses as $tweet)
{
    echo $tweet->text . PHP_EOL;
}

API rate limits

One important point to consider when creating your app is of rate limiting. Twitter limits the rate at which you query using their API. For example search will be rate limited at 180 queries per 15 minute window. More information can be foundhere.

Important Note

If the above examples do not work you will have to make a small change in ‘TwitterAPIExchange.php’. The curl processing part (around line 192) requires the line ‘CURLOPT_SSL_VERIFYPEER => false,’ to be added. So the curl part in the file should read the following.

        $options = array( 
            CURLOPT_HTTPHEADER => $header,
            CURLOPT_HEADER => false,
            CURLOPT_URL => $this->url,
            CURLOPT_SSL_VERIFYPEER => false,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_TIMEOUT => 10,
        );

3 Mistakes Web Programmers Need to Stop Making

Web programmer developing web application

Sometimes as programmers, we forget that 99.9% of the population doesn’t care how a piece of text, a button, an image or a video ends up onscreen. Most people just care that it’s fast, easy to use and gives them the content they want. Otherwise, they get upset — and rightfully so. Here are three common mistakes we programmers make, and what we can do to fix them.

Web programming languages - AJAX, RAILS, PHP, MYSQL, JAVA, ASP.NET



1. Forgetting About Conventions


Ever since they started using the Internet, users have been trained how to interact with a website. Therefore, they often get frustrated when websites don’t meet their expectations. Here are some examples.

  • They hover over an object they think is clickable, but become confused when they see an arrow instead of a hand pointer.
  • They click on blue, underlined text, but find it’s not a link.
  • They click on the logo in the top left, believing it will return them to the homepage, only to find it takes them nowhere.

Web design doesn’t always meet our expectations. However, developers and designers should always maintain certain rules to avoid user confusion. Here are three.

Clickable Elements Should Have the Pointer on Rollover
Everything clickable should switch to the hand pointer when a user hovers over it. You can accomplish this using simple CSS. The code would look like this

div:hover { cursor: pointer; }

Style Links Appropriately
Links should look different than regular text, and should be underlined within a page’s main content. If you really want to stick with convention, make them blue — research found users engage most with blue links.

Make Logos Clickable
The logo in the header of your website should be clickable, and should take the user to the homepage. This is pretty simple: Just wrap your logo in a tag.


2. Creating Slowly-Loading Websites


Users hate slow websites. Studies have shown that 40% of users will abandon a website that takes more than three seconds to load. Here’s how to avoid common speed mistakes by new programmers.

Resize Images Outside the Browser
New programmers will sometimes use a very large image, let’s say 600 pixels wide by 600 pixels tall, but will set the height and width so the image shrinks to the desired size. They use the following code.

There are two problems with this method: First, the full image still needs to load. Typically, bigger image files mean longer load times.

Second, shrinking an image using the height and width attributes can render a photo awkwardly, causing the browser to display a photo not nearly as clear as it would be were the image sized 200 x 200 pixels.

To fix these issues, resize and compress images in an editor like Photoshop or Gimp. Then code the image like we did above. Try to use a tool like Photoshop’s Save for Web & Devices to further shrink the file size.

Load JavaScript in the Footer
Many programmers unnecessarily load all the page’s JavaScript files in the head tag. This stalls the rest of the page load. In almost all cases, except for JavaScript critical to user interface navigation, it’s okay to load script in the footer. Then the rest of the page can load beforehand. Try this code.

Rest of the page:
<script type="text/javascript
" src="js/scripts.js%u201D></script>
</body>
</html>

Load CSS Externally
Sometimes new programmers load CSS on each individual page using inline styles or an internal stylesheet. For inline styles, code looks like this.

<p style="margin-top: 50px;">Hi Mom!</p>

And for an internal stylesheet, you’d most likely see this code in the head tag.

<style type="text/css">
p { margin-top: 50px; }
</style>

You should almost never use CSS in the page that holds your html. Store it externally using code like this.

<link rel="stylesheet" type="text/css" href="css/style.css" />

There are two advantages to loading CSS externally: First, the user’s computer will save the external stylesheet to be used on every page, instead of retrieving the same styles over and over. This greatly speeds up load time.
Second, using an external stylesheet is much easier to maintain. If you need to change the font size of your website’s paragraphs, you’re able change it in one place, without having to access each individual html file.
Learn more about good CSS practices at CSS Basics.


3. Not Accounting for Potential Backend Changes


Most programmers nowadays are using a content management system like WordPressJoomla or Drupal to build their websites. This is great because it gives website owners the ability to make changes and updates.

The problem is that a lot of developers only program for a website’s content at launch time. For example, at launch a developer may only create CSS styles for website headings 1, 2 and 3. What if two months after the website’s launch, the communications director decides to set some text to heading 6, since that’s an option in WordPress’s format? That decision would revert to the default styles of the browser since the developer never styled for it initially. Here is how to avoid this situation.

Include Styles for All the Common Tags
To make sure that the design of your website remains consistent with any backend formatting, programmers should include styles to handle the following html tags.

  • Body (<body>)
  • Heading 1, 2, 3, 4, 5, 6 (<h1>, <h2>, <h3>, <h4>, <h5>, <h6>)
  • Link (<a>)
  • Paragraph (<p>)
  • Address (<address>)
  • Preformatted (<pre>)
  • Strong (<strong>)
  • Unordered list (<ul>)
  • Ordered list (<ol>)
  • Quotes (<blockquote>)

It’s best to check the WYSIWYG that your website owners are using to make sure you have all the appropriate tags covered.

Basic styling isn’t the only opportunity for your website to break down. Also make sure to prepare for large image uploads and for copy/paste from Word. Although items like these can seem trivial, educating your website owners about how to add content can make all the difference.


You’re Smart, But It’s Hard To Remember Everything


The mistakes listed here have nothing to do with a developer’s intelligence. Like most jobs, things fall through the cracks, especially when you’re just getting started.

Do you agree with the items listed above? Are there any others we should have included?

Topic Courtesy – Mashable

"

Reviving art with Pencils

Artists who create beautiful artworks using pencils can’t surprise us nowadays. But Dalton Ghetti found a way how to create miniature masterpieces using pencils. He simply carved the alphabet on the tips of 26 pencils, making letters come alive.