الكاتب: أبو إياس

قصة برنامج للوصول لمخدم في المكتب من اﻹنترنت

السلام عليكم

بدأت هذه القصة في عام 2016م…

لدينا في المكتب خدمة إنترنت من نوع  ADSL وطريقة إتصاله بالإنترنت تختلف عن باقي خدمات اﻹنترنت اللاسلكية مثل 3G والـ 4G حيث أن أهم ما يميزه أن رقم الـ IP المستخدم لدخول النت يمكن الوصول إليه من أي جهاز في النت وهو يمثل رقم الراوتر أي أنه public، ويمكن عمل ما يُعرف بالـ port forwarding لتحويل رقم بورت معين إلى جهاز لابتوب المتصل مع ذلك الراوتر ، وفي حالتي لدي مخدم صغير في المكتب كنت أود الوصول إليه – وباقي زملائا في العمل- من الخارج من أي مكان في اﻹنترنت. لكن المشكلة أن رقم الـ IP الخاص براوتر الـ ADSL هو غير ثابت ، يتغير مع كل إتصال مع النت، أي أنه dynamic وليس static إلا أنه public.

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

لحل هذه المشكلة كان يجب استخدام إسم  domain name بدلاً من استخدام الرقم المتغير، وفي كل مرة يتم ربط هذا الإسم بالرقم الجديد، فبذلك يظل اﻹسم ثابتاً بالنسبة للأجهزة العميلة، مثلاً اﻹسم كان code-server.sd وهو إسم غير موجود في النت، إنما قمت بإضافته في ملف  /etc/hosts في نظام لينكس ، أو ملف

c:\windows\system32\drivers\etc\hosts

  في نظام وندوز. ثم نقوم بكتابة الرقم المتغيير معه، وكلما يتغير الرقم نقوم بتغيير تلك المعلومة في الملف، وبالنسبة للمستخدم لا يحس بأي تغيير لأنه يستخدم الإسم code-server.sd للوصول للمخدم بغض النظر عن رقمه الحالي.

مثلاً هذه محتويات الملف /etc/hosts في جهاز اللابتوب -ونظام تشغيله لينكس- استخدمه اﻵن، لاحظوا السطر اﻷخير به عنوان ورقم المخدم الذي نتكلم عنه:

127.0.0.1       localhost   global.com
127.0.1.1       L40-laptop
#192.168.0.105   L40-laptop
192.168.1.98     raspi2
192.168.0.101  mini-server mini-server.sd
0::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

# The following lines are desirable for IPv6 capable hosts
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

41.209.65.57          code-server.sd

كانت فكرة الحل هي كتابة برنامج بلغة php في موقع في اﻹنترنت تابع لنا، مثلاً http://www.code.sd ليقوم بندائه المخدم في المكتب كل فترة ليعلمه برقمه الحالي، مثلاً كل ساعة، فيقوم هذا البرنامج أو صفحة php بإنشاء ملف نصي به رقم المخدم الحالي. الخطوة الثانية هي كتابة برنامج أكثر تعقيداً لقراءة هذا الرقم كل فترة ثم تحديث هذه المعلومة في ملف hosts  كما في الشكل التالي:

update-server

قُمت بتسمية البرنامج الذي سوف نضعه في جهاز المستخدم server-update واﻷجهزة هي: لينكس، وجهاز RaspberryPi، ثم لاحقاً بعد كتابة البرنامج تم اﻹحتياج إلى نُسخة تعمل في نظام وندوزأي أنها ثلاث منصات تحتاج لبرنامج تتم كتابته بلغة برمجة متعددة المنصات. كانت الخيارات هي: لغة باسكال، ولغة shell script و لغة جافا، وأخيراً لغة سي أو سي ++

بالنسبة لخيار لغة باسكال متمثلة في FPC/Lazarus كانت موجودة في لينكس وراسبري باي، لكن كانت نُسختان مختلفات من المترجم، ومكتبة التخاطب مع النت HTTP لم تكن موجودة مع المكتبة القياسية للغة، كان لابد من تثبيت ما يُعرف بالـ component وهي تحتاج إلى بيئة لازاراس كاملة أي GUI وبالنسبة لجهاز راسبري باي لم تكن هذه البيئة موجودة فقط المترجم FPC ، لذلك تم استبعادها لعدم إمكانية إنتاج ملف تنفيذي لمنصة RaspberryPi.

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

