Wednesday, May 8, 2019

تجربتي: الإختبار التحريري بجامعة الملك فهد لعام 1439 - 2018

مقدمة

السلام عليكم و رحمة الله و بركاته. بما أنه قد مرت تقريباً حوالي سنة كاملة على تجربتي, قررت الكتابة عنها الآن.

في يوم الأحد المصادف لتاريخ 1 يوليو عام 2018, كان الإختبار التحريري لوظيفة مطور برامج بجامعة الملك فهد للبترول و المعادن. انا قدمت على هذه الوظيفة بتاريخ مايو 2, 2018 عن طريق الموقع الإلكتروني للمسابقة الوظيفية طبعا الموقع حالياً تغير و أصبح لتقديم طلبات الدراسات العليا. لكن عند تسجيل دخولي, ارى ان ملفي لا يزال كما هو. في هذا المنشور، سوف اتحدث عن تجربتي بذاك اليوم و سوف اتطرق الى الأسئلة اللي كانت بالإختبار و كيفية الإستعداد للإختبار بشكل عام.

الإنطلاق من الأحساء

موعد الإختبار كان الساعة التاسعة صباحاً و انا كنت من الأحساء. فمن اجل الوصول قبل الموعد، انطلقت من الأحساء في حدود السابعة و الربع. بالنهاية وصلتُ مُتأخراً اربع دقائق بسبب تحويلة عند مدخل المدينة الصناعية. عموماً لم يبدأ الإختبار اللا الساعة التاسعة و النصف.

الوصول و دخول قاعة الإختبار

الإختبار كان بمبنى 54 المسمى ب مبنى المعارض. هذا المبنى دائماً تستخدمه الجامعة للإختبارات و القيام بالمعارض مثل معرض التوظيف أو مشاريع التخرج و غيره. الصورة التالية توضح شكل المبنى من الخارج.

عند الوصول للمبنى و الدخول اليه، رأيت عدة لوحات مكتوب فيها المسمى الوظيفي لكل وظيفة اللتي لها اختبار. انا بحثت عن الوظيفة اللتي انا قمت بالتقديم عليها و إصطففت مع الناس. عندما وصلت للشخص الموجود هناك، سألني عن الوظيفة المقدم عليها و بعدها قال لي أعطني بطاقة الهوية الوطنية. بعد البحث عن اسمي بورقة الكشف و العثور عليه، قال لي خُذ ورقة الإجابة مع قلم رصاص من الموجودين فوق الطاولة. بعدها دخلت مكان الجلوس للإختبار.

داخل قاعة الإختبار

كما جرت العادةفي اي إختبار، تم إخبار جميع المختبرين عن بعض التعليمات حول الإختبار. بعض من التعليمات كانت:

  • اطفاء الجوال و وضعه اسفل يمين الكرسي
  • اخراج اي جهاز الكتروني من الجيب و وضعه مع الجوال
  • كيفية كتابة معلوماتك على ورقة الإجابة.
  • طريقة اختيار الإجابة و عملية التظليل.
  • مدة الإختبار و متى يمكننا الخروج.

بعدها بدأوا بتوزيع اوراق الأسئلة على جميع المختبرين. بعد توزيع الأسئلة، بدأ الإختبار بعدها بعشر دقائق تقريباً.

الإختبار و طبيعة الأسئِلة

الإختبار كان يحتوي على ثلاثين سؤال باللغة الإنجليزية. الأسئلة كانت اختر الإجابة الصحيحة من بين اربع خيارات. مدة الإختبار كانت تقريبا ساعتين لكن من الممكن الخروج بعد انقضاء نصف الوقت. الأسئلة كانت تتمحور حول المواضيع التالية:

  • Data size mesurment units.
  • Boolean expressions and how to evaluate.
  • Data structures.
  • Database related questions.
  • Modular software development.
  • Software life cycle.
  • Basics of networking.
  • Client, server and web development related questions.
  • General questions.

بشكل عام، الأسئلة كلها كانت سهلة بالنسبة لي ماعدا قسم ال Boolean expressions و ال general questions. جميع الأسئلة اللتي كانت حول التعابير المنطقية كانت تحتوي على مُعامل XOR و هو ما جعل القسم صعب. بالنسبة لقسم الأسئلة العامة, سؤال واحد كنت محتار في اجابته الا وهو من هو مخترع الإنترنت. طبعا من اجل الإستعداد للإختبار، عليك انك تراجع المواضيع اللي فوق قبل الإختبار بثلاثة أيام على الأقل.

بعد الإنتهاء من الإختبار

بعد الإنتهاء من الإختبار، تم إخبرانا بأنه سوف يتم إرسال رسائل عبر الجوال للأشخاص الناجحين بالإختبار اليوم التالي و تحديد موعد المقابلات.

انا نجحت بالإختبار و قدمت على المقابلة الوظيفية لكن للأسف لم يكتب لي رب العالمين نصيب في هذه الوظيفة.


