WorldSkills: Ulasan dari peserta Olympiad


Halo, Habr!

Setiap programmer ingin memompa keterampilannya dan setiap perusahaan ingin melihat spesialis yang berkualitas, tetapi bagaimana cara mencapainya? Olimpiade datang untuk menyelamatkan, artikel ini akan membahas tentang partisipasi di salah satunya.

Mundur


Artikel itu ternyata sangat produktif, sehingga semua kode dan sebagian besar gambar berada di bawah spoiler. Masih menguji format pengiriman artikel. Jika format ini terasa tidak nyaman bagi Anda, silakan tulis tentang itu. Juga, semua gambar dapat diklik.

Tentang kontes


WorldSkills adalah kompetisi yang tujuannya untuk mengidentifikasi para profesional di bidang tertentu. Persaingan berakar dengan WorldSkills International (WSI), asosiasi nirlaba internasional.

Partisipasi dalam kompetisi ini gratis. Usia peserta adalah 18 hingga 28 tahun, pelajar di perguruan tinggi atau universitas.

Kompetisi di universitas berlangsung selama 5 hari: pada hari pertama, pembukaan dan verifikasi pekerjaan, kemudian tiga hari kompetisi, pada hari terakhir - menyimpulkan dan menutup.

Tentang pemilihan kompetensi dan pelatihan


Saya belajar tentang Olimpiade secara kebetulan selama salah satu praktik di universitas pada tahun ke-2. Saya diundang untuk berpartisipasi dalam kompetensi “Pengembangan solusi perangkat lunak untuk bisnis”. Untuk memecahkan masalah, diperlukan pengetahuan dalam C # atau Java, bekerja dengan basis data, dan seperti yang saya ketahui selama Olimpiade Android pertama, diperlukan. Pembukaan Olimpiade dijadwalkan awal Juni, dan jendelanya sudah akhir April. Pada saat itu saya sama sekali tidak tahu apa-apa yang diperlukan.

Kejutan saya tidak mengenal batas ketika semua calon peserta dikumpulkan untuk pelatihan. Ada 7 orang di antara hadirin, 6 di antaranya sudah siswa tahun ketiga, dan saya adalah yang ketujuh. Kenapa aku begitu terkejut? Pada tahun ketiga, siswa diajarkan kursus tentang Database, yang berlangsung selama 2 semester, yang berarti bahwa setiap orang memiliki lebih dari satu tahun latihan. Saya tidak ingin menolak, jadi saya meminta para guru untuk buku di database, menemukan kursus C # di Internet dan mulai mempersiapkan, secara berkala muncul di kelas persiapan.

Dua minggu sebelum dimulainya Olimpiade, kami mengetahui bahwa tidak lebih dari tiga orang dapat berpartisipasi dari departemen kami. Melewati babak kualifikasi. Dalam 1,5 jam kami harus membuat database dalam sistem manajemen basis data MSSQL menggunakan model ER, mengimpor data dari file Excel dan menunjukkannya di aplikasi. Singkatnya, saya diizinkan untuk berpartisipasi dalam Olimpiade dari departemen kami.

Sekarang tentang kompetisi


Hari pertama kompetisi atau "C -1"


Penemuan yang ditunggu-tunggu itu berlangsung pada hari ini. Semua peserta dikumpulkan di auditorium, di mana mereka bercerita tentang sejarah WorldSkills, kompetensi dan memperkenalkan semua ahli dengan para peserta.
Setelah upacara ini, semua orang pergi ke situs mereka untuk memeriksa peralatan. Sebuah "ritual pengabdian" diadakan, di mana kami memilih pekerjaan kami dan menandatangani untuk keselamatan. Pada saat itu, saya tidak tahu apa yang bisa saya periksa di perangkat lunak, jadi segera setelah undian saya pergi untuk mempersiapkan hari berikutnya.

Hari kedua kompetisi atau awal kompetisi


Apa itu Olimpiade?

Untuk kompetensi kami, dalam 2 hari (tiga untuk kompetensi lainnya), selama 6 jam, dengan istirahat, kami diminta untuk menulis aplikasi client-server di C # / Java dengan pertanyaan ke database. Lebih tepatnya, untuk mengatakan "semua yang kita punya waktu untuk menulis," karena prinsip Olimpiade adalah "lakukan apa yang kamu bisa dan bagaimana kamu bisa."

Menurut para ahli, kriterianya adalah beberapa puluh halaman A4. Kriteria dikeluarkan hanya setelah akhir sesi dan hanya untuk para ahli, jadi saya tidak bisa mengatakan apa-apa tentang mereka.

