Foodmandu Hacked !! more than 150 k personal data were dumped

0


Over 150k personal data (including geopoint address, email, name etc) was dumped yesterday. Foodmandu, an IT based Food delivering company was hacked by anonymous hacker who goes by his twitter handle @mr_mugger. The anonymous hacker dumped 33% the user data in githubusercontent you can check it using this link. https://raw.githubusercontent.com/mrmugger/foodmandu/master/foodmandu-50k-database-promo-dump

Nepal is going through massive technology advancements these couple of years, yet there is still no appropriate security policies and data privacy laws to govern the IT based companies. These type of company who stores user data should be brought under certain userdata policies and should maintain their security audits.

Foodmandu made a statement about yesterday’s data breach. Foodmandu also stated that they have already solved the security loophole and pursued the help of Cybercrime division to take down the site.

What is Statically typed language and Dynamically typed language?

0

According to the delineation of the type of the variable either in compile time or in runtime, the programming language are differenciated into two groups statically typed language and dynamically typed language.

The variable type of Statically typed language cannot be changed. The type of the variable is associated with the variable rather than the value it refers. For example the language like java, c++, FORTRAN, pascal , Scala etc are statically typed language. In these type of programming language once a variable is defined with a type and if we tried to change it to another type there occurs a type error in compile- time.

For example : in java

String type =”String”; //variable type defined as string variable

Type=123; // compile-time error

On the other hand, varables of dynamically typed language are typed checked at run-time and the type of the variables is associated with the value of the variables therefore the variable type can be changed. For example the languages like Ruby, Objective C, Javascript, PHP, python etc. are dynamically typed language.

For example: python

integerdata = 10;

integerdata = “Hello World!”; // no type error occurred

Statically typed and dynamically typed language are again sub-divided into two sub groups weak and strongly typed language.

Apple’s new Macbook pro 16-inch – Full Tech Specification

Powerful Processor and cooling technology : macbook pro 2019

Apple released the 16 inch version of the mackbook pro in 15th Nov 2019 with the price range starting from $2399. Apple’s major upgrade in this years macbook is its keyboard. Apple gave its keyboard a name, Magic Keyboard. Apple macbooks were facing a major issues in its keyboard. The most used keyword that were registered to the the Apple’s complaint box were “Repeating, Stuck, Unresponsive”. To solve those issue, Apple this year upgraded its buggy keyboard to a Magic Keyboard. Yes, of course, the screen size is bigger too. Apple released a 16 inch version of its macbook pro this season, with 3072 by 1920 UHD native resolution.

The all new Magic Keyboard

The starter configuration of the 16-inch version is pretty powerful with a 2.6 Ghz 6 core Intel core i7 processor, 512 Gigs of SSD storage, 16 Gigs of RAM, 4 Gigs of DDR6 AMD Radeon Pro 5300M graphics and will be shipped with Catalina macOs.

Image result for 16 inch macbook pro
16 inch macbook pro

macbook pro 16- inch – FULL TECH SPEC

Price$ 2399 (Nrs. 260000 approx.)$2799 (Nrs. 300000 approx.)
Processor 2.6GHz 6‑core Intel Core i7, Turbo Boost up to 4.5GHz, with 12MB shared L3 cache

Configurable to 2.4GHz 8‑core Intel Core i9, Turbo Boost up to 5.0GHz, with 16MB shared L3 cache
2.3GHz 8‑core Intel Core i9, Turbo Boost up to 4.8GHz, with 16MB shared L3 cache

Configurable to 2.4GHz 8‑core Intel Core i9, Turbo Boost up to 5.0GHz, with 16MB shared L3 cache
Storage 512GB SSD
Configurable to 1TB, 2TB, 4TB, or 8TB SSD
1TB SSD
Configurable to 2TB, 4TB, or 8TB SSD
Memory 16GB of 2666MHz DDR4 onboard memory

Configurable to 32GB or 64GB of memory
16GB of 2666MHz DDR4 onboard memory

Configurable to 32GB or 64GB of memory
Graphics AMD Radeon Pro 5300M with 4GB of GDDR6 memory and automatic graphics switching
Intel UHD Graphics 630