Saturday, April 27, 2019

What I Have Learned Today: Using PHP Through Command Line Interface (CLI)

One of the things that I was interested in is how some PHP frameworks can be used from command line interface to execute PHP code and commands. Some of the tools that I have used are composer and PHPUnit and both can be used from command line. For that reason, I started to think about adding this feature to WebFiori Framework.

After few attempts and failures, I managed to add basic support for running the framework from command line. You can see from the following picture that running the framework from CMD is working without problems.


There are few things that I had to do in order to add support for running the framework from the command line. The things are the following:

  • Checking if main script file is loaded using command line using the method php_sapi_name().
  • Initializing some $_SERVER and $_ENV variables as they are not initialized if PHP script is accessed through command line.
  • Getting command line arguments using the constant $_SERVER['argv'].

For the last two steps, I created new class to handle the two tasks. The name of the class is CLI.php After doing that, I have only changed few lines of code in main class to redirect user to use CLI as shown in the following picture.

Saturday, March 9, 2019

WebFiori, New Web Development Framework

WebFiori Framework is new web development framework which was built in top of PHP scripting language. It was designed from scratch to provide the developer with needed tools to setup new website or create a very complex web application using minimum tools.

Basic features (Taken from official website):

  • Theming and the ability to create multiple UIs for the same web page using any CSS or JavaScript framework.
  • Support for routing that makes the ability of creating search-engine-friendly links an easy task.
  • Creation of web APIs that supports JSON, data filtering and validation.
  • Basic support for MySQL schema and query building.
  • Lightweight. The total size of framework core files is less than 3 megabytes.
  • Access management by assigning system user a set of privileges.
  • The ability to create and manage multiple sessions at once.
  • Support for creating and sending nice-looking emails in a simple way by using SMTP protocol.
  • Autoloading of user defined classes.
  • The ability to create automatic tasks and let them run in specific time using CRON.
  • Support for logging of system events.
  • Well-defined file upload and file handling sub-system.

The project is currently hosted in my personal website and it can be accessed through the URL: https://programmingacademia.com/webfiori . You can find more information about the project there.

Another thing is that the project is open source and is licensed under MIT license. You can grab the source code of the framework from my GitHub repo at https://github.com/usernane/webfiori.

Your Contribution is Appreciated

One of the things that I need your help in is your feedback (Negative or positive). You can help me by trying the framework your self and provide me with your feedback. You check https://programmingacademia.com/webfiori/learn to get started.

Another thing is that you might find hundreds of issues in the source code of the framework since I'm not an experienced PHP developer (Design issues, Security issues, Bad practices, etc...). What you can possibly do is to review the source code and report any issue that you might find regarding how things are done.

Also, if you need any help regarding how to use the framework or you are just interested, please join telegram group using the following link: https://t.me/webfiori

Thank you for your time.

Saturday, September 15, 2018

JsonX APIs

Note: This library is now part of WebFiori Framework. Updated API Docs can be found at https://programmingacademia.com/webfiori/docs/jsonx/.

This page contain APIs descriptions of the library JsonX, A library that can be used to create JSON strings in PHP. The library consist of two files only, JsonX.php and JsonI.php. The first file contains the class 'JsonX' which is the core component. The other file contains an interface which can be implemented by other classes to create a custom JSON strings.

Basic Usage Example

The next lines of code shows how to use the library in very simple way.

<?php
include 'JsonX.php';
include 'JsonI.php';

//create new instance of JsonX
$json = new JsonX();

//add attributes to JSON object.
$json->add('a-string', 'This is a string.');
$json->add('a-number', 44);
$json->add('a-boolean', FALSE);
$json->add('null-value', NULL);

//send Json object as response
header('content-type:application/json');
echo $json;

Class JsonX

Version: 1.2

Author: Ibrahim BinAlshikh

const TYPES

  • Type: Array
  • Description: An array of supported JOSN data types. The array has 7 values: 'integer', 'string', 'double', 'boolean', 'NULL' and 'object'.
  • Since: 1.0

const SPECIAL_CHARS

  • Type: Array
  • Description: An array which contains JSON special characters that can be a part of a string. The array has the following characters: \\, /, ", \t, \r, \n and \f.
  • Since: 1.0

const SPECIAL_CHARS_ESC

'
  • Type: Array
  • Description: An array which contains escaped JSON special characters that can be a part of a string.
  • Since: 1.0

public function add($key, $value, $options=array())

Adds a new value to include in the generated JSON string.

Parameters:

  • $key:
    • Type: string
    • Description: The name of the attribute that the given value will be stored in. Usually called the "name" of the "value".
  • $value:
    • Type: mixed
    • Description: The value of the key. It can be an integer, a double, a string, an array or an object. If NULL is given, the method will set the value at the given key to 'null'.
  • $options: [Optional]
    • Type: Array
    • Description: An associative array of options. Currently, the array has the following options:
      • string-as-boolean: A boolean value. If set to TRUE and the given string represents a boolean value (like 'yes' or 'no'), the string will be added as a boolean value. Default is FALSE.
      • array-as-object: A boolean value. If set to TRUE, the array will be added as an object. Default is FALSE.

