انجمن‌های فارسی اوبونتو

لطفاً به انجمن‌ها وارد شده و یا جهت ورود ثبت‌نام نمائید

لطفاً جهت ورود نام کاربری و رمز عبورتان را وارد نمائید


توزیع گنو/لینوکس اوبونتو ۲۰ ساله شد 🎉

نویسنده موضوع: لطفا راهنمایی کنید این تکه کد با چه زبانی نوشته شده  (دفعات بازدید: 1893 بار)

0 کاربر و 3 مهمان درحال مشاهده موضوع.

آفلاین farshadf

  • Full Member
  • *
  • ارسال: 106
دوستان من میخوام کم کم شروع کنم تویه محیط لینوکس برنامه نویسی کار کنم. قبلا در حد ویژوال و دلفی کار کردم در حد پروژه های دانشگاهی.

این تکه کد رو لطفا بگین با چه زبونی نوشته شده چون ظاهرا سادس و خودم تونستم یه تغییرات کوچکی درش انجام بدم. می خوام بدونم چه زبانیه تا در موردش بیشتر مطالعه کنم.
ممنون

#include <gtk/gtk.h>
#include <libappindicator/app-indicator.h>
#include <glibtop.h>
#include <glibtop/netload.h>
#include <glibtop/netlist.h>
#include <pango/pango.h>
#include <gio/gio.h>
#include <stdbool.h>

#define TRACE(...) if (trace) { printf( __VA_ARGS__); fflush(stdout); } else {}

bool trace = false;

/* update period in seconds */
int period = 1;
gboolean first_run = TRUE;

GSettings *settings;

AppIndicator *indicator;
GtkWidget *indicator_menu;
GtkWidget *interfaces_menu;

gchar* selected_if_name = NULL;

GtkWidget *if_chosen;
GtkWidget *net_down_item;
GtkWidget *net_up_item;
GtkWidget *quit_item;

gchar* format_net_label(int data, bool padding)
{
    gchar *string;
    /*if(data < 1000)
    {
        string = g_strdup_printf("%d B/s", data);
    }
    else*/ if(data < 1000000)  //should be < 1 MiB and not 1 MB, but this keeps width smaller
    {
        string = g_strdup_printf("%.1f KiB/s", data/1024.0);
    }
    else
    {
        string = g_strdup_printf("%.2f MiB/s", data/1048576.0);
    }
    //will someone have 1 gb/s ? maybe...

    if(padding)
    {
        //render string and get its pixel width
        int width = 0;
        static int maxWidth = 12;   //max width for label in pixels

        //TODO: should be determined from current panel font type and size
        int spaceWidth = 4;  //width of one space char in pixels,

        PangoContext* context = gtk_widget_get_pango_context(indicator_menu);
        PangoLayout* layout = pango_layout_new(context);
        pango_layout_set_text(layout, string, strlen(string));
        pango_layout_get_pixel_size(layout, &width, NULL);
        // frees the layout object, do not use after this point
        g_object_unref(layout);

        //push max size up as needed
        if (width > maxWidth) maxWidth = width + spaceWidth;

        gchar *old_string = string;

        //fill up with spaces
        string = g_strdup_printf("%*s%s", (int)((maxWidth-width)/spaceWidth), " ", string);
        g_free(old_string);
    }

    return string;
}

void get_net(int traffic[2])
{
    TRACE("\n")
    TRACE("getting net traffic...\n")
    TRACE("selected interface is %s\n", selected_if_name)
    static int bytes_in_old = 0;
    static int bytes_out_old = 0;
    glibtop_netload netload;
    glibtop_netlist netlist;
    int bytes_in = 0;
    int bytes_out = 0;
    int i = 0;

    gchar **interfaces = glibtop_get_netlist(&netlist);

    for(i = 0; i < netlist.number; i++)
    {
        TRACE("\n")
        TRACE("processing interface %s\n", interfaces[i])
        if (strcmp("lo", interfaces[i]) == 0)
        {
            TRACE("skipping loopback interface\n")
            continue;
        }

        if(strcmp("all", selected_if_name) == 0 || strcmp(selected_if_name, interfaces[i]) == 0) {
            glibtop_get_netload(&netload, interfaces[i]);
            TRACE("in: %ld, out: %ld\n", netload.bytes_in, netload.bytes_out)
            bytes_in += netload.bytes_in;
            bytes_out += netload.bytes_out;
        }
        else
        {
            TRACE("skipping\n")
        }
    }
    g_strfreev(interfaces);

    if(first_run)
    {
        bytes_in_old = bytes_in;
        bytes_out_old = bytes_out;
        first_run = FALSE;
    }

    traffic[0] = (bytes_in - bytes_in_old) / period;
    traffic[1] = (bytes_out - bytes_out_old) / period;

    bytes_in_old = bytes_in;
    bytes_out_old = bytes_out;
}