Configurable to AMD Radeon Pro 5500M with 4GB of GDDR6 memory or AMD Radeon Pro 5500M with 8GB of GDDR6 memory
AMD Radeon Pro 5500M with 4GB of GDDR6 memory and automatic graphics switching
Intel UHD Graphics 630

Configurable to AMD Radeon Pro 5500M with 8GB of GDDR6 memory
Camera 720p FaceTime HD camera
Audio High‑fidelity six‑speaker system with force‑cancelling woofers
Wide stereo sound
Support for Dolby Atmos playback
Studio‑quality three-mic array with high signal-to-noise ratio and directional beamforming
3.5 mm headphone jack
Battery and Power Up to 11 hours wireless web
Up to 11 hours Apple TV app movie playback
Up to 30 days of standby time
Built‑in 100‑watt‑hour lithium‑polymer battery2
96W USB‑C Power Adapter
Video Support Simultaneously supports full native resolution on the built-in display at millions of colors and:
Up to two displays with 6016‑by‑3384 resolution at 60Hz at over a billion colors
Up to four displays with 4096‑by‑2304 resolution at 60Hz at over a billion colors
Thunderbolt 3 digital video output
Native DisplayPort output over USB‑C
VGA, HDMI, DVI, and Thunderbolt 2 output supported using adapters (sold separately)
Keyboard and Trackpad Full-size backlit Magic Keyboard with:
65 (U.S.) or 66 (ISO) keys including 4 arrow keys in an inverted‑T arrangement
Touch Bar
Touch ID sensor
Ambient light sensor
Force Touch trackpad for precise cursor control and pressure-sensing capabilities; enables Force clicks, accelerators, pressure-sensitive drawing, and Multi-Touch gestures
Charging and Expansion Four Thunderbolt 3 (USB-C) ports with support for:
Charging
DisplayPort
Thunderbolt (up to 40Gb/s)
USB 3.1 Gen 2 (up to 10Gb/s)
Size and Weight Height: 0.64 inch (1.62 cm)
Width: 14.09 inches (35.79 cm)
Depth: 9.68 inches (24.59 cm)
Weight: 4.3 pounds (2.0 kg)3

Create or Reset WordPress Administrator Account Using MySQL (PhpMyAdmin)

0

WordPress is one of the easiest blogging sites and its very easy to use and maintain, on top of that its an opensource free to use web application. It is easy to install, setup and got its own dashboard. Therefore, millions of websites are now powered by wordpress. Due to its high usage, hackers and malware keep attacking wordpress sites. Most of the attack will be due to unsecured web hosting, use of weak passwords, access to wp-admin, not updating wordpress and using nulled themes or plugins. The attackers may remove users or play with the database giving you no access to the dashboard.

In this blog, we’ll focus on creating a user and giving it a keymaster admin user role. This may be helpful if you have forgotten the password of the Keymaster / admin or you have lost the admin right due to the attackers. Note that you must have access to the admin right to the database of the wordpress site. The admin right should be provided by the web hosting company to the dashboard (Cpanel / Direct admin / custom hosting dashboard) from which you can update the MYSQL database of your wordpress website.

I’ll be using cpanel dashboard for this tutorial. so lets begin.

1. Go to your Webhosting panel [ Cpanel / Direct admin / custom hosting dashboard ]

Cpanel login Interface

I have been hosting my site in a Cpanel host therefore i’ll have a Webhost panel as https://yourblog/cpanel.
use the username and password providd by your hosting provider.

2. Navigate to phyMyadmin panel

navigate to phpmyadmin in cpanel dashboard

Navigate to the Databases section in the dashboard and click on phpMyAdmin

3. Choose your WP database and navigate to wp-user table

navigate and choose your database

Choose the right database of your wordpress site form the left panel.

4. Navigate to the user table

Expand the database of your wp website and expand the user table. [note: the default prefix of the tables would be “wp_” and the users table would appear as “wp_users” but if you have changed the prefix of the tables to custom prefix like “wppn_” it will appear like the one in the figure below]

select wp-users table

5. Go to the Insert field and Start inserting the data for the new user

insert the values in the wp-users tables
  1. ID – Value of this field must be kept empty
  2. user_login – Type the username
  3. user_pass – Add a password for the account. Select MD5 in the functions menu (Refer to the screenshot below).
  4. user_nicename – leave this field empty
  5. user_email – add the email address you want to use for this account.
  6. user_url – leave this field empty for now
  7. user_registered – select the date/time for when this user is registered.
  8. user_status – set this to 0.
  9. display_name – leave this field empty for now
  10. Click on the Go Button to submit (you should see a success message)
