WorldSkills: Rückblick vom Teilnehmer der Olympiade


Hallo Habr!

Jeder Programmierer möchte seine Fähigkeiten verbessern und jedes Unternehmen möchte qualifizierte Spezialisten sehen, aber wie kann dies erreicht werden? Olympiaden kommen zur Rettung, in diesem Artikel geht es um die Teilnahme an einem von ihnen.

Rückzug


Der Artikel erwies sich als umfangreich, sodass sich der gesamte Code und die meisten Bilder unter den Spoilern befinden. Testen des Artikeleinreichungsformats. Wenn Ihnen dieses Format unangenehm erscheint, schreiben Sie bitte darüber. Außerdem sind alle Bilder anklickbar.

Über den Wettbewerb


WorldSkills ist ein Wettbewerb, dessen Ziel es ist, Fachleute in einem bestimmten Bereich zu identifizieren. Der Wettbewerb hat seine Wurzeln bei WorldSkills International (WSI), dem internationalen gemeinnützigen Verein.

Die Teilnahme am Wettbewerb ist kostenlos. Das Alter der Teilnehmer liegt zwischen 18 und 28 Jahren, Studenten an Hochschulen oder Universitäten.

Der Wettbewerb an der Universität dauert 5 Tage: am ersten Tag die Eröffnung und Überprüfung von Arbeitsplätzen, am letzten Tag drei Wettkampftage - Zusammenfassung und Abschluss.

Über Kompetenzauswahl und Training


Ich habe zufällig während eines der Übungen an der Universität im 2. Jahr von den Olympischen Spielen erfahren. Ich wurde eingeladen, an der Kompetenz „Entwicklung von Softwarelösungen für Unternehmen“ teilzunehmen. Um die Probleme zu lösen, waren Kenntnisse in C # oder Java, die Arbeit mit einer Datenbank und, wie ich bei den ersten Olympischen Spielen in Android herausgefunden habe, erforderlich. Die Eröffnung der Olympischen Spiele war für Anfang Juni geplant, und das Fenster war bereits Ende April. In diesem Moment wusste ich absolut nichts, was erforderlich war.

Meine Überraschung kannte keine Grenzen, als alle potenziellen Teilnehmer zum Training versammelt wurden. Es waren 7 Personen im Publikum, von denen 6 bereits Studenten im dritten Jahr waren, und ich war der siebte. Warum war ich so überrascht? Im dritten Jahr wird den Studenten ein Kurs über Datenbanken beigebracht, der zwei Semester dauert, was bedeutet, dass jeder mehr als ein Jahr Übung hatte. Ich wollte mich nicht weigern, also bat ich die Lehrer um Bücher in der Datenbank, fand einen C # -Kurs im Internet und begann mich vorzubereiten, wobei ich regelmäßig in Vorbereitungsklassen erschien.

Zwei Wochen vor Beginn der Olympiade haben wir erfahren, dass nicht mehr als drei Personen aus unserer Abteilung teilnehmen können. Hat die Qualifikationsrunde bestanden. In 1,5 Stunden mussten wir mit dem ER-Modell eine Datenbank im MSSQL-Datenbankverwaltungssystem erstellen, Daten aus einer Excel-Datei importieren und in der Anwendung anzeigen. Mit einem Wort, ich durfte von unserer Abteilung aus an der Olympiade teilnehmen.

Nun zum Wettbewerb


Der erste Tag des Wettbewerbs oder "C -1"


Die lang erwartete Entdeckung fand an diesem Tag statt. Alle Teilnehmer waren im Auditorium versammelt, wo sie über die Geschichte und Kompetenzen von WorldSkills berichteten und alle Experten mit den Teilnehmern vorstellten.
Nach dieser Zeremonie gingen alle zu ihren Standorten, um die Ausrüstung zu überprüfen. Es wurde ein „Widmungsritual“ abgehalten, bei dem wir unsere Jobs auswählten und aus Sicherheitsgründen unterschrieben. Zu diesem Zeitpunkt wusste ich nicht, was ich in der Software überprüfen konnte, also ging ich sofort nach der Auslosung, um mich auf den nächsten Tag vorzubereiten.

Der zweite Tag des Wettbewerbs oder der Beginn des Wettbewerbs


Was waren die Olympischen Spiele?

Für unsere Kompetenz mussten wir in 2 Tagen (drei für andere Kompetenzen) für 6 Stunden mit Pausen eine Client-Server-Anwendung in C # / Java mit Abfragen an die Datenbank schreiben. Genauer gesagt, "alles, was wir Zeit zum Schreiben haben", da das Prinzip der Olympiade lautet: "Tu, was du kannst und wie du kannst."

Experten zufolge waren die Kriterien mehrere zehn A4-Seiten. Die Kriterien werden erst nach dem Ende der Sitzung und nur an Experten ausgegeben, daher kann ich nichts dazu sagen.

Kommen wir zu den Ereignissen des zweiten Tages. Für die erste Sitzung musste Folgendes implementiert werden:

  • Erstellen Sie eine Datenbank mit einem bekannten ER-Diagramm
  • Importieren Sie Daten aus Excel-Dateien in die Datenbank
  • Erstellen Sie 4 Bildschirme für Layouts in der Präsentation