Mari kita beralih ke acara hari kedua. Untuk sesi pertama diperlukan untuk menerapkan hal berikut:

  • Buat database menggunakan diagram ER yang terkenal
  • Impor data dari file Excel ke database
  • Buat 4 layar untuk tata letak dalam presentasi

Dan untuk yang kedua buat lima layar lagi untuk tata letak.

Singkatnya, semua tugas diselesaikan, kecuali untuk menampilkan gambar dari database dan membuat daftar elemen kustom.

Beberapa tangkapan layar:




Antarmuka memungkinkan Anda menemukan pemain berdasarkan nama (bahkan huruf pertama), musim, dan tim. Dengan mengklik dua kali pada gambar yang belum diimplementasikan, informasi terperinci tentang pemain dibuka. Sekarang saya akan mengimplementasikannya melalui DataGridViewImageColumn.




Bagaimana saya menyimpan gambar
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]); } } } } 


Tangkapan layar lebih banyak, teks dan kode



Antarmuka adalah layar utama, yang memungkinkan Anda untuk memilih peran "Pengguna" atau "Administrator", serta menonton momen terbaik dari pertandingan. Bagaimana menempatkan elemen di tengah tidak dapat menemukan.

Implementasi unggahan gambar
 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; } } 





Antarmuka untuk otorisasi administrator teknis dan penyelenggara pertandingan, memungkinkan Anda untuk mengingat nama pengguna dan kata sandi yang dimasukkan terakhir. Dalam kasus saya, saya menulis data ke file di hard drive tanpa enkripsi.

Memeriksa keberadaan nama pengguna dan kata sandi yang dimasukkan dalam database
  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; } 


Jika Anda tahu cara terbaik untuk memverifikasi data, silakan tulis di komentar.




Dan ini adalah tampilan layar yang belum selesai, di sini saya hanya melemparkan komponen pada formulir sesuai dengan tata letak. Bisakah Anda memberi tahu saya cara membuat daftar khusus di C #?




Layar yang paling sulit bagi saya, karena ada pekerjaan dengan grafik yang saya tidak siapkan.

Hari ketiga kompetisi atau pertemuan tak terduga dengan Android


Hari sebelumnya bisa dianggap sebagai pemanasan dibandingkan dengan yang ketiga. Pada 3 sesi, 8 layar lainnya akan dikreditkan. Dan pada sesi terakhir, ada perubahan rencana, dan alih-alih presentasi tentang produk yang dikembangkan, kami mulai membuat versi yang disederhanakan untuk Android. Yaitu, galeri dengan gambar yang diunggah dari database. Sekarang kedengarannya mudah, tetapi pada saat itu saya senang bahwa sesi diberikan 15 menit untuk mengakses Internet. Dalam 3 jam, GridView dibuat dengan elemen dalam bentuk ImageView, array gambar id ditransfer ke Adaptor, dan antarmuka OnItemClickListener didefinisikan ulang untuk membuat Kegiatan baru dengan gambar.

Beberapa tangkapan layar lainnya:




Antarmuka untuk administrator, memungkinkan Anda untuk melihat informasi tentang pemain. Layar yang paling tidak berguna, menurut saya, karena Anda tidak dapat melakukan perubahan.

| | |

Galeri "sempurna" saya dalam 3 jam menggunakan Internet dan tanpa keterampilan pemrograman untuk Android.

Lebih banyak gambar, teks, dan kode.
Kode untuk membuat galeri saat Anda tidak tahu cara bekerja dengan database
 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) } } 





Dengan mengklik pada musim (tabel kanan), informasi terperinci tentang semua pertandingan terbuka.




Antarmuka untuk administrator yang memungkinkan Anda untuk membuat perubahan pada daftar perintah dan mengekspor data ke Excel.

Bagaimana saya mengekspor data ke 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); } } 



Ringkasan


Pada pukul 12 siang, upacara penutupan berlangsung, di mana semua peserta diberikan sertifikat, dan medali dengan diploma menunggu pemenang dan pemenang hadiah. Dalam kompetensi kami, saya mengambil tempat kedua. Di antara penghargaan kompetensi, siswa tampil dengan lagu dan tarian.

Kesimpulan


Selama bulan persiapan, saya menguasai tim DDL dan DML SQL, yang sangat menyederhanakan pekerjaan pada pasangan DB di tahun ketiga. Pengetahuan yang diperoleh dalam C # dan Windows Form menyisakan banyak yang diinginkan, kecuali untuk bekerja dengan database dan antarmuka pengguna, saya tidak harus bekerja dengan apa pun.

Tahun ini saya juga mengambil bagian dalam Olimpiade WorldSkills dan menempati posisi pertama, tetapi tentang ini, tugas-tugas rumit dan konsekuensi dari memutuskan koneksi Internet di situs-situs pada artikel berikutnya.

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


All Articles