Olá Habr!
Todo programador deseja aprimorar suas habilidades e toda empresa deseja consultar especialistas qualificados, mas como conseguir isso? As olimpíadas vêm em socorro, este artigo será sobre a participação em um deles.
Retiro
O artigo acabou sendo volumoso, então todo o código e a maioria das imagens estão sob os spoilers. Ainda testando o formato de envio do artigo. Se esse formato lhe parecer desconfortável, escreva sobre ele. Além disso, todas as imagens são clicáveis.
Sobre o concurso
WorldSkills é uma competição cujo objetivo é identificar profissionais em um campo específico. A competição tem suas raízes na WorldSkills International (WSI), a associação internacional sem fins lucrativos.
A participação na competição é gratuita. A idade dos participantes é de 18 a 28 anos, estudantes em faculdades ou universidades.
A competição na universidade dura 5 dias: no primeiro dia, a abertura e verificação de empregos, depois três dias de competição, no último dia - resumindo e fechando.
Sobre seleção e treinamento de competências
Eu aprendi sobre as Olimpíadas por acaso durante uma das práticas da universidade no 2º ano. Fui convidado a participar da competência "Desenvolvimento de soluções de software para negócios". Para resolver os problemas, eram necessários conhecimentos em C # ou Java, trabalhando com um banco de dados e, como descobri durante os primeiros Jogos Olímpicos do Android. A abertura das Olimpíadas estava marcada para o início de junho e a janela já era o final de abril. Naquele momento, eu não sabia absolutamente nada que fosse necessário.
Minha surpresa não teve limites quando todos os participantes em potencial foram reunidos para treinamento. Havia 7 pessoas na platéia, 6 das quais já eram alunos do terceiro ano, e eu era o sétimo. Por que fiquei tão surpreso? No terceiro ano, os alunos recebem um curso sobre bancos de dados, que dura 2 semestres, o que significa que todos tiveram mais de um ano de prática. Como não quis me recusar, pedi aos professores um livro no banco de dados, encontrei
um curso de C # na Internet e comecei a me preparar, aparecendo periodicamente nas aulas preparatórias.
Duas semanas antes do início da Olimpíada, descobrimos que não mais que três pessoas podem participar de nosso departamento. Passou a fase de qualificação. Em 1,5 horas, tivemos que criar um banco de dados no sistema de gerenciamento de banco de dados MSSQL usando o modelo ER, importar dados de um arquivo do Excel e mostrá-los no aplicativo. Em uma palavra, fui autorizado a participar da Olimpíada de nosso departamento.
Agora sobre a competição
O primeiro dia da competição ou "C -1"
A tão esperada descoberta ocorreu neste dia. Todos os participantes foram reunidos no auditório, onde contaram a história, as competências do WorldSkills e apresentaram todos os especialistas com os participantes.
Após esta cerimônia, todos foram a seus locais para verificar o equipamento. Foi realizado um “ritual de dedicação”, no qual selecionamos nossos trabalhos e assinamos por segurança. Naquela época, eu não sabia o que poderia fazer o check-in no software, então imediatamente após o sorteio saí para me preparar para o dia seguinte.
O segundo dia da competição ou o início da competição
O que foram as Olimpíadas?
Para nossa competência, em 2 dias (três para outras competências), por 6 horas, com intervalos, fomos solicitados a escrever um aplicativo cliente-servidor em C # / Java com consultas ao banco de dados. Mais precisamente, para dizer "tudo o que temos tempo para escrever", uma vez que o princípio da Olimpíada é "faça o que puder e como puder".
Segundo especialistas, os critérios eram várias dezenas de páginas A4. Os critérios são emitidos somente após o final da sessão e apenas para especialistas, portanto, não posso dizer nada sobre eles.
Vamos para os eventos do segundo dia. Para a primeira sessão, foi necessário implementar o seguinte:
- Crie um banco de dados usando um diagrama ER conhecido
- Importar dados de arquivos do Excel para o banco de dados
- Crie 4 telas para layouts em apresentação
E, para o segundo, crie outras cinco telas para layouts.
Em resumo, todas as tarefas foram resolvidas, exceto a exibição de imagens do banco de dados e a criação de uma lista personalizada de elementos.
Algumas capturas de tela:

A interface permite encontrar jogadores por nome (até a primeira letra), temporada e equipe. Ao clicar duas vezes em uma imagem que não foi implementada, são exibidas informações detalhadas sobre o player. Agora eu o implementaria através do DataGridViewImageColumn.

Como eu salvei imagensprivate void download_Click(object sender, EventArgs e) { SaveFileDialog saveFile = new SaveFileDialog(); saveFile.DefaultExt = ".jpg"; saveFile.AddExtension = true;
Mais capturas de tela, texto e código
A interface é a tela principal, permitindo selecionar o papel de "Usuário" ou "Administrador", além de assistir aos melhores momentos das partidas. Não foi possível encontrar como colocar os elementos no centro.
Implementação de upload de imagem 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; } }

Uma interface para autorização de administradores técnicos e organizadores de partidas, permitindo que você lembre o último nome de usuário e senha digitados. No meu caso, escrevi dados em um arquivo no disco rígido sem criptografia.
Verificando a existência do nome de usuário e senha digitados no banco de dados private int checkData(string jobnumber, string password) {
Se você conhece a melhor maneira de verificar os dados, escreva nos comentários.

E é assim que a tela inacabada parece, aqui eu apenas joguei componentes no formulário de acordo com o layout. Você pode me dizer como criar uma lista personalizada em c #?

A tela mais difícil para mim, pois havia trabalho com gráficos para os quais eu não estava me preparando.
O terceiro dia da competição ou uma reunião inesperada com o Android
O dia anterior pode ser considerado um aquecimento em comparação com o terceiro. Em 3 sessões, outras 8 telas deveriam ser creditadas. E na sessão final, houve uma mudança de planos e, em vez de uma apresentação sobre o produto desenvolvido, começamos a fazer uma versão simplificada para o Android. Ou seja, uma galeria com imagens enviadas do banco de dados. Agora parece fácil, mas naquele momento fiquei feliz por a sessão ter dado 15 minutos para acessar a Internet. Em 3 horas, um GridView foi criado com elementos na forma de um ImageView, uma matriz de imagens de identificação foi transferida para o Adaptador e a interface OnItemClickListener foi redefinida para criar uma nova Atividade com uma imagem.
Mais algumas capturas de tela:

A interface para o administrador, permitindo visualizar informações sobre os players. A tela mais inútil, na minha opinião, já que você não pode fazer alterações.
|

|

|
Minha galeria “perfeita” em 3 horas usando a Internet e sem habilidades de programação para Android.
Mais imagens, texto e código.Código para criar uma galeria quando você não sabe trabalhar com o banco de dados class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) setSupportActionBar(toolbar)

Ao clicar em uma temporada (tabela à direita), informações detalhadas sobre todas as partidas são abertas.

Uma interface para administradores que permite fazer alterações na lista de comandos e exportar dados para o Excel.
Como eu exportei dados para o 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;
Sumário
Às 12 horas, ocorreu uma cerimônia de encerramento, onde todos os participantes receberam certificados e medalhas com diplomas aguardavam vencedores e premiados. Em nossa competência, fiquei em 2º lugar. Entre a recompensa de competências, os alunos se apresentaram com músicas e danças.
Conclusão
Durante o mês de preparação, dominei as equipes SQL DDL e DML, o que simplificou bastante o trabalho em pares de banco de dados no terceiro ano. O conhecimento adquirido em C # e Windows Form deixa muito a desejar, exceto por trabalhar com bancos de dados e a interface do usuário, não tive que trabalhar com nada.
Este ano, também participei da Olimpíada Mundial de Habilidades e ocupei o 1º lugar, mas sobre isso, as tarefas complicadas e as conseqüências de desconectar a Internet dos sites no próximo artigo.