Returns:

  • boolean: TRUE if the value is set. If the given value or key is invalid, the function will return FALSE.

Since: 1.1

public function addNumber($key, $value)

Adds a number to include in the generated JSON string.

Parameters:

  • $key:
    • Type: string
    • Description: The name of the attribute that the given value will be stored in. Usually called the "name" of the "value"
  • $value:
    • Type: integer | double
    • Description: The number which will be added. Note that if the given number is INF or NAN, The method will add them as a string.

Returns:

  • boolean: TRUE if the value is set. If the given value or key is invalid, the function will return FALSE.

Since: 1.0

public function addBoolean($key, $value)

Adds a boolean value (true or false) to include in the generated JSON string.

Parameters:

  • $key:
    • Type: string
    • Description: The name of the attribute that the given value will be stored in. Usually called the "name" of the "value"
  • $value: [Optional]
    • Type: boolean
    • Description: TRUE or FALSE. If not specified, The default will be TRUE.

Returns:

  • boolean: TRUE if the value is set. If the given value or key is invalid, the function will return FALSE.

Since: 1.0

public function addString($key, $value, $asBoolean)

Adds a string to include in the generated JSON string.

Parameters:

  • $key:
    • Type: string
    • Description: The name of the attribute that the given value will be stored in. Usually called the "name" of the "value"
  • $value:
    • Type: string
    • Description: The value of the string. Note that if the given string is one of the following and the parameter $asBoolean is set to TRUE, it will be converted into boolean (case insensitive).
      • yes => TRUE
      • no => FALSE
      • y => TRUE
      • n => FALSE
      • t => TRUE
      • f => FALSE
      • true => TRUE
      • false => FALSE
      • on => TRUE
      • off => FALSE
      • ok => TRUE
  • $asBoolean: [Optional]
    • Type: boolean
    • Description: If set to TRUE and the string represents a boolean value, then the string will be added as a boolean. Default is FALSE.

Returns:

  • boolean: TRUE if the value is set. If the given value or key is invalid, the function will return FALSE.

Since: 1.0

public function addArray($key, $value, $asObject)

Adds an array to include in the generated JSON string.

Parameters:

  • $key:
    • Type: string
    • Description: The name of the attribute that the given value will be stored in. Usually called the "name" of the "value"
  • $value:
    • Type: Array
    • Description: The array that will be added. If the given array is indexed array, all values will be added as single entity (e.g. [1, 2, 3]). If the array is associative, the values of the array will be added as objects.
  • $asObject: [Optional]
    • Type:
    • Description: If this parameter is set to TRUE, the array will be added as an object in JSON string. Default is FALSE.

Returns:

  • boolean: TRUE if the value is set. If the given value or key is invalid, the function will return FALSE.

Since: 1.0

public function addObject($key, $value)

Adds a PHP object to include in the generated JSON string.

Parameters:

  • $key:
    • Type: string
    • Description: The name of the attribute that the given value will be stored in. Usually called the "name" of the "value">
  • $value:
    • Type: JsonI | Object
    • Description: The parameter can be a PHP object or an object that implements the interface 'JsonI'. If the object does not implement the interface 'JsonI', then the function will try to extract object information based on its public functions and the generated JSON will be on the format {"prop-0":"something","prop-1":"something else","prop-n":"xxx"}.

Returns:

  • boolean: TRUE if the value is set. If the given value or key is invalid, the function will return FALSE.

Since: 1.0

public function get($key)

Returns a string that represents the value at the given key.

Parameters:

  • $key:
    • Type: string
    • Description: The name of the attribute that the value is stored in. Usually called the "name" of the "value"

Returns:

  • string | NULL: A string that represents the value at the given key. If the key does not exists, the function will return NULL.

Since: 1.2

public function hasKey($key)

Checks if a key is exist or not.

Parameters:

  • $key:
    • Type: string
    • Description: The name of the key. Usually called the "name".

Returns:

  • boolean: The function will return TRUE if the key exists. FALSE if not.

Since: 1.2

public static function escapeJSONSpecialChars($str)

Escape JSON special characters from a string.

Parameters:

  • $str:
    • Type: string
    • Description: A value of one of JSON object properties. If it is NULL,the method will return empty string.

Returns:

  • string: The same string with JSON special characters escaped.
  • Since: 1.0

Interface JsonI

Version: 1.0

Author: Ibrahim BinAlshikh

public function toJSON()

This function can be implemented by any class that will be added as an attribute to any JsonX instance.It is used to customize the generated JSON string.

Parameters:

  • NONE

Returns:

  • JsonX: An instance of JsonX

Since: 1.0