void if_signal_select(GtkMenuItem *menu_item, gpointer user_data) {
    //set currently selected interface from user selection
    gchar *old_if_name = selected_if_name;
   
    // We're allocating a new string here, but we don't need to free the previous
    // one because the call to gtk_menu_item_set_label below does that already.
    selected_if_name = g_strdup(gtk_menu_item_get_label(menu_item));
    TRACE("Selected interface %s\n", selected_if_name);
    // frees the previous selected_if_name
    gtk_menu_item_set_label(if_chosen, selected_if_name);
    g_settings_set_value (settings, "if-name", g_variant_new_string(selected_if_name));
   

    first_run = TRUE;
    update();
}

void add_netifs() {
    TRACE("populating list of interfaces\n")
    //populate list of interfaces
    //TODO: make this refresh when interfaces change
    glibtop_netlist netlist;
    gchar **interfaces = glibtop_get_netlist(&netlist);
    GtkWidget *if_item;

    for(int i = 0; i < netlist.number; i++) {
        if (strcmp("lo", interfaces[i]) == 0)
        {
            TRACE("skipping loopback interface\n")
            continue;
        }

        TRACE("adding interface %s\n", interfaces[i]);

        if_item = gtk_menu_item_new_with_label(interfaces[i]);
        gtk_menu_shell_append(GTK_MENU_SHELL(interfaces_menu), if_item);
        g_signal_connect (G_OBJECT(if_item), "activate", G_CALLBACK(if_signal_select), NULL);
    }

    if_item = gtk_menu_item_new_with_label("all");  //can name and id be different?
    gtk_menu_shell_append(GTK_MENU_SHELL(interfaces_menu), if_item);
    g_signal_connect (G_OBJECT(if_item), "activate", G_CALLBACK(if_signal_select), NULL);

    //set previously selected value
    gtk_menu_item_set_label(GTK_MENU_ITEM(if_chosen), selected_if_name);
    g_strfreev(interfaces);
}

gboolean update() {
    //get sum of up and down net traffic and separate values
    //and refresh labels of current interface
    int net_traffic[2] = {0, 0};
    get_net(net_traffic);
    int net_down = net_traffic[0];
    int net_up = net_traffic[1];
    int net_total = net_down;

    gchar *indicator_label = format_net_label(net_total, true);
    gchar *label_guide = "10000.00 MiB/s";   //maximum length label text, doesn't really work atm
    app_indicator_set_label(indicator, indicator_label, label_guide);
    g_free(indicator_label);

    gchar *net_down_label = format_net_label(net_down, false);
    gtk_menu_item_set_label(GTK_MENU_ITEM(net_down_item), net_down_label);
    g_free(net_down_label);

    gchar *net_up_label = format_net_label(net_up, false);
    gtk_menu_item_set_label(GTK_MENU_ITEM(net_up_item), net_up_label);
    g_free(net_up_label);

    if (net_down && net_up)
    {
        app_indicator_set_icon(indicator, "network-transmit-receive");
    }
    else if (net_down)
    {
        app_indicator_set_icon(indicator, "network-receive");
    }
    else if (net_up)
    {
        app_indicator_set_icon(indicator, "network-transmit");
    }
    else {
        app_indicator_set_icon(indicator, "network-idle");
    }

    return TRUE;
}