الخيار الثالث أو ربما اﻷول كان لغة جافا، لكن لا أتذكر بالضبط لٍم لم أختارها، – كان هذا قبل حوالي ثلاثة أعوام – فهي كانت مناسبة، حيث توجد آلة جافا اﻹفتراضية في كلا المنصتين باﻹضافة إلى أن نُسخة الملف التنفيذي سوف تعمل بدون أي تعديل في نظام لينكس ونظام راسبري باي. لكن ربما إحتياجها لتلك اﻵلة اﻹفتراضية أن تكون موجودة في اللابتوب الذي نريد تشغيل هذا البرناج البسيط فيه لم يشجعني على استخدام جافا، حيث أنها مكتبة كبيرة نقوم بتثبيتها عندما يكون البرنامج يستحق تثبيت آلة جافا اﻹفتراضية، لكن ليس لمثل هذه البرامج البسيطة التي لا تزيد أن تكون عبارة عن script

لا أدري هل كانت لغة بايثون من الخيارات أم لا، حيث أن خبرتي بها قليلة جداً، لكن بها نفس مشكلة جافا حيث تحتاج لتثبيت مفسرها ومكتباته في أي جهاز نريد تثبيت هذا البرنامج به.

في النهاية  وقع الخيار على لغة سي، فهي متعددة المنصات وينتج عنها ملف تنفيذي لا يحتاج لمكتبة أو لأي منصة إضافية لتشغيله، وكنا قد درسناها في السنة الثالثة في الجامعة، أي قبل أكثر من 18 عام! وهو زمن طويل حيث كُنا في السنة الثالثة في جامعة السودان عام 1998 أي نهاية القرن الماضي. وطوال هذه الفترة لم استخدم لغة سي أو سي++ في العمل، مع أننا درسناها لمدة عام تقريباً، لكن الدراسة الأكاديمية مختلفة إلى حد كبير عن اﻹحتياج في بيئة العمل الحقيقية. مع أني عملت في مجال برامج اﻹتصالات والتي تُناسبها لغة سي وسي++ إلا أننا استخدمنا لغة أوبجكت باسكال، متمثلة في بيئة التطوير دلفي نظراً لسهولتها الكبيرة وتوفيرها لبيئة متكاملة للتطوير لم يكن ينافسها إلا بيئة فوجوال بيسك من حيث السهولة وسرعة إنتاج البرامج لكن دلفي كانت تتفوق بأداء أعلى يقارب أداء برامج لغة سي.

في كثير من المرات حاولت إعادة دراسة لغة سي والبحث عن استخدامها لكن كل مرة أفشل إما بسبب عدم وجود بيئة متكاملة مقارنة بدلفي أو بسبب عدم وجود تطبيق مناسب لاستخدامها. لكن هذه المرة وجدت تطبيق سهل مناسب وبيئة مناسبة NetBeans فقررت استخدامها لإنجاز هذا البرنامج البسيط.

قمت بعمل تجارب لقراءة معلومة صفحة من النت وقد احتجت لتثبيت مكتبة إضافية وهي مكتبة curl كذلك تطلبت طريقة معينة للترجمة لتضمين هذه المكتبة أثناء الترجمة، أي أن استخدام لغة سي لم يكن بالسهولة المناسبة مع سهولة البرنامج المطلوب.

في النهاية تمكنت – بفضل الله- من كتابة البرنامج وتشغيله بنجاح في بيئة لينكس، ثم إعادة ترجمته في جهاز الراسبري باي – حيث يوجد به مترجم سي أيضاً- فأصبحت هُناك نُسختان تنفيذيان من البرنامج تعملان مباشرة في أي جهاز يحتوي على لينكس أو راسبري باي ولا يحتاج البرنامج للغة سي أو أي مكتبة منها. لكن البرناج كان معقداً قليلاً وذو مقروئية متدنية تصّعب اﻷمر على من يريد فهمه أن تعديله.