table calues of wp-user

5. Go back to the users table and check the ID of the newly created field

Here, in our context the ID of the user we just created is 2. Keep the user ID in mind. The user is created but no role have been assigned to the user.

5. Navigate to table usermeta and insert a Magic Spell

Naviate to usermeta table with the prefix you have used for example “wp_usermeta” or like in my case “wppn_usermeta”. From the usermeta table go to the insert tab and use the following values in the wp_usermeta table and click Go.

  • unmeta_id – Must be kept Blank
  • user_id – This is the ID of the user we just created in the previous step. ii.e. ID = 2
  • meta_key – type “wp_capabilities” in my case its “wppn_capabilities”
  • meta_value – copy the following in the meta_value or the magis spell “a:1:s:13:”administrator”;s:1:”1″;} “

a:1:{s:13:"administrator";s:1:"1";}

wp_capabilites as an admin

Now you can login to your dashboard as an administrator. Voila.!!!

Now you can access the dash board with the changes password with administrator rights

But Remember:

WITh Great power comes Great responsibility

Motorola Razr 2019 – Full Phone Specifications

Even after so much of criticism the foldable phones are still in the rise and are hitting the market. This year many foldable phone got released, giants like Samsung, Huawei have already launched their foldable phones namely Samsung Galaxy Fold and Huawei Mate X. Oppo and Motorola too will be joining this pool soon. Motorola will be resurrecting the Motorola Razr – the classic phone dated back in the mid 00’s. While all the brands working on the foldable projects try to copy each-other, Motorola have a new take on its new foldable phone.

The Razr will come with a 6.2″ Foldable P-OLED capacitive touchscreen in the inside and 2.7″ Second external G-OLED display on the folded screen. The phone will be a mid range in terms of specification. The Razr is powered by snapdragon 710 processor with 6 GB of RAM and 128 GB storage capacity. The phone will run on Android Pie and will have two cameras. The main camera is a 16 MP, f/1.7, 1.22um, Dual Pixel PDAF camera whereas the selfie camera will be a 5 MP camera.

motorola razr 2019 foldable phone specification
[Credit: Motorola] Motorola Razr 2019

FULL MOTOROLA RAZR 2019 ( FOLDABLE ) SPECIFICATION

Release DateDec 2019/ Jan 2020
OSAndroid Pie
ProcessorQualcomm SDM710 Snapdragon 710 (10 nm)
Octa-core (2×2.2 GHz 360 Gold & 6×1.7 GHz Kryo 360 Silver)
RAM6 GB
Storage128 GB
Foldable displayFoldable P-OLED capacitive touchscreen, 16M colors
6.2 inches, 86.9 cm2 (~70.2% screen-to-body ratio)
876 x 2142 pixels (~373 ppi density)
Secondary Display G-OLED display, 600 x 800 pixels, 2.7 inches
Main Camera16 MP, f/1.7, 1.22um, Dual Pixel PDAF
Dual-LED dual-tone flash, HDR, panorama
[email protected], [email protected], gyro-EIS
Selfie Camera 5 MP, f/2.0, 1.12um HDR
Battery Non-removable Li-Po 2510 mAh battery
PriceAround $ 1200 (Approx Rs 1,20,000)
Motorola Razr 2019 foldable phone
[credit: motorola] Motorola Razr 2019 foldable phone

Practicing TDD on Android with UI tests

Hello everyone, I hope you are doing well. This post is about practicing TDD (Test-Driven-Development) with UI (User Interface) tests. This post is not about Unit Testing, if you would like to learn that instead, do have a read of my previous blog post here. Before getting further I would like to tell a little about how this post came into existence. Although practicing TDD with UI tests is widely debated, I found it particularly true that some form of tests is better than no tests at all and Donn Felker who I consider one of the greatest in the field of Android Application Development has written this blog post where he discusses practicing TDD with your UI Layer.

This post is an extension on his post and I am going to briefly discuss how I found it better to have UI tests before writing my UI and validation logic. I assume that you have basic idea of creating UIs and writing basic Kotlin code in your Activities and stuff. Having said that, lets get into it

