اذهب إلى المحتوى

E.Nourddine

الأعضاء
  • المساهمات

    1458
  • تاريخ الانضمام

  • تاريخ آخر زيارة

  • عدد الأيام التي تصدر بها

    18

كل منشورات العضو E.Nourddine

  1. الحل هو باستعمال DNSCrypt، فهو برنامج حر مفتوح المصدر من طرف OpenDNS وظيفته هي تشفير جميع اتصالات DNS عبر SSL. لتثبيت DNSCrypt على Ubuntu نفتح الطرفية ونشغّل الأوامر التالية اتباعاً: sudo add-apt-repository ppa:shnatsel/dnscrypt sudo apt-get update sudo apt-get install dnscrypt-proxyمن خلال قائمة الشبكة اختر Edit Connections كما هو موضح في الصورة: ستظهر نافذة أخرى، عيّن شبكتك الحالية ثم اضعط Edit: ثم أدخل المعطيات كما في الصورة: وفي الأخير احفظ التعديلات بالضغط على الزر save. https://www.maketecheasier.com/encrypt-dns-traffic-ubuntu/
  2. أولا عليك بتثبيت Mysql5: apt-get install mysql-server mysql-clientأثناء التثبيت ستُسأل عن كلمة المرور، أَدخل كلمة مرور وتذكرها جيدا. ثم تثبيت Apache2: apt-get install apache2 بعد انتهاء العملية، تفحص العنوان http://192.168.0.100 على المتصفح لتظهر لك رسالة !It Works بعد ذلك تثبيت PHP5: apt-get install php5 libapache2-mod-php5 وعند الانتهاء نعيد تشغيل apache2: /etc/init.d/apache2 restart Installing Apache2 With PHP5 And MySQL Support On Debian Wheezy
  3. لتثبيت لوحة Cpanel على خادم يعمل على Ubuntu ،اتبع الخطوات التالية: yum install perl cd /home wget -N http://httpupdate.cpanel.net/latest sh latest /usr/local/cpanel/cpkeycltالتثبيت سيأخذ حوالي ساعة من الوقت لذا تحلّ بالصبر أثناء العملية. هذا الفيديو يوضح لك العملية جيداّ:
  4. نعم الأمر git-rm مخصص لإزالة الملفات الموجودة بـ مجلد get index ، لكن المشكل أن الملفات المزالة لن تٌمسح بشكل صحيح حيث سيبقى أثرها في الفرعbrache الحالي، لذا فالحل هو بإضافةخاصية للأمر git-rm ، أي cached-- للقيام بمسح الملف بالطريقة الصحيحة، أي أن الأمر سيصبح كالتالي: git rm --cached notes.txtكما أن cached-- تزيل اي أثرٍ للملفات المزالة. يمكن للأمر git-rm أخذ الخاصيات التالية : --force --dry-run --cached --ignore-unmatch --quiet المصدر: https://git-scm.com/docs/git-rm
  5. هذا مثال عن أداة TreeView على تطبيق Android باستعمال لغة Java ،يمكّنك من انشاء أي عدد من مستويات التفرع بالإضافة إلى أنه في متناول أي مبرمج Android على لغة Java : صورة توضيحية للنتيجة: عدل على الكود التالي حتي يتوافق واحتياجاتك: package de.supinfo.FISDroid; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Color; import android.graphics.drawable.PaintDrawable; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.View.OnClickListener; import android.widget.BaseAdapter; import android.widget.Button; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; public class EfficientAdapter extends BaseAdapter { private LayoutInflater mInflater; private Bitmap mIcon1; private int active_view; private int last_path; public String[][] values = new String[0][]; public EfficientAdapter(Context context, String[][] str_arr_values, int int_active_view) { // Cache the LayoutInflate to avoid asking for a new one each time. mInflater = LayoutInflater.from(context); values = str_arr_values; active_view = int_active_view; } public Object getItem(int position) { return position; } public long getItemId(int position) { return position; } public View getView(int position, View convertView, ViewGroup parent) { int padding = 0; // int selfstate = Integer.parseInt(values[position][4].trim()); ViewHolder holder; if (convertView == null) { convertView = mInflater.inflate(R.xml.list_item_icon_text, null); holder = new ViewHolder(); holder.text = (TextView) convertView.findViewById(R.id.text_view); holder.icon = (ImageView) convertView.findViewById(R.id.img_view); holder.expanded = (ImageView) convertView.findViewById(R.id.ImageView01); holder.llout = (LinearLayout) convertView.findViewById(R.id.list_item_icon_text); holder.docs = (TextView) convertView.findViewById(R.id.doc_count); holder.prun = (ImageView) convertView.findViewById(R.id.prun); holder.coord = (ImageView) convertView.findViewById(R.id.coord); holder.button = (Button) convertView.findViewById(R.id.button); holder.button.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { main.tabHost.setCurrentTab(2); } }); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } // Bind the data efficiently with the holder. String text = values[position][0]; String docs = values[position][11]; if (!docs.equals("0")) { // TODO // Anzeige das Dokumente vorhanden sind, eventuell Anzahl holder.docs.setText(docs); holder.docs.setVisibility(View.VISIBLE); } else { holder.docs.setVisibility(View.INVISIBLE); } holder.coord.setVisibility(values[position][12].equals("") || values[position][12].equals("0") || values[position][12].equals("0.0") ? View.INVISIBLE : View.VISIBLE); holder.prun.setVisibility(values[position][14].equals("") ? View.INVISIBLE : View.VISIBLE); holder.text.setText(text); holder.text.setTextSize(GlobalVars.Style.TextSize); if (position == active_view) { holder.text.setTextColor(R.color.headline_font); PaintDrawable pd = new PaintDrawable(Color.RED); holder.llout.setBackgroundDrawable(pd); holder.text.setSingleLine(false); holder.button.setVisibility(values[position][1].equals("-1") ? View.GONE : View.VISIBLE); } else { holder.text.setTextColor(R.color.headline_font); PaintDrawable pd = new PaintDrawable(Color.TRANSPARENT); holder.llout.setBackgroundDrawable(pd); holder.text.setSingleLine(true); holder.button.setVisibility(View.GONE); } int i = Integer.parseInt(values[position][5].trim()); mIcon1 = GlobalHelper.GetIcon(i); holder.icon.setImageBitmap(mIcon1); if (values[position][8].equals("-1")) { holder.expanded.setVisibility(View.VISIBLE); holder.expanded.setImageResource(android.R.drawable.ic_input_add); } else if (values[position][8].equals("0")) { holder.expanded.setVisibility(View.INVISIBLE); } else if (values[position][8].equals("1")) { holder.expanded.setVisibility(View.VISIBLE); if (values[position][9].equals("1")) { holder.expanded.setImageResource(android.R.drawable.ic_menu_revert); } else { holder.expanded.setImageResource(android.R.drawable.ic_input_add); } } padding = Integer.parseInt(values[position][7].trim()) * 24; convertView.setPadding(padding, 5, 5, 5); return convertView; } static class ViewHolder { LinearLayout llout; TextView text; ImageView icon; ImageView expanded; ImageView coord; ImageView prun; TextView docs; Button button; } @Override public int getCount() { // TODO Auto-generated method stub return values.length; } public String[] getValues(int position) { return values[position]; } public String getValue(int position) { return values[position][0]; } public String getDatid(int position) { return values[position][1]; } public String getPath(int position) { return values[position][2]; } public String getParent(int position) { return values[position][3]; } public void set_active_view() { active_view = GlobalVars.cn.index; } public int get_active_view() { return active_view; } public void set_last_path(int position) { last_path = position; } public int get_last_path() { return last_path; } }في ملف XML الخاص بالواجهة أضف مايلي: <?xml version="1.0" encoding="utf-8"?> <LinearLayout android:id="@+id/list_item_icon_text" xmlns:android="http://schemas.android.com/apk/res/android" android:layout_height="wrap_content" android:layout_centerVertical="true" android:background="@color/tree_normal_back" android:padding="1dip" android:orientation="horizontal" android:layout_width="fill_parent"> <LinearLayout android:id="@+id/plusminus" android:layout_height="48dip" android:layout_width="24dip" android:gravity="right|center_vertical"> <ImageView android:id="@+id/ImageView01" android:layout_height="24dip" android:layout_width="24dip"/> </LinearLayout> <LinearLayout android:id="@+id/LinearLayout01" android:layout_height="48dip" android:layout_width="48dip" android:orientation="horizontal" android:paddingLeft="4dip"> <LinearLayout android:id="@+id/LinearLayout02" android:layout_height="48dip" android:orientation="vertical" android:layout_width="16dip"> <TextView android:text="0" android:id="@+id/doc_count" android:textColorHighlight="@color/headline_font" android:layout_gravity="center_vertical" android:textColor="@color/black" android:textSize="12dip" android:layout_margin="0dip" android:padding="0dip" android:paddingTop="0dip" android:gravity="center_vertical|center_horizontal" android:background="@drawable/ico_24_paperclip" android:textStyle="normal" android:layout_height="16dip" android:layout_width="16dip"> </TextView> <ImageView android:id="@+id/prun" android:layout_gravity="center_vertical" android:layout_height="16dip" android:layout_width="16dip" android:background="@drawable/ico_24_prun"/> <ImageView android:id="@+id/coord" android:layout_gravity="center_vertical" android:layout_height="16dip" android:layout_width="16dip" android:background="@drawable/ico_24_coord"/> </LinearLayout> <ImageView android:id="@+id/img_view" android:layout_gravity="center_vertical" android:layout_height="24dip" android:layout_width="24dip" /> </LinearLayout> <Button android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/tabs_edit" android:focusable="false" android:visibility="gone"> </Button> <TextView android:layout_gravity="center_vertical" android:padding="2dip" android:marqueeRepeatLimit="2" android:layout_width="wrap_content" android:textSize="22dip" android:textColor="@color/tree_normal_font" android:id="@+id/text_view" android:layout_height="wrap_content"> </TextView> </LinearLayout>كما يمكنك الإستفادة من الموقع الرسمي لبرمجة تطبيقات Android الخاص بهذه الأداة: https://code.google.com/p/tree-view-list-android/
  6. توفّر Asp.net العديد من أدوات التحقق، والغرض منها ضبط الأدوات والتحقق من مدخلات المستخدم حتى تتوافق مع الشروط الأساسية للمتغيرات، مثلا قيمة تاريخ الازدياد يجب أن تكون من نوع تاريخ، الاسم يجب أن يكون من نوع نصي وهكذا... بالنسبة للأداة RangeValidator فالغرض منها التحقق من أن القيمة المدخلة واقعة بين قيمتين، قيمة قصوى MaximumValue و قيمة دنيا MinimumValue. تتميز أداة RangeValue بخاصية ControlToValidate وتحتوي الحقل الذي نريد التحقق من قيمته، و خاصية ErrorMessage وتعيّن من خلالها الرسالة التي ستظهر في حالة إدخال قيمة خارج MaximumValue و MinimumValue. وهذا مثال تطبيقي عن ما سبق ذكره: <asp:RequiredFieldValidator ID="rfvcandidate" runat="server" ControlToValidate ="ddlcandidate" 'controleToValidate الحقل المتحقق من قيمته ErrorMessage="Please choose a candidate" 'ErrorMessage رسالة الخطأ InitialValue="Please choose a candidate"> 'InitialValue القيمة الإفتراضية للحقل </asp:RequiredFieldValidator>مصادر: ASP.NET - Validators Validation - RangeValidator
  7. نعم بالتأكيد يمكنك فعل ذلك، فقط أنشئ سكربت لتفعيل SSH و آخر لإيقافه، مثال: /etc/init.d/ssh stopوَ: /etc/init.d/ssh startمع تعيين وقت تشغيل كل منهما في crontab. لكن أنصحك برؤية كل من fail2ban و portknocking لتفادي استعمال كلمة المرور واسم المستخدم والاقتصار فقط على ssh key . أيضا لتكون الطريقة أكثر أمنا : Two-Factor-Authentication with SSH OTPW – A one-time password login package
  8. في أطر العمل مثل laravel,symfony... وغيرها، عادة ماتكون بيئة موفرة لهذا الغرض، أي لربط الإتصال بقاعدة البيانات وكل ما يتعلق بها من علاقات بين الجداول وأسماء الحقول وكذا إنشاء القاعدة بشكل أوتوماتيكي.. وعلى سبيل المثال، هذا الكود لربط جدول users بـ contactsوorders: DB::table('users') ->join('contacts', 'users.id', '=', 'contacts.user_id') ->join('orders', 'users.id', '=', 'orders.user_id') ->select('users.id', 'contacts.phone', 'orders.price') ->get();مع تحديد اسم الحقل الذي يعتبر كمرجع للربط بين الجدولين، بل هناك أكثر من ذلك، توفِّره laravel مع QueryBuilder. و يمكنك التعمق في الموضوع أكثر من خلال: how to use join on more thane 3 table using Eloquent / Convert the above query
  9. عليك استعمال Continue والتي من شأنها تخطي الحلقة الحالية و المرور على الفور إلى الحلقة القادمة -التالية- دون تطبيق الكود البرمجي بعدها اي أنها تقفز هذا الكود ولا تعتبره بتاتا. في حالتنا هذه سيكون الكود البرمجي كالتالي: For Each I As Item In Items If I = x Then Continue For 'إذا تحقق الشرط فإن الكود الذي يلي هذا السطر لن يتحقق في هذه الحلقة ويمر غلى الحلقة القادمة 'If كود برمجي سيتحقق في جميع الحلقات ماعدا تلك التي يتحقق فيها شرط Nextمصادر : 1 2 3
  10. String.Format هي بالأساس لعمل دمج Concatenation لعدة متغيرات داخل قطعة نصية لكن بشكل احترافي اكثر، فعِوض استعمال الرمز & بين المتغير وجزء من النص، جاءت فكرة String.Format لتفادي الكود غير المنظم وأريحية المبرمج، وهذا تطبيق لها: string s = string.Format("Hey, {0} it is the {1}st day of {2}. I feel {3}!", _name, _day, _month, _feeling);حيث المتغيرات : _name, _day, _month, _feelingتحل مكان القيم الرقمية {0},{1}... بخلاف الطريقة التقليدية والتي من الممكن أن تربك المبرمج في حالة كانت المتغيرات كثيرة تكون أكثر تعقيدا، وهذا مثال : string s = "Hey," + _name + " it is the " + _day + "st day of " + _month + ". I feel " + feeling + "!"; المصدر
  11. مبدأيًا الكائن foo يوجد ضمن مجاله الدالة وبالتالي فالدالة hide ستطبق عليها لأنه وبكل بساطة سيتعرف عليها إذ استخدمت داخل نطاقه ولن تعتبر النافذة هي this في هذه الحالة. أيضا استعمل الكلمة var لتعريف متغير فيصبح تعريفك للوسم بهذه الطريقة : var div_element = document.createElement('div'); ليكون الكود البرمجي بشكل صحيح هو: function Foo() { var div_element = document.createElement('div'); this.hide = function() { div_element.style.display = 'none'; } // زر الإخفاء var btn = document.createElement('input'); btn.type = 'button'; btn.value = 'Hide'; btn.onclick = this.hide; // إضافة الزر إلى الوسم div_element.appendChild(btn); // إضافة الكل إلى الصفحة document.body.insertBefore(div_element, null); } foo = new Foo();
  12. تتوفر php على دوال مهمة، يمكن للمبرمج الاستعانة بها أثناء برمجته، من بينها دالة rray_multisort التي تقوم بترتيب مصفوفات ذات أبعاد بسلاسة. جرب هذا الكود سيفيدك: foreach ($mdarray as $key => $row) { // يمكنك تعويض القيمة 0 برقن ترتيب الخات التي تريد الترتيب حسبها $dates[$key] = $row[0]; } array_multisort($dates, SORT_DESC, $mdarray);// ٍSORT_DESC لترتيب القيم تنازليا للترتيب تصاعديا استعمل SORT_ASC
  13. يكمن المشكل في استعمالك ل (') Single quoted string في حين أنه باستعماله لا يمكن أن تظهر وظيفة: \ r \ nالحل في استعمال double quoted string (") في الجانبي، هكذا: "\ r \ n"كما يمكنك استعمال الدالة chr وذلك بإعطائها القيمتين التاليتين: chr(0x0D).chr(0x0A) // تمثل إنشاء سطر جديدمصادر: 1 2 3
  14. لغة JavaScript لا تتوفر على دالة بنفس الوظيفة، لكن يمكننا كتابة دالة لذات الغرض : function arrayCompare(a1, a2) { if (a1.length != a2.length) return false; var length = a2.length; for (var i = 0; i < length; i++) { if (a1[i] !== a2[i]) return false; } return true; } function inArray(needle, haystack) { var length = haystack.length; for(var i = 0; i < length; i++) { if(typeof haystack[i] == 'object') { if(arrayCompare(haystack[i], needle)) return true; } else { if(haystack[i] == needle) return true; } } return false; }حيث تقوم الدالة الأولى arrayCompare بمقارنة طول المصفوفتين، وفي حالة كانا مختلفين ترجع القيمة false. الدالة الثانية، تقوم بمقارنة كل قيمة من المصفوفة الأول وَ مثيلتها من المصفوفة الثانية، وعند تطابق قيمتين تعيد القيمة true أو القيمة false في خلاف ذلك.
  15. لتعريف قالب الصفحة أو القالب الأساسي، استعمل : @extends('master') كما بالإمكان استعمال أي قالب، فقط يجب تحديد مساره الصحيح، وكمثال على ذلك : @extends('my.long.path.to.template') حيث النقطة "." تعني الانتقال من مجلد لآخر، أو بمعنى آخر في المثال السابق سيكون مسار الملف هو: /views/my/long/path/to/template.blade.php نعم يمكن إدراج الملف في مجلد آخر بشرط أن يكون مسار تعيينه مساراً صحيحاً.
  16. حفظ الصور لهذا الغرض يقضي بتصديرها إلى صيغة - png.- ،ولفعل ذلك على Photoshop يكفي: عين طبقة الصورة من خلال نافذة الطبقات على الجانب الأيمن للبرنامج.اضغط على الاختصار Ctrl + Shift +Alt +Sستفتح نافذة منبثقة لحفظ الصورة.اختر PNG 24 من خلال القائمة المنسدلة.تأكد من تفعيل خاصية الشفافية transparency.اضغط save لحفظ الصورة.ملاحظة مهمة: PNG 24 تختلف عن باقي صيغ PNG لأنها الوحيدة التي توفر شفافية الصور. المصدر
  17. من الجيد ما تود القيام به وأشدّد على ساعدك لإتمامه، لكن للتميز، أريدك أن تجيب عن عدة أسئلة، وإجابتك عنها كفيلة بإنارة الطريق لك: لن أسألك عن نوع الخدمة وماهيتها، لكن هل تستهدف شريحة معينة من الناس أو لا؟ هل درست مدى حاجة هذه الفئة لخدماتك؟هل أنت مستعد للعمل إلى ساعات متأخرة من الليل وبشكل مستمر؟هل رؤيتك واضحة؟ إذا لم تكن كذلك أنصحك بتحديد أهدافك وضع لها مدة زمنية تقيس فيها مدى تقدمك نحو النجاح.ما مدى معرفتك بالشركات المنافسة لك؟ هل درست المنتجات المنافسة؟هل منتجك متميز؟ مُبتكر؟ مُخترع؟ أو بصيغة أخرى ما هو الشيء الذي سيدفعني كزبون لاقتناء منتجك عوض منتج آخر؟ألا تعتقد أن منتجك به عيوب؟ ما منهجيتك من أجل تجاوز هذه العيوب؟كم هي ميزانية المشروع؟كيف يمكن للمشروع البقاء في السوق رغم ندرة المداخيل إن لم نقل انعدامها؟التميز ليست وصفة سحرية، باختصار الشغف بالشيء والإيمان به، ثم التفاني في إنجاحه.
  18. لا يمكنك جلب المعلومات مباشرة من DataTable بل عليك أولًا الولوج إلى خاصية AsEnumerable ثم بعد ذلك استخرج محتوى الخانة المعنية بالأمر، بهذه الطريقة: var results = from myRow in myDataTable.AsEnumerable() where myRow.Field<int>("RowNo") == 1 select myRow;للعلم فقط AsEnumerable تُعيد متغير من نوع IEnumerable<DataRow> أي محتوى عمود من أعمدة الجدول. رابط التوثيق الموقع الرسمي.
  19. Zend Registry : كما يوضح الاسم فهو مستودع تُعرَّف في متغيرات - كالمتغيرات المعرفّة على لغة php- ثم تُستعمل فيما بعد في أي مكان من المشروع سواء Controllers,vue, model الخ وفي أي وقت احتجنا إليه. Zend Cache :يستعمل للرفع من مردودية وتحسين أداء التطبيق. الفرق بينهما : Zend Registry :القيمة تؤخذ من الصفحة المفعلة حاليا، وتندثر عند انتهاء العملية الحاليّة. Zend Cache : القيمة المهيئة للاستعمال المقبل، ولا تندثر إلا عند انتهاء العملية الحالية، مع العلم أن القيمة تُخزّن في ملف نصي. رابط
  20. لا أنصح بفعل ذلك لعدة أسباب: الأنظمة البنكية تخصص ميزات لأصحاب الشركات: من الأمور المتعارف عليها أن البنوك تقدم امتيازات لرائدي الأعمال لا يحصل عليها الزبائن العاديين، وفرضا أنك بحاجة إلى قرض هل وضعيتك كشركة هي نفسها كمستخدم عادي؟ بالطيع لا فالبنوك وكسياسة تنهجها تشجع المشاريع والاستثمار أكثر من وضع المال في خزائنها.لا تخلط بين الشركة والحياة الشخصية: بعد 5 سنوات من اليوم وبعد أن تصبح شركة كبيرة وناجحة، ستضطر لا محالة لفصل حساب الشركة عن الحساب الشخصي، أليس الأجدر بك فعل ذلك من الآن حتى تعرف قيمة الأرباح بدقة تامّة؟دخول شركاء آخرين معك في الشركة أمر محتمل في أي لحظة، وهذا لن يتأتى وأنت بحساب مصرفي مشترك بين الشركة التي هي معنوي- مجموعة أوراق وبنود- وأنت .الأمر لا يستحق كل هذا التفكير، فقط لا تخلط عليك الأمور.
  21. لا جدال أن الدعم الفني أحد أهم أسباب نجاح المواقع التفاعلية التي يتم التفاعل خلالها بين المستخدم ومسيّر الموقع، وقد يؤدي الإفراط في إهمال هذه الخدمة إلى عواقب وخيمة أبسطها فقدان المستخدمين، خصص ساعة أو ساعتين من كل يوم من أجل ذلك، كما يمكنك أيضًا تقسيم الساعتين واحدة صباحا والأخرى مساءً، وللتذكير فقط الدعم الفني يقصد به فريق تقني يسهر على تلبية طلبات المستخدمين وحل مشاكلهم، أي تواجدهم الدائم في غاية الأهمية، وأنصحك بتدبر الأمر في القريب العاجل، فغيابك الطويل في غير صالحك خاصة إذا كان المشكل ذو أهمية كبيرة. مسألة أخرى يلجأ إليها البعض وهي توفير ردود جاهزة وقابلة للتغيير، وكما تعلم للمستخدم نظرة ثاقبة ولا يقبل بمثل هذه الأمور التي قد تشعره بالتقليل من قيمته وعدم التفرغ لمشكلته. كوسيلة لحل الأمر مرحليا، قم بتفقد الرسائل باستمرار، وأجّل تلك التي من الممكن تأجيلها، أي المشاكل العادية، على أن تردّ على الرسائل المستعجلة والأكثر أهمية في وقت سريع، واجعل هذه الرسائل تأتيكَ على بريدك الإلكتروني على أن تكون متصلًا به على الدوام بأحد البرامج. للتوسع في الموضوع أكثر: 7 نقاط للتعامل السليم مع تذاكر الدعم الفني كيفية تنظيم خدمة العملاء على وسائل التواصل الاجتماعي
  22. الأمر يحتاج إلى وقت وإلى ترتيبات مهمة وتريث: - استغل مواقع التواصل الاجتماعي في نشر الحدث، وكفكرة جيدة قبل الافتتاح ادعوا أصدقائك والعائلة إلى لقاء أو احتفال تشرح لهم الفكرة وتطلعهم على الأمر، ثم تدعوهم إلى دعوة أصدقائهم للحدث عبر موقع فيسبوك، وبالتالي يكبر عدد المشتركين في الحدث تدريجيا. - من الجيد أيضا إنشاء صفحة خاصة بالمدونة، تنشر فيها باستمرار الجديد والتقاط صور معبرة تعكس تقدم المشروع، وتشاطر المتتبع أهم المراحل، وكملاحظة الناس تواقة إلى عيش الحدث لحظة بلحظة لذا حاول قدر الإمكان وضعهم في الصورة وخلق قيمة لما تصنع. - موقع انستغرام هو موقع مخصص للصور ومن الجيد أن تنشئ حسابا هناك وتنشر الصور التي تحدثنا عنها مسبقا، وذلك حتى تستهدف مستخدمي هذه المنصة أيضا. - اختر شعارا لافتا للنظر ومشوقا في نفس الوقت، حتى تطرح تساؤلات وشغف لدى الآخر. - وفر محتوى قيّم في المدونة، ولا تجعها عادية. - إذا كان لديك بعض المال يمكنك استخدام فيسبوك من أجل هذا الإعلانات، ويمكنك تعيين الفئة المستهدفة من إعلاناتك. استفد من هذا لماذا يجب عليك استخدام شبكات التواصل الاجتماعي حتى إذا لم تكُن تؤمن بجدواها؟
  23. في migration على rails 4.2 يجب تعيين references أي الجدول المرجع لل foreign Key، حيث سيكون الكود كالتالي: class CreateTaskLists < ActiveRecord::Migration def change create_table :task_lists do |t| t.string :name t.references :user, index: true t.timestamps end add_foreign_key :task_lists, :users end endمصدر للاستفادة أكثر
  24. إليك الخطوات : أنشئ مجلد باسم vpn.configانسخ ملف client.ovpn في المجلد الجديد.افتح ملف client.opvn و افتح ملف جديد.قص السطور الموجودة بين الوسم <ca>انسخها في الملف الجديد واحفظها تحت اسم ca.crt.أزل الوسم <ca> من ملف client.ovpnافتح ملف آخر.قص الأسطر بين الوسم <cert> في الملف client.ovpnألصقه في الملف الجديد واحفظه تحت اسم client.crtأزل الوسم <cert> من داخل client.ovpnافتح ملف جديد - وسيكون هذا الأخير -قم بقص الأسطر بين الوسم <tls-auth> من client.ovpnألصقها في الملف الجديد، واحفظها تحت اسم ta.keyأزل <tls-auth> من ملف client.ovpnثم أزل هذا السطر: key-direction 1 احفظ جميع الملفات وأغلقها. اذهب إلى : Network Manager -> Edit Connections ->VPNاضغط import ثم تصفح لتغيير client.ovpn إلى الملف المنشأ حديثا. أدخل اسم المستخدم وكلمة المرور الخاصة بـ vpn احفظ التغيرات.
  25. Rails بالأساس يُوفر لك تمرير البيانات عبر المتغيّر data : = link_to body, url, :data => { :foo => 'bar', :this => 'that' } حيث foo هو اسم المتغير الحامل للقيمة bar. في الإصدار الرابع من Rails يمكن استعمال الطريقة التالية: :data => { :foo_bar => 'that' } أو بتمريرها مباشرة: = link_to body, url, :'data-foo' => 'bar', :'data-this' => 'that' لمعرفة المزيد الرابط حول الموضوع.
×
×
  • أضف...