في بداية العام الذي يليه قررت لسبب ما إعادة كتابة نفس البرنامج باستخدام لغة البرمجة Go حيث بدأت تعلمها في هذا الوقت، وكان أول تطبيق عملي هو برنامج server-update . فقمت بالبحث عن قراءة معلومة من صفحة في النت بهذه اللغة، وقد كانت سهلة ولا تحتاج لمكتبة خارجية إنما كل ما احتجت إليه وجدته في المكتبات القياسية لها. ولغة Go بها نفس ميزة لغة سي، حيث أنه ينتج عنها ملف تنفيذي يعمل في منصة التشغيل المستهدفة دون الحاجة لمكتبات إضافية أو منصة إضافية لتشغيل البرنامج. وفي النهاية كان البرنامج أكثر سهولة وأكثر وضوحاً من سابقه المكتوب بلغة سي. وكان أحد الميزات المهمة في مترجم لغة Go أنه يدعم ما يُعرف بالـ cross-compilation أي يمكن إنتاج برامج تنفيذية لمنصات مختلفة من منصة واحدة، مثلاً من بيئة لينكس يمكن إنتاج برامج تنفيذية لبيئة وندوز وراسبري باي وماكنتوش وغيرها، دون أن تقوم بنقل مصدر البرنامج إلى منصة أخرى لترجمتها وهذه الميزة لم أجدها في لغة سي أو لغة باسكال – مع أن مترجم فري باسكال به هذه الميزة لكن عملياً تطبيقها صعب.

بعد هذا البرنامج كانت إنطلاقة بالنسبة لي لاستخدام لغة Go في العمل في برامج صغيرة ثم برامج أكثر تعقيداً ومازلت استخدمها إلى اﻵن وكتبت بها عدد من البرامج التي تعمل اﻵن في ضمن عدد من اﻷنظمة. وكانت بديل جيد لعدد من برامج جافا حيث أن برامج Go أسرع في التنفيذ ولا تستهلك موارد كبيرة مثل الذاكرة إلا أن برنامجها التنفيذي أكبر بكثير من نظيرتها لغة جافا ولغة سي. فقد كان حجم الملف التنفيذي لبرنامج server-update حجمه 15 كيلوبايت فقط أما نظيره المكتوب بلغة Go فكان حجمه حوالي 6 ميغابايت!

لم أرجع أو أفكر للرجوع لاستخدام لغة سي بعد هذا البرنامج ولم أفكر باستخدام لغة سي++ واﻵن كلا اللغتين في تراجع مستمر بالنسبة للاستخدام حيث يميل كل من يريد الدخول للبرمجة لتعلم لغة أكثر سهولة كذلك فإن الشركات تستخدم اللغات الحديثة فقط في المشروعات البرمجية الجديدة. ويتم استخدام لغة سي وسي++ في المشاريع القديمة التي لها عشرات السنين والتي يتعذر نقلها إلى لغة برمجة جديدة، كذلك فإن لغة سي تُستخدم في اﻷنظمة المُدمجة والمعالجات الدقيقة micro-controllers.

وقبل الختام هذا مصدر البرنامج بلغة سي:

/* 
 * File:   main.c
 * Author: motaz
 *
 * Created on February 10, 2016, 1:35 PM
 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <curl/curl.h>

char *server;
char *localserver;

function_pt(void *ptr, size_t size, size_t nmemb, void *stream){
    
  //server = malloc(size);
    //strncpy(server, ptr, size);
    server = ptr;
}

// Local net
function_pt_local(void *ptr, size_t size, size_t nmemb, void *stream){
    
    //server = malloc(size);
    //strncpy(server, ptr, size);
    localserver = ptr;
}

int getURL(void){
    
  CURL *curl;
  curl = curl_easy_init();
  if(curl) {
    printf("Reading from site..\n");
    curl_easy_setopt(curl, CURLOPT_URL, "http://code.sd/..file.txt");
    curl_easy_setopt(curl, CURLOPT_TIMEOUT, 20L);
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, function_pt);
    curl_easy_perform(curl);
    curl_easy_cleanup(curl);
  }
    return 0;
}


void copyFiles(){
    
    FILE *fp;
    FILE *output;
    char * line = NULL;
    size_t len = 0;
    ssize_t read;   
    

    fp = fopen("hosts.tmp", "r");
    output = fopen("/etc/hosts", "w");
   
    while ((read = getline(&line, &len, fp)) != -1) {
        
        fputs(line, output);
    }
    fclose(fp);
    fclose(output);    
}

int main(int argc, char** argv) {

    FILE *fp;
    FILE *output;
    char * line = NULL;
    size_t len = 0;
    ssize_t read;   

    char *myserver;
    char* ok = NULL;
    
    getURL();
    myserver = server;

    printf("Server: [%s] \n", myserver);
    fp = fopen("//etc//hosts", "r");
    output = fopen("hosts.tmp", "w");
    int found = -1;
   
    while ((read = getline(&line, &len, fp)) != -1) {
        
        char* ptr=strstr(line, "code-server");
        if (ptr != NULL) {
            fputs(myserver, output);
            fputs("      ", output);
            fputs("code-server.sd\n", output);
            found = 1;
            printf("Found\n");
                    
        }
        else {
          fputs(line, output);
        }
    }
    
    if (found == -1){
       fputs(myserver, output);
       fputs("    ", output);
       fputs("code-server.sd\n", output);
       printf("New\n");
    }
    fclose(fp);
    fclose(output);
    copyFiles();
   
    return (EXIT_SUCCESS);
}

وهذا نفس البرنامج بلغة Go ويزيد عليه إضافة ليعمل في بيئة وندوز

// server-update2 project main.go
package main

import (
	"bufio"
	"io"
	"io/ioutil"
	"net/http"
	"os"
	"runtime"
	"strings"
)

func isLinux() bool {

	return runtime.GOOS == "linux"
}

func getTempFileName() string {
	if isLinux() {
		return "/tmp/hosts.tmp"
	} else {
		return "c:\\windows\\temp\\hosts.tmp"
	}
}

func getHostsFileName() string {
	if isLinux() {
		return "/etc/hosts"
	} else {
		return "c:\\windows\\system32\\drivers\\etc\\hosts"
	}
}

func main() {
	ip := getIP("http://code.sd/..file.txt")
	if (ip != "") && (len(ip) < 100) {
		readIntoTemp(ip)
		copyFile(getTempFileName(), getHostsFileName())
	} else {
		println("Unable to read IP")
	}
}

func getIP(url string) string {

	resp, err := http.Get(url)
	if err == nil {

		body, err2 := ioutil.ReadAll(resp.Body)
		if err2 == nil {
			line := string(body[:])
			return line
		} else {
			println("Error: " + err2.Error())
		}
	}
	return ""
}

func readIntoTemp(ip string) {

	file, _ := os.Open(getHostsFileName())
	destfile, _ := os.Create(getTempFileName())

	var found bool = false
	scanner := bufio.NewScanner(file)
	for scanner.Scan() {
		line := scanner.Text()
		if strings.Contains(line, "code-server.sd") {
			println("Found, IP = " + ip)
			found = true
			line = ip + "          code-server.sd"
		}
		destfile.WriteString(line + "\n")
	}
	if !found {
		println("New entry for code-server.sd")
		destfile.WriteString(ip + "       code-server.sd\n")
	}

	file.Close()
	destfile.Close()
}

func copyFile(source string, dest string) bool {

	sourceFile, err := os.Open(source)
	if err == nil {
		defer sourceFile.Close()
		destFile, err2 := os.Create(dest)
		if err2 == nil {
			defer destFile.Close()
			io.Copy(destFile, sourceFile)
		} else {
			println("Error: " + err2.Error())
		}
	}
	return err == nil
}

الجدير بالذكر أنه بعد فترة تعطل الراوتر، فاشتريت رواتر جديد من نوع DLink فوجدت به خدمة إضافية من الشركة المُنتجة له وهي خدمة Dynamic DNS حيث قمت بعمل حساب عندهم واختيار إسم دومين جديد ثم ربط هذا الحساب بالراوتر، فيقوم الراوتر بتحديث العنوان كلما تغير رقم الـ IP الخاص به، وبذلك اصبح هُناك حل سهل لا يحتاج لبرمجة أو توزيع برنامج للمستخدمين. لكن بقي البرامج الذي قمت بكتابته يعمل ليكون كإحتياطي في حالة تعطل الراوتر أو توقف الخدمة المجانية التابعة لشركة DLink

 

 

Advertisements

رحلة مع زملاء الوظيفة إلى مدينة بورتسودان

السلام عليكم ورحمة الله وبركاته

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

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

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

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

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

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

خطط زملائنا لمفاجأتي بشهادة تقديرية قاموا بتقديمها لي في المساء، وهو شيء أفخر به وأتمنى أن أكون دوماً عند حسن ظنهم.

كانت الرحلة رائعة والجو عليل في هذا الوقت من العام، نتمنى أن نحافظ عليها كل عام أو كل عامين لما فيها من تغيير وتجديد واستمتاع بالحياة بعد فترات طويلة من العمل المستمر والروتيني.

نترككم مع بعض الصور والفيدوهات:

تتطلب عرض الشرائح هذه للجافا سكريبت.

وهذه فيديوهات للشعب المرجانية:

 

بعض الأخطاء التي يفعلها الموظفون

السلام عليكم

سمعت اﻵن نصائح جيدة عن اﻷخطاء التي يقع فيها الموظفون في قناة الجزيرة، فاحببت أن أكتبها قبل أن أفقد تلك المعلومات لعلي استفيد منها ويسفيد بها غيري، وهذه النصائح كتبتها خبيرة للتوظيف في جريدة daily mail، هذه النصائح هي:

  1. اﻹكتفاء بأخذ إسبوع واحد فقط في العام، حيث يشعر بعض الموظفين بالذنب حيال أخذهم إجازة أطول
  2. القلق من وقت الفراغ: حيث أن الفراغ يمكن أن يقود إلى أفكار مبتكرة
  3. التأخر عن اﻹجتماعات
  4. النوم المتأخر
  5. القيام بمهام متعددة
  6. تحديد أهداف صعبة وكبيرة
  7. القول نعم دائماً: وهذا يخل بالتوازن المهني و الشخصي

تذكر أن هذه أخطاء يجب تجنبها وليست نصائح!

في الحقيقة لا احب أن أضيف أو اشرح تلك النقاط حتى تحتفظ بمعانيها المجردة، فقط يكفي أن نتأملها بين الحين واﻵخر

إسألو لبيبة: مسلسل ثقافي لكافة الأعمار

السلام عليكم

Meme_Many_Journeys
مصدر الصورة: ويكيميديا:

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

من أمثلة الحلقات والموضوعات التي تتكلم عنها هي:

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

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

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

ثلاث أعوام من استخدام قرص SSD

السلام عليكمssd-pack

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

قمت اليوم بإعادة القياس لنفس البرامج والمهام التي سبق وقستها سابقاً، فكانت النتيجة كالتالي:

  1. تشغيل نظام أبونتو إلى شاشة الدخول استغرق 20 ثانية مقارنة بـ 15 ثانية عندما كان القرص جديد
  2. الدخول إلى سطح المكتب استغرق 13 ثانية مقارنة بثانيتين فقط عندما كان جديداً
  3. تشغيل برنامج NetBeans استغرق 18 ثانية، مقارنة بـ 8 ثواني عندما كان القرص جديد
  4. إغلاق الجهاز استغرق 5 ثواني وهي نفس المدة السابقة

ssd-speed

نلاحظ أن الأداء تأخر قليلاً وذلك بعد تثبيت عدد كبير من البرامج وزيادة حجم البيانات المخزنة في القرص، لكن مازال ينافس القرص القديم بفارق كبير، ومن اﻷشياء التي كان فيها الفرق ملحوظ هو تشغيل نظام تشغيل آخر من داخل لينكس باستخدام VirtualBox حيث لدي نُسخة وندوز 7 نقلتها من لابتوب إلى لابتوب آخر، واصبحت تقلع بسرعة ملحوظة بعد القرص الجديد SSD

من اﻷشياء المهمة التي أحب ذكرها هي أني قمت بتغيير اللابتوب، لكن لم أغير نظام التشغيل، حيث قمت بشراء لابتوب جديد ثم قمت بفك قرصه الذي أتى معه، مع إنه كان من نوع SSD لكن بسعة قليلة، 100 قيقابابت، مقارنة بالقرص الذي نتكلم عنه ذو 512 قيقابابت، فقمت بتبديل قرصي اللابتوبين، ليعمل اللابتوب الجديد بدون أي مشكلة، فقط طلب مني إعادة إدخال كلمة مرور شبكة Wifi مع أن العتاد مختلف، حيث أن اللابتوب القديم هو من نوع Tushiba والمعالج Core i5 واللابتوب الجديد Dell Core i3، وهذه ميزة في نظام لينكس، أما نظام وندوز فحسب تجربتي معه فإنه يتوقف عن العمل عندما تقوم بتشغيل قرص في لابتوب آخر، على اﻷقل أنا أتكلم عن تجربتي مع وندوز 7

عند عرض معلومات الـ SMART  يظهر أن القرص بحالة جيدة، وأنه عمل لمدة سبعة أشهر فقط، وبخلاف القرص العادي والذي يتم حساب زمن تشغليه مع الجهاز، أي إذا كان الجهاز يعمل ثماني ساعات فإن تلك القيمة تُضاف لمعلومة زمن تشغل القرص، لكن قرص الـ SSD فلا يتم حساب الوقت كاملاً، ربما يتم حساب الزمن الذي تمت فيه القراءة والكتابة الفعلية، أي أنه يمكن حساب ساعتين أو ثلاث ساعات مثلاً حسب نشاط المستخدم.

ssd-smart

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

من المعلومات المهمة التي تحصلت عليها من النت هو عدم مليء القرص من نوع SSD حتى لا يتلف، لذلك إلى اﻵن استخدم فقط 60% من المساحة و أقوم بحذف الملفات غير الضرورية كبيرة الحجم، وذلك لأنه يقوم بتبديل الأجزاء التي تلفت من كثرة الكتابة بأجزاء أخرى جديدة، فإذا كان القرص ممتليء فإن ذلك يمكن أن يؤدي إلى تلفه المفاجيء لعدم وجود مساحة للتبديل

اﻹصدار الثالث من كتاب: رحلة استكشافية للغة البرمجة جافا

السلام عليكم ورحمة اللهsmallcover

اليوم بفضل الله قمت بإصدار النُسخة الثالثة من كتاب رحلة استكشافية للغة البرمجة جافا، حيث كان اﻹصدار الثاني قبل عامين تقريباً.

في هذا اﻹصدار لم تكن اﻷولوية لإضافة مواضيع جديدة، بقدر ما كان التركيز على إعادة صياغة بعض الفقرات واﻷمثلة وزيادة التوضيح للمفاهيم أو اﻷمثلة التي بها بعض الغموض، وكان ذلك بعد الحصول على إفادة من بعض القراء حول تلك النقاط التي تحتاج توضيح.

عندما تقرأ كتاب أو مقالة أو فقرة كتبتها قبل فترة تجد في كل مرة أنه يوجد صياغة أفضل من الصياغة الحالية، وذلك لعدة اسباب: منها الاستعجال عند الكتابة أول مرة، أوبسبب عدم التأكد من المعلومة الكاملة في المرة اﻷولى، أو عند تغيير وتطور تلك المعلومة، وكذلك عندما تتكون للكاتب فكرة أعمق وخبرة أكثر عن الموضوع الذي كتب عنه، فهي مثلها مثل البرامج تحتاج إلى تحديث مستمر خصوصاً إذا كانت تتناول مواضيع تتغير مع الزمن.

رابط تحميل الكتاب

 

حلقات تابعتها في يوتيوب

السلام عليكم، وكل عام وأنتم بخير

طلب اﻷخ عبد الله المهيري في تدوينته هذه من المدونيين بأن يخبروا بقنوات يوتيوب التي يتابعونها. فاحببت أن أشارك:

في الحقيقة لا اشترك في أي من القنوات، لكن أتابع حلقات معينة، خصوصاً الوثائقيات التي تكون في شكل حلقات، وسوف أقوم بنشر تلك الحلقات التي شاهدتها واستفدت منها، وأريد أن أضيف أن معظمها شاهدتها مع أبنائي، فهي غير مرتبطة بسن معينة أو تخصص بعينه:

 

  1. يوميات مزارع: تقريباً هذه القناة الوحيدة التي تابعتها من بدايتها إلى نهايتها، لكن منذ فترة لم أتابع الحلقات الجديدة.
  2. العظماء المأئة، برنامج تاريخي، شاهدت عدة حلقات منه وليست كلها
  3. سلسلة أرض السمر، سلسلة عن مدن وقرى السودان
  4. الحياة البرية في النيل: وثاقي عن نهر النيل في ثلاث حلقات
  5. حياة في الجو
  6. سلسلة ماتحتاج معرفته: الكيمياء، الفيزياء، العقل البشري، وآنشتين
  7. how it is made
  8. قناة لإعادة تجديد اﻷشياء القديمة
  9. سلسلة في الطريق إلى المدرسة
  10. سلسلة تحقيقات الكوارث الجوية
  11. سلسلة مطار دبي الدولي
  12. سلسلة أصعب تصليحات العالم
  13. سلسلة هياكل عملاقة
  14. على خطى العرب
  15. عبيد العوني: عن الحياة الفطرية
  16. ماكينة القتل: تطور السلاح أثناء الحروب العالمية

هذا أهم ما تذكرته إلى اﻵن