Lets say, you have a form, maybe a Login form, SignUp form or other form that has several input fields and you want to validate the input from the user before actually creating your models, saving them into a local database or sending them into a remote server.

Lets go ahead and create a LoginActivity:

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle

class Login1Activity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_login)
    }
}

Its, XML layout is as follows:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/colorAccent">
</androidx.constraintlayout.widget.ConstraintLayout>

Now what we would normally do is we started writing onClickListener for our btn_login or we would start writing validation logic for our input fields, but that is not very TDD.

Instead what I want you to do is write UI tests for your Login Screen. Now UI tests are tests that test the interaction with User. We dont have to put much thought here since how a User interacts with the UI of our app is really upto us. Lets now start writing UI tests. For writing UI tests you need to have following dependencies in your app/build.gradle file:

    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test:runner:1.2.0'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
    androidTestImplementation 'androidx.test.ext:junit:1.1.1'
    androidTestImplementation 'androidx.test:rules:1.2.0'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'

The first three of these dependencies maybe already there in your app/build.gradle file. Now to create a Test for your LoginActivity, you can press Ctrl+Shift+T while the cursor is right next to LoginActivity.
Or you can right click androidTest/<your_package_name> folder and create a new Kotlin class there. Name it LoginActivityTest.

class LoginActivityTest{
}

Now Lets start writing test for our LoginActivity. First off, lets define some valid and invalid data for our input fields. We can do that using companion object which is basically Kotlin static final data members which is initialized as soon as the Class is initialized. Put the following inside the test class:

companion object{

        const val INVALID_EMAIL = "test"
        const val VALID_EMAIL = "[email protected]"
        const val INVALID_PASSWORD = "test"
        const val VALID_PASSWORD = "[email protected]"
    }

    @Rule
    @JvmField
    var mActivityTestRule = ActivityTestRule(Login1Activity::class.java)

The @Rule annotation comes from JUnit which lets the compiler know that we need this rule to execute our tests. Since we are testing our Activity, the mActivityTestRuleis the test rule for our LoginActivity.

Now let us write our first test method which is going to be trivial but important nonetheless. Put the following inside your LoginActivityTestclass:

 /*
    Check if the views are displayed
     */
    @Test
    fun checkViewsDisplayed(){
        onView(withId(R.id.et_email)).check(matches(isDisplayed()))
        onView(withId(R.id.et_password)).check(matches(isDisplayed()))
        onView(withId(R.id.tv_forgot_password)).check(matches(isDisplayed()))
    }

As you see we have written some tests with Espresso which is fairly simple, we have ViewMatcher to match views with Id and ViewAssertions to check if they match with certain constraints, in our case, isDisplayed(). The full test class file at this point is:

import androidx.test.espresso.Espresso.onView
import androidx.test.espresso.assertion.ViewAssertions.matches
import androidx.test.espresso.matcher.ViewMatchers.isDisplayed
import androidx.test.espresso.matcher.ViewMatchers.withId
import androidx.test.rule.ActivityTestRule
import org.junit.Rule
import org.junit.Test

@LargeTest
@RunWith(AndroidJUnit4::class)
class Login1ActivityTest{
    companion object{

        const val INVALID_EMAIL = "test"
        const val VALID_EMAIL = "[email protected]"
        const val INVALID_PASSWORD = "test"
        const val VALID_PASSWORD = "[email protected]"
    }

    @Rule
    @JvmField
    var mActivityTestRule = ActivityTestRule(Login1Activity::class.java)

    @Test
    fun checkViewsDisplayed(){
        onView(withId(R.id.et_email)).check(matches(isDisplayed()))
        onView(withId(R.id.et_password)).check(matches(isDisplayed()))
        onView(withId(R.id.tv_forgot_password)).check(matches(isDisplayed()))
    }

}

