Hola Habr!
Cada programador quiere aumentar sus habilidades y cada empresa quiere ver especialistas calificados, pero ¿cómo lograrlo? Las olimpiadas vienen al rescate, este artículo tratará sobre la participación en una de ellas.
Retiro
El artículo resultó ser voluminoso, por lo que todo el código y la mayoría de las imágenes están bajo los spoilers. Todavía estoy probando el formato de envío del artículo. Si este formato le resulta incómodo, escríbalo. Además, todas las imágenes son clicables.
Sobre el concurso
WorldSkills es una competencia cuyo objetivo es identificar profesionales en un campo específico. La competencia tiene sus raíces en WorldSkills International (WSI), la asociación internacional sin fines de lucro.
La participación en el concurso es gratuita. La edad de los participantes es de 18 a 28 años, estudiantes en colegios o universidades.
La competencia en la universidad dura 5 días: el primer día, la apertura y verificación de puestos de trabajo, luego tres días de competencia, el último día, resumiendo y cerrando.
Sobre selección de competencias y capacitación
Aprendí sobre los Juegos Olímpicos por casualidad durante una de las prácticas en la universidad en el segundo año. Fui invitado a participar en la competencia "Desarrollo de soluciones de software para empresas". Para resolver los problemas, se requería conocimiento en C # o Java, trabajar con una base de datos y, como descubrí durante las primeras Olimpiadas de Android. La apertura de los Juegos Olímpicos estaba programada para principios de junio, y la ventana ya era a fines de abril. En ese momento no sabía absolutamente nada de lo que se requería.
Mi sorpresa no conoció límites cuando todos los posibles participantes se reunieron para el entrenamiento. Había 7 personas en la audiencia, 6 de los cuales ya eran estudiantes de tercer año, y yo era el séptimo. ¿Por qué estaba tan sorprendido? En el tercer año, los estudiantes reciben un curso sobre bases de datos, que dura 2 semestres, lo que significa que todos tenían más de un año de práctica. No quería negarme, así que les pedí a los maestros un libro en la base de datos, encontré
un curso de C # en Internet y comencé a prepararme, apareciendo periódicamente en clases preparatorias.
Dos semanas antes del comienzo de la Olimpiada, supimos que no más de tres personas pueden participar de nuestro departamento. Pasó la ronda de clasificación. En 1,5 horas tuvimos que crear una base de datos en el sistema de gestión de bases de datos MSSQL utilizando el modelo ER, importar datos de un archivo Excel y mostrarlos en la aplicación. En una palabra, mi departamento me permitió participar en la Olimpiada.
Ahora sobre la competencia
El primer día de la competencia o "C -1"
El tan esperado descubrimiento tuvo lugar en este día. Todos los participantes se reunieron en el auditorio, donde contaron sobre la historia, las competencias de WorldSkills y presentaron a todos los expertos con los participantes.
Después de esta ceremonia, todos fueron a sus sitios para revisar el equipo. Se llevó a cabo un "ritual de dedicación", en el que seleccionamos nuestros trabajos y firmamos por seguridad. En ese momento, no sabía qué podía verificar en el software, así que inmediatamente después del sorteo me fui para prepararme para el día siguiente.
El segundo día de la competencia o el comienzo de la competencia.
¿Qué fueron los Juegos Olímpicos?
Para nuestra competencia, en 2 días (tres para otras competencias), durante 6 horas, con descansos, se nos pidió que escribiéramos una aplicación cliente-servidor en C # / Java con consultas a la base de datos. Más precisamente, decir "todo lo que tenemos tiempo para escribir", ya que el principio de la Olimpiada es "haz lo que puedas y cómo puedes".
Según los expertos, los criterios eran varias decenas de páginas A4. Los criterios se emiten solo después del final de la sesión y solo a expertos, por lo que no puedo decir nada al respecto.
Pasemos a los eventos del segundo día. Para la primera sesión fue necesario implementar lo siguiente:
- Cree una base de datos utilizando un diagrama ER conocido
- Importar datos de archivos de Excel a la base de datos
- Crear 4 pantallas para diseños en presentación
Y para el segundo invente otras cinco pantallas para diseños.
En resumen, se resolvieron todas las tareas, excepto mostrar imágenes de la base de datos y crear una lista personalizada de elementos.
Algunas capturas de pantalla:

La interfaz le permite encontrar jugadores por nombre (incluso la primera letra), temporada y equipo. Al hacer doble clic en una imagen que no se ha implementado, se abre información detallada sobre el reproductor. Ahora lo implementaría a través de DataGridViewImageColumn.

Cómo guardé imágenesprivate void download_Click(object sender, EventArgs e) { SaveFileDialog saveFile = new SaveFileDialog(); saveFile.DefaultExt = ".jpg"; saveFile.AddExtension = true;
Más capturas de pantalla, texto y código.
La interfaz es la pantalla principal, que le permite seleccionar el rol de "Usuario" o "Administrador", así como ver los mejores momentos de los partidos. Cómo colocar los elementos en el centro no se pudo encontrar.
Implementación de carga de imagen 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; } }

Una interfaz para la autorización de administradores técnicos y organizadores de partidos, que le permite recordar el último nombre de usuario y contraseña ingresados. En mi caso, escribí datos en un archivo en el disco duro sin cifrado.
Comprobando la existencia del nombre de usuario y contraseña ingresados en la base de datos private int checkData(string jobnumber, string password) {
Si conoce la mejor manera de verificar los datos, escriba los comentarios.

Y así es como se ve la pantalla inacabada, aquí solo lancé componentes en el formulario de acuerdo con el diseño. ¿Puede decirme cómo hacer una lista tan personalizada en C #?

La pantalla más difícil para mí, ya que había trabajo con gráficos para los que no me estaba preparando.
El tercer día de la competencia o una reunión inesperada con Android
El día anterior podría considerarse un calentamiento en comparación con el tercero. En 3 sesiones, otras 8 pantallas debían acreditarse. Y en la sesión final, hubo un cambio de planes, y en lugar de una presentación sobre el producto desarrollado, comenzamos a hacer una versión simplificada para Android. A saber, una galería con imágenes cargadas desde la base de datos. Ahora suena fácil, pero en ese momento me alegré de que la sesión tuviera 15 minutos para acceder a Internet. En 3 horas, se creó un GridView con elementos en forma de ImageView, se transfirió una matriz de imágenes de identificación al Adaptador y se redefinió la interfaz OnItemClickListener para crear una nueva Actividad con una imagen.
Algunas capturas de pantalla más:

La interfaz para el administrador, que le permite ver información sobre los jugadores. La pantalla más inútil, en mi opinión, ya que no puedes hacer cambios.
El |

El |

El |
Mi galería "perfecta" en 3 horas usando Internet y sin habilidades de programación para Android.
Más imágenes, texto y código.Código para crear una galería cuando no sabe cómo trabajar con la base de datos class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) setSupportActionBar(toolbar)

Al hacer clic en una temporada (tabla derecha), se abre información detallada sobre todos los partidos.

Una interfaz para administradores que le permite realizar cambios en la lista de comandos y exportar datos a Excel.
Cómo exporté datos a 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;
Resumen
A las 12 en punto, se llevó a cabo una ceremonia de clausura, donde todos los participantes recibieron certificados y medallas con diplomas aguardaban a los ganadores y ganadores. En nuestra competencia, tomé el 2do lugar. Entre las gratificantes competencias, los estudiantes se presentaron con canciones y bailes.
Conclusión
Durante el mes de preparación, dominé los equipos DDL y DML SQL, lo que simplificó enormemente el trabajo en pares de bases de datos en el tercer año. El conocimiento adquirido en C # y Windows Form deja mucho que desear, excepto para trabajar con bases de datos y la interfaz de usuario, no tuve que trabajar con nada.
Este año también participé en la Olimpiada WorldSkills y obtuve el primer lugar, pero sobre esto, las tareas complicadas y las consecuencias de desconectar Internet en los sitios en el próximo artículo.