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


مرحبا يا هبر!

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

تراجع


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

عن المسابقة


WorldSkills هي مسابقة هدفها تحديد المهنيين في مجال معين. تأخذ المنافسة جذورها مع WorldSkills International (WSI) ، وهي جمعية دولية لا تبغي الربح.

المشاركة في المسابقة مجانية. عمر المشاركين من 18 إلى 28 سنة ، طلاب في الكليات أو الجامعات.

تستمر المنافسة في الجامعة 5 أيام: في اليوم الأول ، يتم فتح الوظائف والتحقق منها ، ثم ثلاثة أيام من المنافسة ، في اليوم الأخير - التلخيص والإغلاق.

حول اختيار الكفاءات والتدريب


لقد تعلمت عن الألعاب الأولمبية بالصدفة خلال إحدى الممارسات في الجامعة في السنة الثانية. دعيت للمشاركة في اختصاص "تطوير حلول البرمجيات للأعمال". لحل المشكلات ، يلزم توفر المعرفة في C # أو Java ، باستخدام قاعدة بيانات ، وكما اكتشفت خلال أوليمبياد Android الأولى. كان من المقرر افتتاح الأولمبياد في أوائل يونيو ، وكانت النافذة بالفعل في نهاية أبريل. في تلك اللحظة ، لم أكن أعرف شيئًا على الإطلاق.

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

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

الآن عن المنافسة


في اليوم الأول من المسابقة أو "C -1"


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

اليوم الثاني من المسابقة أو بداية المسابقة


ماذا كانت الأولمبياد؟

من أجل كفاءتنا ، خلال يومين (ثلاثة للكفاءات الأخرى) ، لمدة 6 ساعات ، مع فترات راحة ، طُلب منا كتابة تطبيق خادم عميل في C # / Java مع استفسارات إلى قاعدة البيانات. بتعبير أدق ، أن نقول "كل ما لدينا وقت للكتابة" ، لأن مبدأ الأولمبياد هو "افعل ما تستطيع وكيف يمكنك.

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

دعنا ننتقل إلى أحداث اليوم الثاني. في الجلسة الأولى ، كان مطلوبًا تنفيذ ما يلي:

  • إنشاء قاعدة بيانات باستخدام مخطط ER معروف
  • استيراد البيانات من ملفات Excel إلى قاعدة البيانات
  • إنشاء 4 شاشات للتخطيطات في العرض التقديمي

وللثاني تشكل خمس شاشات أخرى للتخطيطات.

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

بعض لقطات الشاشة:




تتيح لك الواجهة العثور على لاعبين بالاسم (حتى الحرف الأول) والموسم والفريق. بالنقر المزدوج فوق صورة لم يتم تنفيذها ، يتم فتح معلومات مفصلة عن المشغل. الآن أود أن تنفيذه من خلال DataGridViewImageColumn.