Go ahead and run this test, by clicking on the green play button on gutter (left side of your editor). You will see that this test fails, as we do not have the views with those ids in our xml file. This is the first step of TDD. We wrote tests, which fail.
Now lets make them pass by writing our UI xml.

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/colorAccent">

    <LinearLayout
            android:id="@+id/linearLayout2"
            android:padding="18dp"
            android:background="#ffffff"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintTop_toBottomOf="parent"
            app:layout_constraintBottom_toTopOf="parent"
            android:orientation="vertical"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

        <EditText
                android:id="@+id/et_email"
                android:hint="[email protected]"
                android:inputType="textEmailAddress"
                android:drawablePadding="16dp"
                android:drawableLeft="@drawable/ic_email"
                android:background="@drawable/edit_text_round_gray_background"
                android:layout_width="match_parent"
                android:padding="12dp"
                android:layout_marginBottom="12dp"
                android:layout_height="match_parent"/>

        <EditText
                android:id="@+id/et_password"
                android:inputType="textPassword"
                android:hint="password"
                android:drawablePadding="16dp"
                android:drawableLeft="@drawable/ic_lock"
                android:background="@drawable/edit_text_round_gray_background"
                android:layout_width="match_parent"
                android:layout_marginBottom="12dp"
                android:padding="12dp"
                android:layout_height="match_parent"/>

        <TextView
                android:id="@+id/tv_forgot_password"
                android:textColor="@color/colorPrimaryDark"
                android:layout_marginBottom="12dp"
                android:textAppearance="@style/TextAppearance.AppCompat.Medium"
                android:text="Forget Password?"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"/>

        <Button
                android:id="@+id/btn_sign_in"
                android:layout_gravity="center_horizontal"
                android:textAllCaps="false"
                android:text="Sign In"
                android:layout_width="150dp"
                android:layout_height="wrap_content"/>

    </LinearLayout>

</androidx.constraintlayout.widget.ConstraintLayout>

Run the tests again and see them pass. The tests pass because we have views with ids which we are checking for. Now you may think this is not quite useful. Hang on, something interesting is coming your way.


As we see from our layout xml, we have two input fields: et_email and et_password. What we desire for this screen is that, whenever the Sign In Button btn_sign_in is clicked, we want the email and password typed by the user to be validated before sending data to rest webservice or saving them to a database. We will not be doing that in this post. Lets now write tests to see if clicking the sign in button initiates validation of the input email and password. Lets first write the test as TDD says Tests before Feature:

    @Test
    fun clickSignInButton_emptyEmailAndPassword_displayErrorOnEmail(){
        onView(withId(R.id.btn_sign_in)).perform(click())
        onView(withId(R.id.et_email)).check(matches(hasErrorText("Invlaid Email")))
    }

In this test method there is a new function peform which is a part of ViewActions from Espresso. You can view a full list of ViewActions, ViewMatchers and ViewAssertions in the image below:

Go ahead and run this test, it will fail. Now lets make the test pass. Go to your LoginActivity and write the following inside onCreate()

  btn_sign_in.setOnClickListener { 
            if (et_email.text.isNullOrEmpty()){
                et_email.error = "Invalid Email"
            }
        }

To use btn_sign_in directly from your xml layout you will have to add dependency for kotlin synthetic which you can do by adding the following line at the top of your app/build.gradle

apply plugin: 'kotlin-android-extensions'

Now this is your feature code. Go ahead and run your LoginActivityTest to see your test passing. Coding this way is quite good since you are thinking about what tests the app needs to pass before actually writing features. You can go ahead and cover tests for other cases where the user may type an invalid email address in the email field or the case where they may type valid email address and empty password and click sign in button. But you get the idea. I will write one more test method here and call it a day.

    @Test
    fun clickSignInButton_invalidEmailAndValidPassword_displayErrorOnEmail(){
        onView(withId(R.id.et_email)).perform(typeText(INVALID_EMAIL))
        onView(withId(R.id.et_password)).perform(typeText(VALID_PASSWORD))
        onView(withId(R.id.btn_sign_in)).perform(click())
        onView(withId(R.id.et_email)).check(matches(hasErrorText("Email Invalid")))
    }

To make this pass, we write the following in our LoginActivity within the setOnclickListener:

            if (et_email.text.isNullOrEmpty()){
                et_email.error = "Invalid Email"
            }

            if(!Patterns.EMAIL_ADDRESS.matcher(et_email.text).matches()){
                et_email.error = "Invalid Email"
            }
            
            if (et_password.text.isNullOrEmpty()){
                et_password.error = "Invalid Password"
            }