Und für die zweite bilden Sie weitere fünf Bildschirme für Layouts.

Kurz gesagt, alle Aufgaben wurden gelöst, mit Ausnahme der Anzeige von Bildern aus der Datenbank und der Erstellung einer benutzerdefinierten Liste von Elementen.

Ein paar Screenshots:




Über die Benutzeroberfläche können Sie Spieler nach Namen (auch nach dem ersten Buchstaben), Saison und Team suchen. Durch Doppelklicken auf ein nicht implementiertes Bild werden detaillierte Informationen zum Player geöffnet. Jetzt würde ich es über DataGridViewImageColumn implementieren.




Wie ich Bilder gespeichert habe
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]); } } } } 


Weitere Screenshots, Text und Code



Die Benutzeroberfläche ist der Hauptbildschirm, auf dem Sie die Rolle "Benutzer" oder "Administrator" auswählen und die besten Momente der Spiele sehen können. Wie man die Elemente in der Mitte platziert, konnte nicht gefunden werden.

Implementierung zum Hochladen von Bildern
 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; } } 





Eine Schnittstelle zur Autorisierung von technischen Administratoren und Match-Organisatoren, über die Sie sich den zuletzt eingegebenen Benutzernamen und das Kennwort merken können. In meinem Fall habe ich Daten ohne Verschlüsselung in eine Datei auf der Festplatte geschrieben.

Überprüfen der Existenz des eingegebenen Benutzernamens und Passworts in der Datenbank
  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; } 


Wenn Sie wissen, wie Sie die Daten am besten überprüfen können, schreiben Sie bitte in die Kommentare.




Und so sieht der unfertige Bildschirm aus, hier habe ich nur Komponenten entsprechend dem Layout auf das Formular geworfen. Können Sie mir bitte sagen, wie man eine solche benutzerdefinierte Liste in C # erstellt?




Der schwierigste Bildschirm für mich, da es Arbeiten mit Diagrammen gab, auf die ich mich nicht vorbereitete.

Der dritte Tag des Wettbewerbs oder ein unerwartetes Treffen mit Android


Der Vortag könnte im Vergleich zum dritten als Aufwärmphase angesehen werden. Bei 3 Sitzungen sollten weitere 8 Bildschirme gutgeschrieben werden. In der letzten Sitzung gab es eine Änderung der Pläne, und statt einer Präsentation des entwickelten Produkts haben wir begonnen, eine vereinfachte Version für Android zu erstellen. Eine Galerie mit Bildern, die aus der Datenbank hochgeladen wurden. Jetzt klingt es einfach, aber in diesem Moment war ich froh, dass die Sitzung 15 Minuten Zeit hatte, um auf das Internet zuzugreifen. In 3 Stunden wurde eine GridView mit Elementen in Form von ImageView erstellt, ein Array von ID-Bildern wurde an den Adapter übertragen und die OnItemClickListener-Oberfläche wurde neu definiert, um eine neue Aktivität mit einem Bild zu erstellen.

Noch ein paar Screenshots:




Benutzeroberfläche für den Administrator, über die Sie Informationen zu den Playern anzeigen können. Meiner Meinung nach der nutzloseste Bildschirm, da Sie keine Änderungen vornehmen können.

| | |

Meine "perfekte" Galerie in 3 Stunden über das Internet und ohne Programmierkenntnisse für Android.

Weitere Bilder, Text und Code.
Code zum Erstellen einer Galerie, wenn Sie nicht wissen, wie Sie mit der Datenbank arbeiten sollen
 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) } } 





Durch Klicken auf eine Saison (rechte Tabelle) werden detaillierte Informationen zu allen Spielen geöffnet.




Eine Schnittstelle für Administratoren, über die Sie Änderungen an der Befehlsliste vornehmen und Daten nach Excel exportieren können.

Wie ich Daten nach Excel exportiert habe
 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); } } 



Zusammenfassung


Um 12 Uhr fand eine Abschlussfeier statt, bei der alle Teilnehmer Zertifikate erhielten und Medaillen mit Diplomen auf Gewinner und Preisträger warteten. In unserer Kompetenz belegte ich den 2. Platz. Zwischen der Belohnung von Kompetenzen traten die Schüler mit Liedern und Tänzen auf.

Fazit


Während des Vorbereitungsmonats beherrschte ich die DDL- und DML-SQL-Teams, was die Arbeit an DB-Paaren im dritten Jahr erheblich vereinfachte. Die in C # und Windows Form erworbenen Kenntnisse lassen zu wünschen übrig, außer dass ich mit Datenbanken und der Benutzeroberfläche arbeiten musste und mit nichts arbeiten musste.

Dieses Jahr habe ich auch an der WorldSkills-Olympiade teilgenommen und den 1. Platz belegt, aber darüber, die komplizierten Aufgaben und die Folgen der Trennung des Internets auf den Websites im nächsten Artikel.

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


All Articles