int main (int argc, char **argv)
{
    if (argc > 1 && strcmp("--trace", argv[1]) == 0)
    {
        trace = true;
        argc--;
        argv++;
        printf("Tracing is on\n");
        fflush(stdout);
    }

    gtk_init (&argc, &argv);

    settings = g_settings_new("apps.indicators.netspeed");
    selected_if_name = g_variant_get_string (g_settings_get_value(settings, "if-name"), NULL);

    indicator_menu = gtk_menu_new();

    //add interfaces menu
    interfaces_menu = gtk_menu_new();

    //add interface names
    if_chosen = gtk_menu_item_new_with_label("");
    gtk_menu_shell_append(GTK_MENU_SHELL(indicator_menu), if_chosen);
    gtk_menu_item_set_submenu (if_chosen, interfaces_menu);
    add_netifs();

    //separator
    GtkWidget *sep = gtk_separator_menu_item_new();
    gtk_menu_shell_append(GTK_MENU_SHELL(indicator_menu), sep);

    //add menu entries for up and down speed
    net_down_item = gtk_image_menu_item_new_with_label("");
    GtkWidget *net_down_icon = gtk_image_new_from_icon_name("network-receive", GTK_ICON_SIZE_MENU);
    gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(net_down_item), net_down_icon);
    gtk_image_menu_item_set_always_show_image(GTK_IMAGE_MENU_ITEM(net_down_item), TRUE);
    gtk_menu_shell_append(GTK_MENU_SHELL(indicator_menu), net_down_item);

    net_up_item = gtk_image_menu_item_new_with_label("");
    GtkWidget *net_up_icon = gtk_image_new_from_icon_name("network-transmit", GTK_ICON_SIZE_MENU);
    gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(net_up_item), net_up_icon);
    gtk_image_menu_item_set_always_show_image(GTK_IMAGE_MENU_ITEM(net_up_item), TRUE);
    gtk_menu_shell_append(GTK_MENU_SHELL(indicator_menu), net_up_item);

    //separator
    sep = gtk_separator_menu_item_new();
    gtk_menu_shell_append(GTK_MENU_SHELL(indicator_menu), sep);

    //quit item
    quit_item = gtk_menu_item_new_with_label("Quit");
    gtk_menu_shell_append(GTK_MENU_SHELL(indicator_menu), quit_item);
    g_signal_connect(quit_item, "activate", G_CALLBACK (gtk_main_quit), NULL);

    gtk_widget_show_all(indicator_menu);

    //create app indicator
    indicator = app_indicator_new ("netspeed", "network-idle", APP_INDICATOR_CATEGORY_SYSTEM_SERVICES);
    app_indicator_set_status(indicator, APP_INDICATOR_STATUS_ACTIVE);
    app_indicator_set_label(indicator, "netspeed", "netspeed");
    app_indicator_set_menu(indicator, GTK_MENU (indicator_menu));

    //set indicator position. default: all the way left
    //TODO: make this optional so placement can be automatic
    guint32 ordering_index = g_variant_get_int32(g_settings_get_value(settings, "ordering-index"));
    app_indicator_set_ordering_index(indicator, ordering_index);

    update();

    /* update period in milliseconds */
    g_timeout_add(500*period, update, NULL);

    gtk_main ();

    return 0;
}

آفلاین سالار مقدم

  • عضو کاربران ایرانی اوبونتو
  • *
  • ارسال: 2074
  • جنسیت : پسر
  • هر چقدر بدونی بازم کمه.
    • سالار مقدم
زبان برنامه نویسی C با GTK

آفلاین farshadf

  • Full Member
  • *
  • ارسال: 106
ممنون بابت راهنمایی.

بنظرتون ارزششو داره واسش وقت بزارم و یاد بگیرم یا یه زبان دیگه رو متمرکز بشم؟

آفلاین احسان☺

  • Full Member
  • *
  • ارسال: 220
  • جنسیت : پسر
ممنون بابت راهنمایی.

بنظرتون ارزششو داره واسش وقت بزارم و یاد بگیرم یا یه زبان دیگه رو متمرکز بشم؟
سلام
بستگی به کاری که میخواید بکنید و دانش قبلیتون داره.اگه چیز زیادی از برنامه نویسی نمیدونید،پایتون میتونه گزینه ی خوبی باشه.

آفلاین سهراب سپید

  • Full Member
  • *
  • ارسال: 208
زبان سی جایی استفاده میشه که سرعت مد نظر باشه مثل میکروکنترلر ها و هسته سیستم عامل ها
اگه هدفت برنامه نویسی برای سیستم عامل دسکتاپی و میخای یه زبون راحت و همه کاره یاد بگیری پایتون پیشنهاد میکنم
به جای جی تی کی هم کیوت پیشنهاد میکنم که آینده بهتری داره

آفلاین farshadf

  • Full Member
  • *
  • ارسال: 106
ممنون بابت راهنمایی.

بنظرتون ارزششو داره واسش وقت بزارم و یاد بگیرم یا یه زبان دیگه رو متمرکز بشم؟
سلام
بستگی به کاری که میخواید بکنید و دانش قبلیتون داره.اگه چیز زیادی از برنامه نویسی نمیدونید،پایتون میتونه گزینه ی خوبی باشه.

ممنون احسان جان
هم با راهنمایی شما و جستجوی بیشتر تویه نت متوجه شدم که پایتون گزینه خوبیه واسه شروع.
رفتم تویه سایتش که در موردش مطالعه کنم و دانلود کنم ولی ظاهرا دو تا نسخه داره. ۲ و ۳. همون ۳ رو بگیرم نصب کنم خوبه دیگه؟ فرق اساسی دارن این دوتا؟

آفلاین سهراب سپید

  • Full Member
  • *
  • ارسال: 208
اگه از اوبونتو استفاده میکنی نسخه ۲ روی سیستمت نصبه فقط ۳ دانلود کن
از محیط برنامه نویسی پایتون هم  eric خوبه

آفلاین احسان☺

  • Full Member
  • *
  • ارسال: 220
  • جنسیت : پسر