Run the test again and see it pass. I hope this was useful for you. if you have any questions on the topic feel free to comment of contact me. For additional reading, I want to recommend Official Android Guide on Espresso UI Testing.

All about Internet and How google search engine works.

0
I know you have searched for your name in google once in a while. You haven't? Try it.

Internet or the World Wide Web has become an integral part of our society. Internet is in reach of people who didn’t even have had access to telecommunication networks. According to global statistics there are 4.39 billion internet users today. Internet is being used for different purposes for studies, entertainment, business, maps etc. People access internet using browsers, mobile applications and different OS platforms. Back in the days when there were no search engines people used to remember domain names and IP addresses to access the contents.

Internet and Search Engine

Tim berners lee the inventor of the WWW, created a website which was kind of a library consisting of lists of web servers. Now, the search engines are so strong that it shows the search result relevant to the search keyword you provided, going through the peta bytes of information it have collected crawling through billions of websites. Google serves 68000 searches per second, which makes it the number one search engine today.

Search is a global phenomenon. From scientists to businessman everyone uses search engine to get the information they require. Search engine acts like a librarian who provides relevant data for your search keywords.

Looking at the trends these days, company does not need any physical office or stores. I see many ecommerce sites operate using just their facebook pages or websites. Due to technology hike and competitive market Businesses like ecommerce, travel sites, blogs, consultancy etc. needs online visibility more than physical office. Search engine have made it easier for the individual to search for every alternative. The internet and the technology shift in the world however affected the traditional terms of trade. Everything now is online, from booking your favorite place for dinner to paying for the dinner you just had.

How Google Works

When you type something to search for in google, like for example “iphone 11”. Google engine searches its index for all the webpages using these keywords and then they run certain algorithms for ranking those pages relevant to your search. There are many factors that effect the rank of the pages for example the use of keywords, use of keywords in the title, how many valuable outside links point to it and then the cumulative of all those factors are combined and the relevant result are sent back to you in a few milliseconds. keywords and links plays important role in page ranks.

According to Netcraft, there are 200 million active websites today. Search engines use a small script called crawlers to navigate through all the website index them comprehensively. The crawlers crawl the pages and get all the information like the keywords used, the script used, the url you are using. The website is then indexed in the google servers. Therefore anything you are searching in the google, you are searching in the google index not the entire web. Google tries to crawl though every pages and get it indexed using spiders. Spiders start by fetching a few web pages at first then it follows the links in those webpages and fetch the pages they point to, it goes on until the spiders have indexed a big chunk of web.

Traditionally, search engines were just based on the keywords and the content. Now page ranking algorithms have been more complex and the search engine results are based on hundreds of factors.

Alternative to Google Adsense

Everyone wants their content/blog to be monetized, even just to pay for the domain and hosting charges. Google adsense is the number 1. choice for monetizing one’s content but many will get rejected or banned due to google’s lengthy policy and terms and conditions. Many bloggers get irritated because of the hard time they get to get their account approved on adsense. This is why some bloggers and content creators need alternatives to sooth their way for monetizing their contents.

There are many advertising platform like adsense in the internet today. I have made a list of 10 best alternative to monetize your content.

1. Media.Net

Media.net is the second largest contextual advertising business worldwide next to adsense, which makes it first on the list of alternatives. Media.net provides comprehensive cross platform ad publishing network for different type of technologies like search, native, display, mobile, local, products and video.

2. Infolink.com 

Infolinks is a global advertising platform offering ad solutions for both publishers and advertisers. Online advertisers utilize the Infolinks Self-Serve Marketplace to customize their own campaign. Advertising with Infolinks means delivering brand messages to engaged users.

Online bloggers and website owners monetize their websites with Infolinks while keeping the Look & feel of their sites undisturbed. Infolinks publishers can select their winning Infolinks ad combination from our ad unit options: InFoldInTagInText,InFrame and InArticle. It takes less than a minute to integrate Infolinks on a publisher’s site.

3. Chitika.com

4. Adversal.com

5. Bidvertiser.com

6. RevenueHits.com

7. Ad-Maven.com

8. Propeller Ads

9. Viglink

10. Share a Sale

Setting up your own ODK (Open Data Kit) Server in Ubuntu 18.04 using Digital Ocean