كيف حفظت الصور
private void download_Click(object sender, EventArgs e) { SaveFileDialog saveFile = new SaveFileDialog(); saveFile.DefaultExt = ".jpg"; saveFile.AddExtension = true; //   - / saveFile.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.CommonPictures); saveFile.Filter = "Bitmap files (*.bmp)|*.bmp|Image files (*.jpg;*.png)|*.jpg;*.png"; if (saveFile.ShowDialog() == DialogResult.OK) { if (!saveFile.FileName.Equals("")) { String[] arr = saveFile.FileName.Split('.'); //       "\"  String filepath = arr[0].Substring(0, arr[0].LastIndexOf('\\') + 1); for (int i = 1; i <= imageList1.Images.Count; i++) { Image image = Image.FromFile("..\\Pictures\\" + (i + offset) + ".jpg"); image.Save(filepath + i + "." + arr[1]); } } } } 


المزيد من لقطات الشاشة والنص والرمز



الواجهة هي الشاشة الرئيسية ، مما يتيح لك تحديد دور "المستخدم" أو "المسؤول" ، وكذلك مشاهدة أفضل لحظات من المباريات. كيفية وضع العناصر في المركز لا يمكن العثور عليها.

تنفيذ تحميل الصور
 private int countImages() { sqlConnection = new SqlConnection(connectionString); using (sqlConnection) { sqlConnection.Open(); String sqlcomm = "SELECT Count(*) FROM [Pictures$]"; SqlCommand command = new SqlCommand(sqlcomm, sqlConnection); int result = (int)command.ExecuteScalar(); return result; } } private void loadPage() { sqlConnection = new SqlConnection(connectionString); using (sqlConnection) { sqlConnection.Open(); String sqlcomm = "SELECT [Img] , [CreateTime] FROM [Pictures] P" + " Order By P.CreateTime Desc" + " Offset @click Rows FETCH NEXT @svm ROWS ONLY"; SqlCommand cmd = new SqlCommand(sqlcomm, sqlConnection); cmd.Parameters.AddWithValue("@click", click); cmd.Parameters.AddWithValue("@svm", svm); dataAdapter.SelectCommand = cmd; DataSet data = new DataSet(); dataAdapter.Fill(data); imageList1.Images.Clear(); listView1.Clear(); for (int i = 0; i < data.Tables[0].Rows.Count; i++) { imageList1.Images.Add(Image.FromFile("..\\Pictures\\" + data.Tables[0].Rows[i].ItemArray[0].ToString())); } listView1.LargeImageList = imageList1; for (int i = 0; i < imageList1.Images.Count; i++) listView1.Items.Add("").ImageIndex = i; } } private void left_Click(object sender, EventArgs e) { if (click > 0) { if (!right.Enabled) { right.Enabled = true; } click -= svm; loadPage(); } else { left.Enabled = false; } } private void right_Click(object sender, EventArgs e) { if (click + svm < totalPhotos) { if (!left.Enabled) { left.Enabled = true; } click += svm; loadPage(); } else { right.Enabled = false; } } 





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

التحقق من وجود اسم المستخدم وكلمة المرور المدخلة في قاعدة البيانات
  private int checkData(string jobnumber, string password) { //  SQL-Injection     String sqlchecked = "if (Isnull((Select RoleId From Admin$ Where Jobnumber like(@Jobnumber) and Passwords like(@Password)) , 0) = 0)" + " Select 0 " + " else " + " Select RoleId From Admin$ Where Jobnumber like(@Jobnumber) and Passwords like(@Password)"; sqlConnection = new SqlConnection(connectionString); int result = 0; using (sqlConnection) { sqlConnection.Open(); SqlCommand command = new SqlCommand(sqlchecked, sqlConnection); //     command.Parameters.AddWithValue("@Jobnumber", jobnumber); command.Parameters.AddWithValue("@Password", password); //        result = (int)command.ExecuteScalar(); } return result; } 


إذا كنت تعرف أفضل طريقة للتحقق من البيانات ، يرجى كتابة التعليقات.




وهكذا تبدو الشاشة غير المكتملة ، وهنا ألقيت المكونات على النموذج وفقًا للتخطيط. هل يمكن أن تخبرني كيف أقوم بإنشاء قائمة مخصصة في C #؟




أصعب شاشة بالنسبة لي ، حيث كان هناك عمل مع المخططات التي لم أستعد لها.

اليوم الثالث من المسابقة أو لقاء غير متوقع مع Android


يمكن اعتبار اليوم السابق عملية احماء مقارنة باليوم الثالث. في 3 جلسات ، تم إضافة 8 شاشات أخرى. وفي الجلسة الأخيرة ، كان هناك تغيير في الخطط ، وبدلاً من عرض تقديمي حول المنتج المطور ، بدأنا في عمل نسخة مبسطة لنظام Android. وهي معرض مع الصور التي تم تحميلها من قاعدة البيانات. الآن يبدو الأمر سهلاً ، لكن في تلك اللحظة كنت سعيدًا لأن الجلسة مُنحت 15 دقيقة للوصول إلى الإنترنت. في 3 ساعات ، تم إنشاء GridView مع عناصر في شكل ImageView ، تم نقل مجموعة من صور المعرف إلى المحول ، وتمت إعادة تعريف واجهة OnItemClickListener لإنشاء نشاط جديد مع صورة.

بعض لقطات أكثر:




واجهة المسؤول ، مما يتيح لك عرض المعلومات على اللاعبين. الشاشة الأكثر فائدة ، في رأيي ، لأنه لا يمكنك إجراء تغييرات.

| | |

معرض "مثالي" الخاص بي خلال 3 ساعات باستخدام الإنترنت ودون مهارات البرمجة لنظام Android.

المزيد من الصور والنصوص والرمز.
رمز لإنشاء معرض عندما لا تعرف كيفية العمل مع قاعدة البيانات
 class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) setSupportActionBar(toolbar) // id  var images = ArrayList<Int>() images.add(R.drawable.a1) //... images.add(R.drawable.a12) listView.adapter = CustomAdapter(images.toTypedArray()) listView.onItemClickListener = AdapterView.OnItemClickListener { _: AdapterView<*>, _: View, i: Int, _: Long -> var intent = Intent(this, FullscreenActivity::class.java) // id ,    intent.putExtra("id",images[i]) startActivity(intent) } } } class CustomAdapter internal constructor(var images: Array<Int>) : BaseAdapter() { override fun getCount(): Int { return images.size } //    override fun getItem(position: Int): Int { return images[position] } // id   override fun getItemId(position: Int): Long { return position.toLong() } //   override fun getView(position: Int, convertView: View?, parent: ViewGroup): View { //    var view: View? = convertView // ,   if (view == null) { val inflater = LayoutInflater.from(parent.context) view = inflater.inflate(R.layout.item, parent, false) } view!!.findViewById<ImageView>(R.id.imageView).setImageResource(images[position]) return view } } class FullscreenActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_fullscreen) // id  var id = intent.getIntExtra("id",-1) imageView2.setImageResource(id) } } 





من خلال النقر على موسم (الجدول الأيمن) ، يتم فتح معلومات مفصلة عن جميع المباريات.




واجهة للمسؤولين تسمح لك بإجراء تغييرات على قائمة الأوامر وتصدير البيانات إلى Excel.

كيف قمت بتصدير البيانات إلى Excel
 private void exportExcel_Click(object sender, EventArgs e) { SaveFileDialog saveFileDialog = new SaveFileDialog(); saveFileDialog.Filter = "Excel (*.xls)|*.xls|All files (*.*)|*.*"; saveFileDialog.DefaultExt = ".xls"; if (saveFileDialog.ShowDialog() != DialogResult.OK) return; if (saveFileDialog.FileName.Equals("")) return; DataTable dt = (DataTable)dataGridView2.DataSource; //  StreamWriter wr = new StreamWriter(saveFileDialog.FileName); try { for (int i = 0; i < dt.Columns.Count; i++) { wr.Write(dt.Columns[i].ToString().ToUpper() + "\t"); } wr.WriteLine(); //    Excel for (int i = 0; i < (dt.Rows.Count); i++) { for (int j = 0; j < dt.Columns.Count; j++) { if (dt.Rows[i][j] != null) { wr.Write(Convert.ToString(dt.Rows[i][j]) + "\t"); } else { wr.Write("\t"); } } //    wr.WriteLine(); } //  wr.Close(); } catch (Exception ex) { MessageBox.Show(this, ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } } 



تلخيص


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

استنتاج


خلال شهر الإعداد ، أتقنت فرق DDL و DML SQL ، الأمر الذي سهّل إلى حد كبير العمل على أزواج DB في السنة الثالثة. المعرفة المكتسبة في C # و Windows Form يترك الكثير مما هو مرغوب فيه ، باستثناء العمل مع قواعد البيانات وواجهة المستخدم ، لم أكن مضطرًا للعمل مع أي شيء.

شاركت هذا العام أيضًا في أولمبياد WorldSkills وأخذت المركز الأول ، لكن عن هذا ، المهام المعقدة وعواقب قطع الاتصال بالإنترنت على المواقع في المقالة التالية.

Source: https://habr.com/ru/post/ar460819/


All Articles