فعلا که هر دو نسخه پشتیبانی میشه و تفاوت زیادی هم ندارن.
نسخه دو منابع خوبی به زبان فارسی داره.;)
پ.ن:بهترین کار برای نصب،نصب از طریق مخازن نرم افزاری اوبونتو هستش.
« آخرین ویرایش: 29 امرداد 1393، 01:18 ب‌ظ توسط احسان☺ »

آفلاین مهیار پژوهان

  • Jr. Member
  • *
  • ارسال: 65
  • جنسیت : پسر
ممنون بابت راهنمایی.

بنظرتون ارزششو داره واسش وقت بزارم و یاد بگیرم یا یه زبان دیگه رو متمرکز بشم؟
سلام
بستگی به کاری که میخواید بکنید و دانش قبلیتون داره.اگه چیز زیادی از برنامه نویسی نمیدونید،پایتون میتونه گزینه ی خوبی باشه.

ممنون احسان جان
هم با راهنمایی شما و جستجوی بیشتر تویه نت متوجه شدم که پایتون گزینه خوبیه واسه شروع.
رفتم تویه سایتش که در موردش مطالعه کنم و دانلود کنم ولی ظاهرا دو تا نسخه داره. ۲ و ۳. همون ۳ رو بگیرم نصب کنم خوبه دیگه؟ فرق اساسی دارن این دوتا؟

اگه میخوای پایتون رو از صفر شروع کنی، من دارم توی تاپیک زیر از صفر آموزش می‌دم :

http://forum.ubuntu.ir/index.php/topic,98247.0.html

پیروز باشید

آفلاین سالار مقدم

  • عضو کاربران ایرانی اوبونتو
  • *
  • ارسال: 2074
  • جنسیت : پسر
  • هر چقدر بدونی بازم کمه.
    • سالار مقدم
بنظرتون ارزششو داره واسش وقت بزارم و یاد بگیرم یا یه زبان دیگه رو متمرکز بشم؟
شما همچین در آغاز کار هم نیستید! با توجه به سنتون (که میگید دانشگاه میرید) بهتره یک زبان رو انتخاب کنید و درش عمیق بشید، بهتره درباره ی زبان های برنامه نویسی تحقیق کنید. متعصب زیاد داریم، پس بهتره جست و جو کنید تا این که سوالتون رو تو انجمن ها بپرسید ... .

برای پیدا کردن زبان مورد نظرتون، فاکتور هاتون رو تعیین کنید و بعد دنبال زبان برنامه نویسی مورد علاقتون برید. فاکتور هایی مثل بازار کار، سرعت، کاربرد، هدف و ... .

این پیوند میتونه تو این مسیر خیلی کمکتون کنه.
زبان سی جایی استفاده میشه که سرعت مد نظر باشه مثل میکروکنترلر ها و هسته سیستم عامل ها
زبان سی کاربرد های خیلی خیلی بیشتری داره، مخصوصا تو برنامه نویسی شبکه( سوکت پروگرامینگ )
در ضمن فراموش نکنیم که زبان سی زبان پیشنهادی گنو هست ;)
https://www.gnu.org/prep/standards/standards.html#Source-Language
http://en.wikipedia.org/wiki/GNU_coding_standards
ممنون احسان جان
هم با راهنمایی شما و جستجوی بیشتر تویه نت متوجه شدم که پایتون گزینه خوبیه واسه شروع.
جست و جوی ده دقیقه ای! کمه :)
رفتم تویه سایتش که در موردش مطالعه کنم و دانلود کنم ولی ظاهرا دو تا نسخه داره. ۲ و ۳. همون ۳ رو بگیرم نصب کنم خوبه دیگه؟ فرق اساسی دارن این دوتا؟
ترجیح میدم از همون اول سه رو بخونم تا اینکه ۲ رو بخونم و بعد به ۳ مهاجرت کنم
دکتر علی شریعتی در وصف نسخه های پایتون :D (این جمله صرفا جهت طنز بود)

نکته: البته ممکنه شما بخواید از کتابخانه ای استفاده کنید که فقط با نسخه ی دو سازگاره.
« آخرین ویرایش: 29 امرداد 1393، 01:37 ب‌ظ توسط سالار مقدم »

آفلاین moghadam

  • Jr. Member
  • *
  • ارسال: 66
  • جنسیت : پسر
سلام
من پیشنهاد میکنم جاوا بخونی، جاوا زبان قابل حمل هست و شعار معروفی داره که میگه یه بار بنویس و همه جا استفاده کن، اگر هم مردد هستی میتونی در مورد جاوا بیشتر تحقیق کنی تا متوجه قدرت جاوا بشی
اگر تصمیم گرفتی جاوا بخونی من منابعش رو برات میفرستم