Survey’s are important for every study, be it for your MBA thesis , Scientific study or GIS analysis and planning works. Back in the days, the enumerators used to carry thick book of questionnaire to collect information. The questionnaire’s were again digitized in MS excel or SPSS for analysis. Those days are long gone now, many consulting firm and students use mobile data collection tools. The mobile data collection makes it easier and flexible to collect, manage, manipulate and analyze data. Mobile data collection is cost effective , time saving and Eco-friendly way for collecting information.

ODK (Open Data Kit)

Open Data Kit or ODK is community based open source software kits used to collect, manage, manipulate and analyze data. ODK data collect kit has different kind of software’s that tries to replace traditional paper surveys. ODK supports wide range of data types for question and answer purpose.

The server i.e. ODK Aggregate is a role based online portal where all the data is stored and can be managed using a role based login system. ODK provides a Collect Mobile app which connects to the server to get the questionnaire and use the form to collect information and send it back to the server for data integrity. ODK briefcase is an ODK software which help user download the attached files like images and other data which are linked to the database using the unique key id.


ODK needs a server where the forms (questionnaires) and the collected data are stored and can be downloaded later. There are many public servers which uses ODK to help novice data scientist and students to collect data without coding. Using these servers the data could be accessed by anyone online. Therefore, private server setup is necessary for any privately conducted survey’s for data privacy.

ODK Aggregate Server Setup Using Digital Ocean :

  1. Create an Account in Digital Ocean. Get $50 coupon using this link
  2. Get a domain name for eg. “prizmadigital.com ” you can also get a free .com.np domain by applying for it here. Then create a subdomain for the purpose of accessing your site using the domain name. for example: “odk.prizmadigital.com”
  3. Go to Create Drop-down list and Click on Droplets

4. Choose Ubuntu 18.04.X (LTS x64)

5. Choose a Server Plan. For the tutorial purpose i’ll create a 2 GB RAM , 1 core CPU, 50 GB SSD drive Server plan. Which is enough for normal Field survey for data over 10000-15000 population.

6. You can add a block storage according to your need if storage gets exhausted later.

7. Choose a data center near your area. I am from Nepal so I chose the data center Banglore for my ODK server.

8. In “Select an additional option” field click on “User Data” tab

cloud-config.yml code

The cloud config code configures your ubuntu server. The script is once after the VM setup is complete and all the dependencies as well as all the necessary program like tomcat8, nginx, and jdk and postgresql are installed automatically.

9. For authentication you can create a ssh access to the server or use OTP (which will be emailed to you).

10. Create a hostname same as the subdomain name. i.e. odk.prizmadigital.com

11. You can add tags, add to a project and choose to take backups, then click on submit and the DO will start creating a server for you.

12. After the Server setup is completed you will get a IPV4 address silimar to 167.XXX.XXX.XXX . Copy this Ip address and and paste it to the A record of your sub domain’s DNS record.

13. Navigate to your odk website odk.yourdomain.com now you can see that the ODK aggregate is installed in your server.

14. Change the password for the aggregate using the login button at the top. The default admin username and passwords:

Username: administrator

Password: aggregate

Enabling HTTPS

  1. Click the Launch Console button to open a web-based console session.
Change root’s password

2. copy and paste the code replaing YOUR_EMAIL with your email ID and YOUR_DOMAIN using your domain name:

sudo certbot run --nginx --non-interactive --agree-tos -m YOUR_EMAIL --redirect -d YOUR_DOMAIN.

e.g. sudo certbot run –nginx –non-interactive –agree-tos -m [email protected] –redirect -d odk.prizmadigital.com.

Your Server now can make a secure connection using Lets Encrypt Suto SSL.

3. Now check your domain and login 🙂

Apple just launched the iphone 11

0

The successor for the iphone X is now Released. Apple just announced iPhone 11, iPhone 11 Pro and iPhone 11 Pro Max.

The latest iphone’s are equipped with three rear camera’s with deep fusion AI photography feature integrated. After many years for fast charging experience of the android users iphone users will soon be able to experience the same, as finally apple will be experience the same with 18 W charger in the box. iPhone 11 has a similar screen size as that of its predecessor,i.e. 6.1-inch but features a Liquid Retina display and is powered by Apple’s new A13 Bionic chip.

The price of the new apple phones will start from $699 for the 64 GB model.