├── .gitignore ├── .vscode └── settings.json ├── Git y GitHub.docx ├── IA └── README.md ├── POO ├── .vscode │ ├── launch.json │ └── settings.json ├── JS │ ├── Account.js │ ├── Car.js │ ├── Card.js │ ├── Cash.js │ ├── Driver.js │ ├── ES6Account.js │ ├── ES6Car.js │ ├── Payment.js │ ├── Paypal.js │ ├── Route.js │ ├── UberBlack.js │ ├── UberPool.js │ ├── UberVan.js │ ├── UberX.js │ ├── User.js │ ├── index.html │ └── index.js ├── Java │ ├── Account.java │ ├── Car.java │ ├── Card.java │ ├── Cash.java │ ├── Main.class │ ├── Main.java │ ├── Payment.java │ ├── Paypal.java │ ├── Route.java │ ├── UberBlack.java │ ├── UberPool.java │ ├── UberVan.java │ └── UberX.java ├── PHP │ ├── Account.php │ ├── Car.php │ ├── Payment.php │ ├── Route.php │ ├── index.php │ ├── uberBlack.php │ ├── uberPool.php │ ├── uberVan.php │ └── uberX.php ├── Python │ ├── account.py │ ├── car.py │ ├── card.py │ ├── cash.py │ ├── main.py │ ├── payment.py │ ├── paypal.py │ ├── route.py │ ├── uberBlack.py │ ├── uberPool.py │ ├── uberVan.py │ └── uberX.py ├── README.md ├── assets │ ├── UML.jpg │ ├── agegacion_clases.jpg │ ├── agregacion.jpg │ ├── asociacion.jpg │ ├── asociacion_clases.jpg │ ├── composicion.jpg │ ├── composicion_clases.jpg │ ├── diagrama_uber.png │ ├── herencia.jpg │ ├── herencia_clases.jpg │ ├── programacion-orientada-a-objetos-poo.pdf │ └── representacion_clases.jpg ├── herencia.md └── orientacion_a_objetos.md ├── README.md ├── assets ├── Technical English for Professionals Course.pdf └── curso-trabajar-como-freelancer.pdf ├── basicos-git.md ├── comandos_git.md ├── css └── style.css ├── english.md ├── estrategias_aprender_efectivamente.md ├── formacion_profesional_integral.md ├── git_cmd.md ├── git_cmd.txt ├── img ├── algoritmo.png ├── instalacion_raspberry.png └── programacion.jpg ├── index.html ├── instalar-lamp.md ├── nota.txt ├── python ├── aritmetico.py ├── arreglos.py ├── comparacion.py ├── for.py ├── funcion.py ├── holamundo.py ├── readme.md └── while.py ├── raspberry_optimization.md ├── raspberrypi.md ├── ser_freelance.md ├── software_development_style_guide.md ├── tips_for_developers.md ├── tips_git.md └── trabajo_programacion.md /.gitignore: -------------------------------------------------------------------------------- 1 | ### VisualStudioCode ### 2 | .vscode/* 3 | !.vscode/settings.json 4 | !.vscode/tasks.json 5 | !.vscode/launch.json 6 | !.vscode/extensions.json 7 | 8 | ### VisualStudioCode Patch ### 9 | # Ignore all local history of files 10 | .history 11 | 12 | 13 | ### Python ### 14 | # Byte-compiled / optimized / DLL files 15 | __pycache__/ 16 | *.py[cod] 17 | *$py.class 18 | 19 | # C extensions 20 | *.so 21 | 22 | # Distribution / packaging 23 | .Python 24 | build/ 25 | develop-eggs/ 26 | dist/ 27 | downloads/ 28 | eggs/ 29 | .eggs/ 30 | lib/ 31 | lib64/ 32 | parts/ 33 | sdist/ 34 | var/ 35 | wheels/ 36 | pip-wheel-metadata/ 37 | share/python-wheels/ 38 | *.egg-info/ 39 | .installed.cfg 40 | *.egg 41 | MANIFEST 42 | 43 | # PyInstaller 44 | # Usually these files are written by a python script from a template 45 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 46 | *.manifest 47 | *.spec 48 | 49 | # Installer logs 50 | pip-log.txt 51 | pip-delete-this-directory.txt 52 | 53 | # Unit test / coverage reports 54 | htmlcov/ 55 | .tox/ 56 | .nox/ 57 | .coverage 58 | .coverage.* 59 | .cache 60 | nosetests.xml 61 | coverage.xml 62 | *.cover 63 | .hypothesis/ 64 | .pytest_cache/ 65 | 66 | # Translations 67 | *.mo 68 | *.pot 69 | 70 | # Scrapy stuff: 71 | .scrapy 72 | 73 | # Sphinx documentation 74 | docs/_build/ 75 | 76 | # PyBuilder 77 | target/ 78 | 79 | # pyenv 80 | .python-version 81 | 82 | # pipenv 83 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 84 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 85 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 86 | # install all needed dependencies. 87 | #Pipfile.lock 88 | 89 | # celery beat schedule file 90 | celerybeat-schedule 91 | 92 | # SageMath parsed files 93 | *.sage.py 94 | 95 | # Spyder project settings 96 | .spyderproject 97 | .spyproject 98 | 99 | # Rope project settings 100 | .ropeproject 101 | 102 | # Mr Developer 103 | .mr.developer.cfg 104 | .project 105 | .pydevproject 106 | 107 | # mkdocs documentation 108 | /site 109 | 110 | # mypy 111 | .mypy_cache/ 112 | .dmypy.json 113 | dmypy.json 114 | 115 | # Pyre type checker 116 | .pyre/ 117 | 118 | # End of https://www.gitignore.io/api/python 119 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "python.pythonPath": "C:\\Users\\FLIAMN\\AppData\\Local\\Programs\\Python\\Python38\\python.exe", 3 | "files.exclude": { 4 | "**/.classpath": true, 5 | "**/.project": true, 6 | "**/.settings": true, 7 | "**/.factorypath": true 8 | } 9 | } -------------------------------------------------------------------------------- /Git y GitHub.docx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jocode/Getting-Started/5edf25376e68940e58f9f6adf9e061f749006158/Git y GitHub.docx -------------------------------------------------------------------------------- /IA/README.md: -------------------------------------------------------------------------------- 1 | # IA para todos 2 | 3 | What you'll learn 4 | 5 | - Whats is AI? 6 | - Machine Learning 7 | - Data 8 | - What makes an AI company 9 | - What machine learning can and cannot do 10 | - Optional: Intuitive explanation of Deep Learning 11 | - Building AI projects 12 | - Building AI in your company 13 | - AI and society 14 | 15 | ## :one: :blue_book: ¿Qué es la IA? :fire: 16 | 17 | ### Aprendizaje automático - Machine Learning 18 | 19 | - **Aprendizaje Supervisado** 20 | - Asignación de datos de entrada, para el entrenamiento de la red 21 | - **Aprendizaje no supervisado** 22 | 23 | > La publicidad es una de las formas mas lucrativas en las que se ve el aprendizaje supervisado, de acuerdo a las preferencias que usted tiene. 24 | 25 | - Email 26 | - Audio Transcript 27 | - Traducción 28 | - Anuncios 29 | - Coches autónomos 30 | 31 | :heavy_check_mark: ¿Por qué ahora? 32 | 33 | Performance vs Amount data 34 | 35 | 1. IA tradicional 36 | 2. Pequeña red neuronal 37 | 3. Red neuronal mediana 38 | 4. Red neuronal grande 39 | 40 | :x: Problemas en los datos 41 | 42 | - Etiquetas incorrectas 43 | - Valores perdidos 44 | 45 | - Múltiples tipos de datos 46 | - Imagenes, audio, texto (Datos no estructurados) 47 | 48 | ### La terminología de la IA 49 | 50 | - **Machine Learning** 51 | 52 | Campo de estudio que le da a clos computadores la habilidad de aprender sin estar explícitamente programado (Software) 53 | 54 | > Arthur Samuel (1959) 55 | 56 | - **Data sciece** 57 | 58 | Es la ciencia de extraer conocimiento e ideas de los datos. (Slides) 59 | 60 | Red neuronal y deep learning, nos conduce practicamente a la misma cosa 61 | 62 | > Las redes neuronales fueron originalmente inspiradas por elcerebro, pero los detalles de cómo trabajan no estan para nada relacionadas como trabaja el cerebro biológico. 63 | 64 | ### ¿Qué hace que una empresa sea una empresa de IA? 65 | 66 | AI Transformation 67 | 68 | 1. Execute pilot projects to gain momentum 69 | 2. Build an in-house AI team 70 | 3. Provide broad AI training 71 | 4. Develop an AI strategy 72 | 5. Develop internal and external communications 73 | 74 | ### What makes an ML problem easier 75 | 76 | 1. Learning a "simple" concept 77 | 2. Lots of data avalaible 78 | 79 | > La IA es la nueva electricidad y está transformando todas las industrias. 80 | 81 | ### Deep Learning y Neural Network 82 | 83 | Una red neuronal es un grupo de neuronas artificiales en la que cada una computa una función simple que relaciona una entrada A con una salida B. 84 | 85 | ¿Cuál de estos términos describe mejor el tipo de IA usado en los filtros de correo no deseado de correo electrónico, reconocimiento de voz y otras aplicaciones específicas actuales? 86 | 87 | - Intligencia Artificial Debil (ANI) 88 | 89 | ## :two: :blue_book: Starting an AI project (Creación de Proyectos de iA) :fire: 90 | 91 | - Workflow of projects 92 | - Selecting AI projects 93 | - Organizing data and team for the projects 94 | 95 | ### :zap: Proceso de trabajo de un proyecto de aprendizaje automático 96 | 97 | #### Key steps of a machine learning project 98 | 99 | - **Amazon / Alexa** 100 | 101 | 1. Collect data 102 | 2. Train model 103 | - Iterate many timesuntil good enough 104 | 3. Deploy model 105 | - Get data back 106 | - Maintain / update model 107 | 108 | - **Self-driving car** 109 | 110 | 1. Collect data 111 | - Image, position od other cars 112 | 2. Train model 113 | - Iterate many times until good enough 114 | 3. Deploy Model (Implementar el modelo) 115 | - Get data back 116 | - Main / Update models 117 | 118 | ### :zap: Proceso de trabajo de un proyecto de ciencia de datos 119 | 120 | 1. Collect data 121 | 2. Analyze data 122 | - Iterate many times to get goof insights 123 | 3. Suggest hypotheses/actions 124 | - Deploy changes 125 | - Re-analyze new data periodically 126 | 127 | ### Toda función laboral necesita aprender cómo usar los datos 128 | 129 | - **:star: Data Science y Machine Learning en la agricultura :bamboo:** 130 | 131 | | Data Science | Machine Learning | 132 | | ----------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------- | 133 | | Condiciones del suelo | Agricultura de precisión | 134 | | Condiciones climáticas | Eliminación de la mala hierba | 135 | | Presencia de diferentes cultivos de mercado | Obtención de modelos que relacionen entradas A con B | 136 | | Los equipos de ciencia de datos, recomiendan qué plantar, y cuando hacerlo para mejorar el uso a la vez que se mantiene la condición del suelo de la granja | Recomendaciones para los cultivos | 137 | 138 | Este tiempo de ciencia de datos desempeña y seguirá desempeñando cada vez más importante en la agricultura 139 | 140 | - Agricultura 141 | - Marketing 142 | - Coches autónomos 143 | - Medicina 144 | 145 | > Los datos tienen un impacto gracias a la ciencia de datos y al aprendizaje automático 146 | 147 | ### Cómo elegir un proyecto de IA (Parte 1) :fire: 148 | 149 | Lo ideal es selccionar proyectos que estén entre _Lo que puede hacer la AI_ y los _Elementos valiosos para tu negocio_ 150 | 151 | **Cross functional team** 152 | 153 | #### Brainstorming framework 154 | 155 | - Think about automating tasks rather than automating jobs. E.g., call center routing, radiologist. 156 | - What are the main drivers of business value? (¿Claves principales de valor de negocio) 157 | - What are the main pain points in yout business? (¿Cuáles son los principales puntos débiles de tu negocio) 158 | 159 | ### You can make progess even without big data 160 | 161 | - Having more data almost never hurts 162 | - Data makes some business (like web search) defensible. 163 | - But with small datasets, you can still make progress 164 | 165 | > No renuncies solo por tener pocos datos con qué empezar 166 | 167 | ### Cómo elegir un proyecto de IA (Parte 2) 168 | 169 | #### Due diligence on project 170 | 171 | | Tecnical diligence | Business diligence | 172 | | -------------------------------------- | ------------------------------- | 173 | | Can Ai system meet desired performance | Lower Cost | 174 | | How much data is need | Increase revenue | 175 | | Engineering timeline | Launch new product or businesss | 176 | 177 | > Además de una diligencia técnica y empresarial, se debe realizar una diligencia ética que contribuya a una sociedad mejor. 178 | 179 | **Build vs Buy** 180 | 181 | - ML projects can be in-house or outsourced 182 | - DS projects are more commonly in-house 183 | - Some things will be industry standard -avoid building those. 184 | 185 | ### Trabajar con un equipo de IA 186 | 187 | - **Specify your acceptance criteria** 188 | 189 | **Goal** Detect defects with 95% accuracy 190 | 191 | - **Test set** Provide AI team a dataset on which to measure their performance 192 | 193 | ### How AI teams think about data 194 | 195 | - Training set 196 | - Test set 197 | 198 | Generalmente se usan 2 _test set_, para realizar pruebas y verificar la presición del modelo 199 | 200 | ### Pitfall: Expecting 100% accuaracy 201 | 202 | - Limitations of ML 203 | - Inufficient data 204 | - Mislabeled data 205 | - Ambiguous data 206 | 207 | ### :star: Herramientas técnicas para equipos de IA 208 | 209 | **Machine Learning frameworks** 210 | 211 | - Tensor flow 212 | - PyTorch 213 | - Keras 214 | - MXNet 215 | - CNTK 216 | - Caffe 217 | - PaddlePaddle 218 | - Scikit-learn 219 | - R 220 | - Weka 221 | 222 | **Research publications** 223 | 224 | - Arxiv 225 | 226 | ### CPU vs GPU 227 | 228 | - **CPU** Computer processor (Central Processing Unit) 229 | - **GPU** Graphics Processing Unit 230 | 231 | > La principal ventaja de la implementación en el borde es que puede aumentar la respuesta del sistema, y también reducir la cantidad de datos que es necesario enviar a través de la red. 232 | 233 | ## :three: :blue_book: Desarrollo de IA en su empresa :fire: 234 | 235 | - Case studies of complex Ai products 236 | - Roles in an AI team 237 | - Ai Transformation playbook 238 | - Taking your first step 239 | 240 | ### Altavoz Inteligente 241 | 242 | - Amazon _Echo/Alexa_ 243 | - Google _Home_ 244 | - Apple _Siri_ 245 | - Baidu _DuerOS_ 246 | 247 | #### Steps to process the command 248 | 249 | AI Pipeline, son los componentes o los pasos para resolver un problema de ML 250 | 251 | 1. Trigger word/wakeword detection 252 | 2. Speech recognition 253 | 3. Intent recognition (Averiguar qué es lo que quiere hacer el usuario) 254 | - Joke 255 | - Time 256 | - Music 257 | - Call 258 | - Wheather 259 | 4. Execute the intent (Joke, Email etc) 260 | 261 | ### Vehículos autónomos 262 | 263 | Steps for decide how to drive 264 | 265 | - Image/ Radar/ Lidar 266 | - Motion Planing 267 | - Steer / Accelerate / Brake 268 | 269 | 1. Image/ Radar/ Lidar - +GPS, Maps 270 | 2. Card detection / Pedestrian detection / Lane Detections / Traffic Light Detection / Obstacle detection 271 | 3. Motion planning (Mostrar el camino que debe seguir el vehiculo en carretera) 272 | 4. Steer / Accelerate / Brake 273 | 274 | ### Roles modelo de un equipo de AI 275 | 276 | - Software Engineer 277 | - Eg. Joke execution, ensure self-driving realiability 278 | - Machine Learning Engineer 279 | - Machine Learning Researcher 280 | - Extend state-of-the-art in Ml 281 | - Data Scientist 282 | - Examine data and provide insights 283 | - Make presentation to team/executive 284 | - Data Engineer 285 | - Organize data 286 | - Make sure dara is save in an easily accessible, secure and cost effective way 287 | - AI Product Manager 288 | - Help decide what to build; what's feasible and valuable 289 | 290 | ### Getting started with a small team 291 | 292 | - 1 Software Engineer 293 | - 1 Machine Learning Engineer/Data Scientist 294 | - Nobody but yourself 295 | 296 | ### Manual de estrategias de transformación de IA (Parte 1) 297 | 298 | 1. Execute pilot projects to gain momentum 299 | 2. Build an in-house AI team 300 | 3. Provide broad Ai training 301 | 4. Develop an AI strategy 302 | 5. Develop internal and external communications 303 | 304 | **1. Execute pilot projects to gain momentum** 305 | 306 | - More important for the initial project to succees rather than be most valueable 307 | - Show traction within 6-12 months 308 | - Can be in-house or outsourced 309 | 310 | **4. Develop an AI strategy** 311 | 312 | - Leverage AI to create an advantage specific to your industry sector 313 | - :star: Design stratgy aligned with the "Virtuous Cycle of AI" 314 | 315 | **Blue River -> John Deere** 316 | 317 | ### Obstáculos de IA que deben evitarse (AI pitfalls to avoid) 318 | 319 | | Don't | Do | 320 | | ------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------ | 321 | | Expect Ai to solve everything | Be realistic about what AI can and cannot do given limitations of technology, data and engineering resources | 322 | | Hire 2-3 ML engineers and count solely on them to come up with use cases | Pair engineering talent with business talent and work cross-functionally to find feasible and value projects | 323 | | Expect the AI projct to work the first time | Plan for AI development to be an iterative process, with multiple attemps needed to succeed | 324 | | Expect traditional planning processes to apply whithout changes | Work with AI team to establish timeline estimates, milestones, KPIs, etc | 325 | | Think you need superstar AI engineer before you can do anything | 326 | 327 | ### Su primer paso en AI 328 | 329 | - Get friends to learn about AI 330 | - This course 331 | - Reading group 332 | - Start brainstorming projects 333 | - No projects is too small 334 | - Hire a few ML/DS people to help 335 | - Hire or appint an AI leader (VP, AI, CAIO, etc) 336 | - Discuss with CEO/board possibilities of AI transformation 337 | - Will your company be much more valuable and/or more effective if it were good at AI? 338 | 339 | ### Estudio de las principales áreas de aplicación de la IA 340 | 341 | - **Computer Vision** 342 | 343 | - Image classification/object recognition 344 | - Face recognition 345 | - Object detection 346 | - Image segmentation 347 | - Tracking 348 | 349 | - **Natural Language Processing** 350 | 351 | - Text classification 352 | - Sentiment recognition 353 | - Information retrieval 354 | - E.g, web search 355 | - Name entity recognition 356 | - Machine traslation 357 | - Others: Parsing, part-of-speech tagging 358 | 359 | - **Speech** 360 | 361 | - Speech recognition (speech-to-text) 362 | - Trigger word/wakeword detection 363 | - Speaker ID 364 | - Speech systhesis (text-to-speech, TTS) 365 | - _The quick brown fox jumps over the lazy dog_ 366 | 367 | - **Robotics** 368 | 369 | - Perception; figuring out what's in the world around 370 | - Motion planning: finding a path for the robot to folloe 371 | - Control: sending commands to the motors to folloew a path 372 | 373 | - **General machine learning** 374 | - Unstructured data (images, audio, text) 375 | - Structured data 376 | 377 | ## Unsupervised learning (Aprendizaje no supervisado) 378 | 379 | Given data (without any specific desired output labels), find something interesting about the data. 380 | 381 | Una de las críticas del _aprendizaje supervisado_ es que necesita muchos datos etiquetados. 382 | 383 | - Clustering (Segmentacion de mercado) 384 | - Transfer learning 385 | Learn from task A, and use knowledge to help on task B 386 | - Aprendizaje por refuerzo (Reinforcement learning) 387 | Use a 'reward signal' to tell the AI when it is doing well or poorly. It automatically learns to maximize its rewards. 388 | (El aprendizaje por refuerzo es muy eficaz en los videojuegos) 389 | En el helicoptero autónomo de Standford se usó esta técnica 390 | - GANs (Generative Adversarial Network) - Redes generativas adversarias (Antagónicas) 391 | - Knowledge Graph - Grafos de conocimiento 392 | 393 | ## :three: :blue_book: La IA y la sociedad :fire: 394 | 395 | La IA es un superpoder que permite que en un pequeño equipo tenga un efecto en la vida de un gran número de personas. 396 | 397 | - AI and hype 398 | - Limitations of AI 399 | - Bias 400 | - Adversarial attacks 401 | - AI, developing economies, and jobs 402 | 403 | ### Una visión realista de la AI 404 | 405 | La IA está teniendo un impacto importante en la sociedad y en la vida de las personas. 406 | 407 | **Goldlooks rule for AI** 408 | 409 | - Too optimistic: Sentient/super-intelligent AI killer robots comming soon 410 | - Too pessimistic: AI cannot do everithing, so an AI winter is comming 411 | - Just right: AI can't do everithing, but will transform industries 412 | 413 | #### Limitations of AI 414 | 415 | - Performance limitations 416 | - Explainability is hard (but sometimes doable) 417 | - Biased AI through biased data (Parcialidad) 418 | - Adversarial attack on AI 419 | 420 | **Why bias matters?** 421 | 422 | - Hiring tool that discriminated against women 423 | - Facial recognition working better for light-skinned than dark-skinned individuals 424 | - Bank loan approvals 425 | - Toxic effect of reinforcing unhealthy stereotypes 426 | 427 | **Combating bias** 428 | 429 | - Technical solutions 430 | - E.g 'zero out' the bias in words 431 | - Use less biased and/or morre inclusive data 432 | - Transparency and/or auditing processes 433 | - Diverse workforce 434 | - Create less biased applications 435 | 436 | #### Ataques adversos a la IA (Adversarial attacks on AI) 437 | 438 | Un ataque adversario a un sistema de AI, es un intento que haga algo distinto de lo que se esperaba que haga, con el fin de engañarlo. 439 | 440 | _Pegatina de tostadora en la banana del equipo de Google_ 441 | 442 | > "Juego de suma cero", contra adversarios- 443 | 444 | ### Usos adversos de la AI (Adverse uses of AI) 445 | 446 | - DeepFakes 447 | - Synthesize video of people doing things they never did 448 | - Undetermining of democracy and privacy 449 | - Oppresive surveillance 450 | - Generanting fake comments 451 | - Spam vs anti-spam and fraud vs anti-frauds 452 | 453 | ### La IA y las economías en desarrollo (AI and developing economies) 454 | 455 | - "Leapfrog" 456 | - Mobile phones 457 | - Mobile payments 458 | - Online education 459 | - Focus on AI to strengthen a country's vertical industries 460 | - Public-provate partnerships to acelerate development 461 | - Invest in education 462 | 463 | ### La IA y los empleos (AI and jobs) 464 | 465 | Todos debemos mantenernos en un constante aprendizaje, esto nos garantizará mayores oportunidades. 466 | 467 | **¿Qué debes hacer para trabajar en IA?** 468 | 469 | Si quieres trabajar en IA, es posible aprender IA desde cero con cursos en línea y otros recursos, y si se combina tus conocimientos actuales, y los relaciona con IA está más cualificado para realizar un y trabajo valioso en este sector aplicando AI, en el área que más se sienta cómodo. 470 | 471 | Industria vertical 472 | 473 | **¿Cuál es el primer paso en la Guía de transformación de IA para ayudar a su empresa a ser experta en IA?** 474 | 475 | Ejecutar proyectos piloto parah ganar impulso. Tener éxito y mostrar avance en 6 a 10 meses. 476 | -------------------------------------------------------------------------------- /POO/.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | // Use IntelliSense to learn about possible attributes. 3 | // Hover to view descriptions of existing attributes. 4 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 5 | "version": "0.2.0", 6 | "configurations": [ 7 | { 8 | "name": "Python: Archivo actual", 9 | "type": "python", 10 | "request": "launch", 11 | "program": "${file}", 12 | "console": "integratedTerminal" 13 | } 14 | ] 15 | } -------------------------------------------------------------------------------- /POO/.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "python.pythonPath": "C:\\Users\\FLIAMN\\AppData\\Local\\Programs\\Python\\Python38\\python.exe" 3 | } -------------------------------------------------------------------------------- /POO/JS/Account.js: -------------------------------------------------------------------------------- 1 | function Account(name, document) { 2 | 3 | this.id; 4 | this.name = name; 5 | this.document = document; 6 | this.email; 7 | this.password; 8 | 9 | } -------------------------------------------------------------------------------- /POO/JS/Car.js: -------------------------------------------------------------------------------- 1 | function Car(license, driver) { 2 | this.id; 3 | this.license = license; 4 | this.driver = driver; 5 | this.passenger; 6 | } 7 | 8 | Car.prototype.printDataCar = function () { 9 | console.log(this.driver); 10 | console.log(this.driver.name); 11 | console.log(this.driver.document); 12 | console.log(this.passenger); 13 | } -------------------------------------------------------------------------------- /POO/JS/Card.js: -------------------------------------------------------------------------------- 1 | class Paypal extends Payment { 2 | 3 | constructor(id, number, cvv, date) { 4 | super(id); 5 | this.number = number; 6 | this.cvv = cvv; 7 | this.date = date; 8 | } 9 | 10 | } -------------------------------------------------------------------------------- /POO/JS/Cash.js: -------------------------------------------------------------------------------- 1 | class Cash extends Payment { 2 | 3 | constructor(id) { 4 | super(id); 5 | } 6 | 7 | } -------------------------------------------------------------------------------- /POO/JS/Driver.js: -------------------------------------------------------------------------------- 1 | class Driver extends Account { 2 | 3 | constructor(id, name, document, email, password) { 4 | super(id, name, document, email, password); 5 | } 6 | 7 | } -------------------------------------------------------------------------------- /POO/JS/ES6Account.js: -------------------------------------------------------------------------------- 1 | class Account { 2 | 3 | constructor(name, document, email, password) { 4 | this.id; 5 | this.name = name; 6 | this.document = document; 7 | this.email = email; 8 | this.password = password; 9 | } 10 | 11 | printData() { 12 | console.log(this); 13 | } 14 | 15 | } -------------------------------------------------------------------------------- /POO/JS/ES6Car.js: -------------------------------------------------------------------------------- 1 | /** 2 | * A partir de las nuevas especificaciones del EcmaScript 6 ya podemos declarar una clase con la palabra reservada class, aunque es importante aclarar que estos no dejan de ser prototipos, sino todo lo contrario. 3 | */ 4 | class Car { 5 | 6 | constructor(license, driver) { 7 | this.id; 8 | this.license = license; 9 | this.driver = driver; 10 | this.passenger; 11 | } 12 | 13 | printDataCar() { 14 | console.log(this.driver); 15 | console.log(this.license); 16 | console.log(this.passenger); 17 | } 18 | 19 | } -------------------------------------------------------------------------------- /POO/JS/Payment.js: -------------------------------------------------------------------------------- 1 | function Payment(id) { 2 | this.id = id; 3 | } -------------------------------------------------------------------------------- /POO/JS/Paypal.js: -------------------------------------------------------------------------------- 1 | class Paypal extends Payment { 2 | 3 | constructor(id, email) { 4 | super(id); 5 | this.email = email; 6 | } 7 | 8 | } -------------------------------------------------------------------------------- /POO/JS/Route.js: -------------------------------------------------------------------------------- 1 | function Route() { 2 | this.id; 3 | this.init; 4 | this.end; 5 | } -------------------------------------------------------------------------------- /POO/JS/UberBlack.js: -------------------------------------------------------------------------------- 1 | class UberBlack extends Car { 2 | constructor(license, driver, typeCarAccepted, seatsMaterial) { 3 | super(license, driver); 4 | this.typeCarAccepted = typeCarAccepted; 5 | this.seatsMaterial = seatsMaterial; 6 | } 7 | } -------------------------------------------------------------------------------- /POO/JS/UberPool.js: -------------------------------------------------------------------------------- 1 | class UberPool extends Car { 2 | constructor(license, driver, brand, model) { 3 | super(license, driver); 4 | this.brand = brand; 5 | this.model = model; 6 | } 7 | } -------------------------------------------------------------------------------- /POO/JS/UberVan.js: -------------------------------------------------------------------------------- 1 | class UberVan extends Car { 2 | constructor(license, driver, typeCarAccepted, seatsMaterial) { 3 | super(license, driver); 4 | this.typeCarAccepted = typeCarAccepted; 5 | this.seatsMaterial = seatsMaterial; 6 | } 7 | } -------------------------------------------------------------------------------- /POO/JS/UberX.js: -------------------------------------------------------------------------------- 1 | class UberX extends Car { 2 | constructor(license, driver, brand, model) { 3 | super(license, driver); 4 | this.brand = brand; 5 | this.model = model; 6 | } 7 | } -------------------------------------------------------------------------------- /POO/JS/User.js: -------------------------------------------------------------------------------- 1 | class User extends Account { 2 | 3 | constructor(id, name, document, email, password) { 4 | super(id, name, document, email, password); 5 | } 6 | 7 | } -------------------------------------------------------------------------------- /POO/JS/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Programación Orientada a Objetos en JS 8 | 9 |

Programación Orientada a objetos

10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /POO/JS/index.js: -------------------------------------------------------------------------------- 1 | // las nuevas especificaciones del EcmaScript 6 (Aunque es importante aclarar que estos no dejan de ser prototipos) 2 | var car = new Car("ADK9783", new Account("Juan Perez", "8773221")); 3 | car.passenger = 4; 4 | car.printDataCar(); 5 | 6 | var uberX = new UberX("LJE083", new Account("Anita Hernandez", "83723751"), "Audi", "Q5"); 7 | uberX.printDataCar(); 8 | console.log(uberX); 9 | 10 | var paypal = new Paypal(1, "correo@correo.com"); 11 | console.log(paypal); 12 | 13 | var user = new User("Juan Perez", 1291863, "juan@correo.com", "adkjda"); 14 | user.printData(); 15 | -------------------------------------------------------------------------------- /POO/Java/Account.java: -------------------------------------------------------------------------------- 1 | package Java; 2 | 3 | class Account { 4 | 5 | Integer id; 6 | String name; 7 | String document; 8 | String email; 9 | String password; 10 | 11 | public Account(String name, String document) { 12 | this.name = name; 13 | this.document = document; 14 | } 15 | 16 | } -------------------------------------------------------------------------------- /POO/Java/Car.java: -------------------------------------------------------------------------------- 1 | package Java; 2 | 3 | class Car { 4 | 5 | private Integer id; 6 | private String license; 7 | private Account driver; 8 | private Integer passenger; 9 | 10 | public Car(String license, Account driver) { 11 | this.license = license; 12 | this.driver = driver; 13 | } 14 | 15 | void printDataCar() { 16 | System.out.println("License: " + license + " Driver: " + driver.name + " Passenger: " + passenger); 17 | } 18 | 19 | public Integer getId() { 20 | return id; 21 | } 22 | 23 | public void setId(Integer id) { 24 | this.id = id; 25 | } 26 | 27 | public String getLicense() { 28 | return license; 29 | } 30 | 31 | public void setLicense(String license) { 32 | this.license = license; 33 | } 34 | 35 | public Account getDriver() { 36 | return driver; 37 | } 38 | 39 | public void setDriver(Account driver) { 40 | this.driver = driver; 41 | } 42 | 43 | public Integer getPassenger() { 44 | return passenger; 45 | } 46 | 47 | public void setPassenger(Integer passenger) { 48 | this.passenger = passenger; 49 | } 50 | 51 | } -------------------------------------------------------------------------------- /POO/Java/Card.java: -------------------------------------------------------------------------------- 1 | package Java; 2 | 3 | class Card extends Payment { 4 | 5 | int number; 6 | int cvv; 7 | String date; 8 | 9 | public Card(int id, int number, int cvv, String date) { 10 | super.id = id; 11 | this.number = number; 12 | this.cvv = cvv; 13 | this.date = date; 14 | } 15 | } -------------------------------------------------------------------------------- /POO/Java/Cash.java: -------------------------------------------------------------------------------- 1 | package Java; 2 | 3 | class Cash extends Payment { 4 | 5 | public Cash(int id) { 6 | super.id = id; 7 | } 8 | } -------------------------------------------------------------------------------- /POO/Java/Main.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jocode/Getting-Started/5edf25376e68940e58f9f6adf9e061f749006158/POO/Java/Main.class -------------------------------------------------------------------------------- /POO/Java/Main.java: -------------------------------------------------------------------------------- 1 | package Java; 2 | 3 | class Main { 4 | 5 | public static void main(String[] args) { 6 | System.out.println("Hola mundo"); 7 | 8 | // Instanciar el objeto 9 | Car car = new Car("AMQ123", new Account("Andres Pez", "1081786543")); 10 | car.setPassenger(2); 11 | car.printDataCar(); 12 | 13 | UberX uberx = new UberX("JSC893", new Account("Maria Buendia", "1031786543"), "Audi", "Q5"); 14 | uberx.setPassenger(4); 15 | uberx.printDataCar(); 16 | 17 | Paypal paypal = new Paypal(1, "correo@correo.com"); 18 | System.out.println(paypal.email); 19 | 20 | } 21 | 22 | } -------------------------------------------------------------------------------- /POO/Java/Payment.java: -------------------------------------------------------------------------------- 1 | package Java; 2 | 3 | class Payment { 4 | Integer id; 5 | } -------------------------------------------------------------------------------- /POO/Java/Paypal.java: -------------------------------------------------------------------------------- 1 | package Java; 2 | 3 | class Paypal extends Payment { 4 | 5 | String email; 6 | 7 | public Paypal(int id, String email) { 8 | super.id = id; 9 | this.email = email; 10 | } 11 | 12 | } -------------------------------------------------------------------------------- /POO/Java/Route.java: -------------------------------------------------------------------------------- 1 | package Java; 2 | 3 | import java.util.ArrayList; 4 | 5 | class Route { 6 | 7 | Integer id; 8 | ArrayList start; 9 | ArrayList end; 10 | 11 | } -------------------------------------------------------------------------------- /POO/Java/UberBlack.java: -------------------------------------------------------------------------------- 1 | package Java; 2 | 3 | import java.util.ArrayList; 4 | import java.util.Map; 5 | 6 | class UberBlack extends Car { 7 | 8 | Map> typeCarAccepted; 9 | ArrayList seatsMaterial; 10 | 11 | public UberBlack(String license, Account driver, Map> typeCarAccepted, 12 | ArrayList seatsMaterial) { 13 | super(license, driver); 14 | 15 | this.typeCarAccepted = typeCarAccepted; 16 | this.seatsMaterial = seatsMaterial; 17 | } 18 | 19 | } -------------------------------------------------------------------------------- /POO/Java/UberPool.java: -------------------------------------------------------------------------------- 1 | package Java; 2 | 3 | class UberPool extends Car { 4 | 5 | String brand; 6 | String model; 7 | 8 | public UberPool(String license, Account driver, String brand, String model) { 9 | super(license, driver); 10 | 11 | this.brand = brand; 12 | this.model = model; 13 | } 14 | 15 | } -------------------------------------------------------------------------------- /POO/Java/UberVan.java: -------------------------------------------------------------------------------- 1 | package Java; 2 | 3 | import java.util.ArrayList; 4 | import java.util.Map; 5 | 6 | class UberVan extends Car { 7 | 8 | Map> typeCarAccepted; 9 | ArrayList seatsMaterial; 10 | 11 | public UberVan(String license, Account driver, Map> typeCarAccepted, 12 | ArrayList seatsMaterial) { 13 | super(license, driver); 14 | 15 | this.typeCarAccepted = typeCarAccepted; 16 | this.seatsMaterial = seatsMaterial; 17 | } 18 | 19 | } -------------------------------------------------------------------------------- /POO/Java/UberX.java: -------------------------------------------------------------------------------- 1 | package Java; 2 | 3 | class UberX extends Car { 4 | 5 | String brand; 6 | String model; 7 | 8 | public UberX(String license, Account driver, String brand, String model) { 9 | super(license, driver); 10 | 11 | this.brand = brand; 12 | this.model = model; 13 | } 14 | 15 | @Override 16 | public void setPassenger(Integer passenger) { 17 | if (passenger == 4) 18 | super.setPassenger(passenger); 19 | else 20 | System.out.println("Debes asignar 4 pasageros"); 21 | } 22 | 23 | } -------------------------------------------------------------------------------- /POO/PHP/Account.php: -------------------------------------------------------------------------------- 1 | name = $name; 12 | $this->document = $document; 13 | } 14 | } 15 | 16 | ?> -------------------------------------------------------------------------------- /POO/PHP/Car.php: -------------------------------------------------------------------------------- 1 | license = $license; 12 | $this->driver = $driver; 13 | } 14 | 15 | function printData(){ 16 | echo'
';
17 |     print_r($this->driver); // print_r vs var_dump
18 |     var_dump($this->driver);
19 |     print($this->license);
20 |     echo'
'; 21 | } 22 | 23 | } 24 | 25 | ?> -------------------------------------------------------------------------------- /POO/PHP/Payment.php: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /POO/PHP/Route.php: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /POO/PHP/index.php: -------------------------------------------------------------------------------- 1 | printData(); 12 | $uberPool->printData(); 13 | 14 | 15 | ?> -------------------------------------------------------------------------------- /POO/PHP/uberBlack.php: -------------------------------------------------------------------------------- 1 | typeCarAccepted = $typeCarAccepted; 11 | $this->seatsMaterial = $seatsMaterial; 12 | } 13 | 14 | } 15 | 16 | ?> -------------------------------------------------------------------------------- /POO/PHP/uberPool.php: -------------------------------------------------------------------------------- 1 | brand = $brand; 11 | $this->model = $model; 12 | } 13 | 14 | } 15 | 16 | ?> -------------------------------------------------------------------------------- /POO/PHP/uberVan.php: -------------------------------------------------------------------------------- 1 | typeCarAccepted = $typeCarAccepted; 12 | $this->seatsMaterial = $seatsMaterial; 13 | } 14 | 15 | } 16 | 17 | ?> -------------------------------------------------------------------------------- /POO/PHP/uberX.php: -------------------------------------------------------------------------------- 1 | brand = $brand; 12 | $this->model = $model; 13 | } 14 | 15 | } 16 | 17 | ?> -------------------------------------------------------------------------------- /POO/Python/account.py: -------------------------------------------------------------------------------- 1 | class Account: 2 | id = int 3 | name = str 4 | document = str 5 | email = str 6 | password = str 7 | 8 | def __init__(self, name, document): 9 | self.name = name 10 | self.document = document 11 | 12 | -------------------------------------------------------------------------------- /POO/Python/car.py: -------------------------------------------------------------------------------- 1 | from account import Account 2 | 3 | 4 | class Car: 5 | id = int 6 | license = str 7 | driver = Account("", "") 8 | passenger = str 9 | 10 | def __init__(self, name, driver): 11 | self.name = name 12 | self.driver = driver 13 | 14 | def printData(self): 15 | print(self.license, self.passenger) 16 | print(vars(self.driver)) 17 | -------------------------------------------------------------------------------- /POO/Python/card.py: -------------------------------------------------------------------------------- 1 | from payment import Payment 2 | 3 | 4 | class Card(Payment): 5 | 6 | number = int 7 | cvv = int 8 | date = str 9 | 10 | def __init__(self, id, number, cvv, date): 11 | super().__init__(id) 12 | self.number = number 13 | self.cvv = cvv 14 | self.date = date 15 | -------------------------------------------------------------------------------- /POO/Python/cash.py: -------------------------------------------------------------------------------- 1 | from payment import Payment 2 | 3 | 4 | class Cash(Payment): 5 | 6 | def __init__(self, id): 7 | super().__init__(id) 8 | -------------------------------------------------------------------------------- /POO/Python/main.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from car import Car 3 | from account import Account 4 | from uberBlack import UberBlack 5 | from paypal import Paypal 6 | 7 | if __name__ == "__main__": 8 | print("Hello python") 9 | 10 | car = Car("ADK823", Account("Juan Magallán", "87133813")) 11 | print(vars(car)) 12 | print(vars(car.driver)) 13 | 14 | uberBlack = UberBlack("LJD273", Account("Juan Magallán", "87133813"), [ 15 | "Audi", "Mercedes"], ["Cuero"]) 16 | print(vars(uberBlack)) 17 | 18 | paypal = Paypal(1, "juan@correo.com") 19 | print(vars(paypal)) 20 | -------------------------------------------------------------------------------- /POO/Python/payment.py: -------------------------------------------------------------------------------- 1 | class Payment: 2 | id = int 3 | 4 | def __init__(self, id): 5 | self.id = id 6 | -------------------------------------------------------------------------------- /POO/Python/paypal.py: -------------------------------------------------------------------------------- 1 | from payment import Payment 2 | 3 | 4 | class Paypal(Payment): 5 | 6 | email = str 7 | 8 | def __init__(self, id, email): 9 | super().__init__(id) 10 | self.email = email 11 | -------------------------------------------------------------------------------- /POO/Python/route.py: -------------------------------------------------------------------------------- 1 | class Route: 2 | id = int 3 | start = [] 4 | end = [] -------------------------------------------------------------------------------- /POO/Python/uberBlack.py: -------------------------------------------------------------------------------- 1 | from car import Car 2 | 3 | 4 | class UberBlack(Car): 5 | typeCarAccepted = [] 6 | seatsMaterial = [] 7 | 8 | def __init__(self, license, driver, typeCarAccepted, seatsMaterial): 9 | super().__init__(license, driver) 10 | self.typeCarAccepted = typeCarAccepted 11 | self.seatsMaterial = seatsMaterial 12 | -------------------------------------------------------------------------------- /POO/Python/uberPool.py: -------------------------------------------------------------------------------- 1 | from car import Car 2 | 3 | 4 | class UberPool(Car): 5 | brand = str 6 | model = str 7 | 8 | def __init__(self, license, driver, brand, model): 9 | super().__init__(license, driver) 10 | self.brand = brand 11 | self.model = model 12 | -------------------------------------------------------------------------------- /POO/Python/uberVan.py: -------------------------------------------------------------------------------- 1 | from car import Car 2 | 3 | 4 | class UberVan(Car): 5 | typeCarAccepted = [] 6 | seatsMaterial = [] 7 | 8 | def __init__(self, license, driver, typeCarAccepted, seatsMaterial): 9 | super().__init__(license, driver) 10 | self.typeCarAccepted = typeCarAccepted 11 | self.seatsMaterial = seatsMaterial 12 | -------------------------------------------------------------------------------- /POO/Python/uberX.py: -------------------------------------------------------------------------------- 1 | from car import Car 2 | 3 | 4 | class UberX(Car): 5 | brand = str 6 | model = str 7 | 8 | def __init__(self, license, driver, brand, model): 9 | super().__init__(license, driver) 10 | self.brand = brand 11 | self.model = model 12 | -------------------------------------------------------------------------------- /POO/README.md: -------------------------------------------------------------------------------- 1 | # Programación Orientada a Objetos: POO 2 | 3 | Para resolver un problema como desarrollador es de gran utilidad dividirlo en subproblemas y generar un modelo que te permita implementar las soluciones en código. A lo largo de este curso vas a analizar Uber, una de las aplicaciones más usadas en el mundo, para entender cómo está construida. A partir de este análisis harás la extracción y definición de los objetos, clases y métodos que conforman la aplicación, usarás UML para modelarla y, finalmente, usando diferentes lenguajes como Java, PHP y Python harás la implementación de las clases y objetos de la aplicación. 4 | 5 | ## ¿Por qué aprender Programación Orientada a Objetos? 6 | 7 | - **Vas a programar más rápido**. Tener un análisis previo de lo que estás realizando te ayudará a generar código mucho más veloz 8 | 9 | -**Dejas de ser Programador Jr**. Podrás responder preguntas como ¿Qué es encapsulamiento?, ¿Qué es Abstracción?, ¿Qué es Herencia?, ¿Qué es Polimorfismo? en futuras entrevistas de trabajo 10 | 11 | - Dejar de Copiar y Pegar Código. 12 | 13 | - **Analizar** Problemas 14 | - Observación 15 | - Entendimiento 16 | - Lectura 17 | - **Plasmar** Análisis de problemas 18 | - Diagramas 19 | - **Programar** 20 | - Lenguajes de programación 21 | 22 | ### ¿Qué resuelve la Programación Orientación a Objetos? 23 | 24 | La programación Orientada a Objetos nace de los problemas creados por la programación estructurada y nos ayuda a resolver cierto problemas como: 25 | 26 | - **Código muy largo**: A medida que un sistema va creciendo y se hace más robusta el código generado se vuelve muy extenso haciéndose difícil de leer, depurar, mantener. 27 | 28 | - **Si algo falla, todo se rompe**: Ya que con la programación estructurada el código se ejecuta secuencialmente al momento de que una de esas líneas fallara todo lo demás deja de funcionar. 29 | 30 | - Difícil de mantener. 31 | 32 | Para más información ver [Programación orientada a objetos](https://static.platzi.com/media/public/uploads/programacion-orientada-a-objetos-poo_c4774196-cfdb-412e-bae5-210a97d78f8b.pdf) 33 | 34 | ## Paradigma Orientado a Objetos 35 | 36 | La Programación Orientada a Objetos viene de una filosofía o forma de pensar que es la Orientación a Objetos y esto surge a partir de los problemas que necesitamos plasmar en código. 37 | 38 | _**Es analizar un problema en forma de objetos para después llevarlo a código, eso es la Orientación a Objetos.**_ 39 | 40 | Un **paradigma** es una teoría que suministra la base y modelo para resolver problemas. 41 | 42 | El paradigma de Programación Orientada a Objetos se compone de **4 elementos**: 43 | 44 | - Clases 45 | - Propiedades 46 | - Métodos 47 | - Objetos 48 | 49 | Y **4 Pilares**: 50 | 51 | - Encapsulamiento 52 | - Abstracción 53 | - Herencia 54 | - Polimorfismo 55 | 56 | ## Lenguajes Orientados a Objetos 57 | 58 | - **Java**: 59 | – Orientado a Objetos naturalmente 60 | – Es muy útilizado en Android 61 | – Y es usado del lado del servidor o Server Side 62 | - **PHP** 63 | – Lenguaje interpretado 64 | – Pensado para la Web 65 | - **Python** 66 | – Diseñado para ser fácil de usar 67 | – Múltiples usos: Web, Server Side, Análisis de Datos, Machine Learning, etc 68 | - **Javascript** 69 | – Lenguaje interpretado 70 | – Orientado a Objetos pero basado en prototipos 71 | – Pensado para la Web 72 | - C# 73 | - Ruby 74 | - Kotlin 75 | 76 | ## Instalando y configurando VSCode 77 | 78 | Descargar el editor de código desde el sitio web oficial [Visual Studio Code](https://code.visualstudio.com/download). Seleccionar el paquete adecuado para el SO y seguir el proceso de instalación. 79 | 80 | Para soportar cualquier lenguaje visitar [Programming Languages](https://code.visualstudio.com/docs/languages/overview) 81 | 82 | **Plugins for VSCode** 83 | 84 | - **Java** 85 | - Java Extension Pack 86 | - Debugger for Java 87 | 88 | > Para Java es necesario descargar el OpenJDK 89 | 90 | - **Python** 91 | - **PHP** 92 | - PHP Server: Serve your Project with PHP 93 | - **JS** 94 | VSCode como está construido con JS, se integra muy bien y no hay necesidad de instalar nada. 95 | 96 | ## Diagramas de Modelado 97 | 98 | - **OMT**: Object Modeling Techniques. Es una metodología para el análisis orientado a objetos. 99 | 100 | - **UML**: Unified Modeling Language o Lenguaje de Modelado Unificado. Tomó las bases y técnicas de OMT unificándolas. Tenemos más opciones de diagramas como lo son Clases, Casos de Uso, Objetos, Actividades, Iteración, Estados, Implementación. 101 | 102 | ## UML 103 | 104 | Como ya viste UML significa Unified Modeling Language el cual es un lenguaje estándar de modelado de sistemas orientados a objetos. 105 | 106 | ![UML](assets/UML.jpg) 107 | 108 | Las clases se representan así: 109 | 110 | ![Representación de clases](assets/representacion_clases.jpg) 111 | 112 | En la parte superior se colocan los atributos o propiedades, y debajo las operciones de la clase. Notarás que el primer caractér con el que empiezan es un símbolo. Este denotará la visibilidad del atributo o método, esto es un termino que tiene que ver con Encapsulamiento y veremos más adelante a detalle. 113 | 114 | Estos son los niveles de visibilidad que puedes tener: 115 | 116 | - `- private` 117 | - `+ public` 118 | - `# protected` 119 | - `~ default` 120 | 121 | Una forma de representar las relaciones que tendrá un elemento con otro es a través de las flechas en UML, y aquí tenemos varios tipos, estos son los más comunes: 122 | 123 | **Asociación** 124 | 125 | ![Asociación en UML](assets/asociacion.jpg) 126 | 127 | Como su nombre lo dice, notarás que cada vez que esté referenciada este tipo de flecha significará que ese elemento contiene al otro en su definición. La flecha apuntará hacia la dependencia. 128 | 129 | ![Asociación clases](assets/asociacion_clases.jpg) 130 | 131 | Con esto vemos que la ClaseA está asociada y depende de la ClaseB. 132 | 133 | **Herencia** 134 | 135 | ![Herencia](assets/herencia.jpg) 136 | 137 | Siempre que veamos este tipo de fecha se estará expresando la herencia. 138 | La dirección de la flecha irá desde el hijo hasta el padre. 139 | 140 | ![Herencia en UML](assets/herencia_clases.jpg) 141 | 142 | Con esto vemos que la ClaseB hereda de la ClaseA 143 | 144 | **Agregación** 145 | 146 | ![Agregación en UML](assets/agregacion.jpg) 147 | 148 | Este se parece a la asociación en que un elemento dependerá del otro, pero en este caso será: Un elemento dependerá de muchos otros. Aquí tomamos como referencia la multiplicidad del elemento. Lo que comúnmente conocerías en Bases de Datos como Relaciones uno a muchos. 149 | 150 | ![Agregración](assets/agegacion_clases.jpg) 151 | 152 | **Composición** 153 | 154 | ![Composición](assets/composicion.jpg) 155 | 156 | Este es similar al anterior solo que su relación es totalmente compenetrada de tal modo que conceptualmente una de estás clases no podría vivir si no existiera la otra. 157 | 158 | ![Composición](assets/composicion_clases.jpg) 159 | 160 | Estos son los conceptos básicos del Lenguaje de Modelado unificado y las representaciones que tienen sus figuras. 161 | 162 | Para seguir los conceptos de UML y POO, ver los siguientes temas 163 | 164 | - Orientación a Objetos 165 | - Programación Orientada a Objetos. Análisis 166 | - Clases, Objetos y Método Constructor 167 | - Herencia 168 | - Encapsulamiento 169 | - Polimorfismo 170 | -------------------------------------------------------------------------------- /POO/assets/UML.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jocode/Getting-Started/5edf25376e68940e58f9f6adf9e061f749006158/POO/assets/UML.jpg -------------------------------------------------------------------------------- /POO/assets/agegacion_clases.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jocode/Getting-Started/5edf25376e68940e58f9f6adf9e061f749006158/POO/assets/agegacion_clases.jpg -------------------------------------------------------------------------------- /POO/assets/agregacion.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jocode/Getting-Started/5edf25376e68940e58f9f6adf9e061f749006158/POO/assets/agregacion.jpg -------------------------------------------------------------------------------- /POO/assets/asociacion.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jocode/Getting-Started/5edf25376e68940e58f9f6adf9e061f749006158/POO/assets/asociacion.jpg -------------------------------------------------------------------------------- /POO/assets/asociacion_clases.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jocode/Getting-Started/5edf25376e68940e58f9f6adf9e061f749006158/POO/assets/asociacion_clases.jpg -------------------------------------------------------------------------------- /POO/assets/composicion.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jocode/Getting-Started/5edf25376e68940e58f9f6adf9e061f749006158/POO/assets/composicion.jpg -------------------------------------------------------------------------------- /POO/assets/composicion_clases.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jocode/Getting-Started/5edf25376e68940e58f9f6adf9e061f749006158/POO/assets/composicion_clases.jpg -------------------------------------------------------------------------------- /POO/assets/diagrama_uber.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jocode/Getting-Started/5edf25376e68940e58f9f6adf9e061f749006158/POO/assets/diagrama_uber.png -------------------------------------------------------------------------------- /POO/assets/herencia.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jocode/Getting-Started/5edf25376e68940e58f9f6adf9e061f749006158/POO/assets/herencia.jpg -------------------------------------------------------------------------------- /POO/assets/herencia_clases.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jocode/Getting-Started/5edf25376e68940e58f9f6adf9e061f749006158/POO/assets/herencia_clases.jpg -------------------------------------------------------------------------------- /POO/assets/programacion-orientada-a-objetos-poo.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jocode/Getting-Started/5edf25376e68940e58f9f6adf9e061f749006158/POO/assets/programacion-orientada-a-objetos-poo.pdf -------------------------------------------------------------------------------- /POO/assets/representacion_clases.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jocode/Getting-Started/5edf25376e68940e58f9f6adf9e061f749006158/POO/assets/representacion_clases.jpg -------------------------------------------------------------------------------- /POO/herencia.md: -------------------------------------------------------------------------------- 1 | # Herencia 2 | 3 | La **herencia** nos permite crear nuevas clases a partir de otras, se basa en modelos y conceptos de la vida real. También tenemos una jerarquía de **padre e hijo**. 4 | 5 | La herencia permite tener las mismas propiedades de un objeto en particular. Es como si tu papá tiene color cafés, tu posiblemente heredes esta misma característica. La herencia es importante tenerla cuando los objetos tienen propiedades y funcionaliadades similares, esto nos permite matener un código limpio y poco redundante. 6 | 7 | El **Encapsulamiento** es hacer que un dato sea inviolable, inalterable cuando se le asigne un modificador de acceso. 8 | 9 | ```java 10 | // Java 11 | class Student extends Person { 12 | 13 | } 14 | ``` 15 | 16 | ```php 17 | // PHP 18 | class Student extends Person { 19 | 20 | } 21 | ``` 22 | 23 | ```js 24 | // Javascript 25 | student.prototype = new Person(); 26 | ``` 27 | 28 | ```python 29 | # Python 30 | class Student(Person): 31 | ``` 32 | 33 | ## Encapsulamiento 34 | 35 | El **Encapsulamiento** es hacer que un dato sea inviolable, inalterable cuando se le asigne un **_modificador de acceso_**. 36 | 37 | Un sinónimo de encapsulamiento es esconder algo, es decir evitar que un dato sea accedido desde otra parte. 38 | 39 | **Los modificadores de acceso son**: 40 | 41 | - **`public`** Todas las clases 42 | - **`protected`** Clases, paquetes y subclases 43 | - **`default`** Clases y paquetes 44 | - **`private`** Clases 45 | 46 | ## Generando polimorfismo 47 | 48 | **Polimorfismo**: Muchas formas. Poli = muchas, morfismo = formas. _NO es Poliformismo_ 49 | 50 | _**Es construir métodos con el mismo nombre pero con comportamiento diferente.**_ 51 | 52 | Son comportamientos diferentes que tienen las clases, donde un método se comparte entre varias clases y cada una lo implementa como lo requiera. 53 | 54 | - Muchas formas 55 | - Construir métodos con el mismo nombre pero con un comportamiento diferente. 56 | 57 | > Al sobreescribir un método `@Override` es pieza clave que estamos usando polimorfimo 58 | 59 | ## En Resumen 60 | 61 | - **Asociación** 62 | 63 | Como su nombre lo dice, notarás que cada vez que esté referenciada este tipo de flecha significará que ese elemento contiene al otro en su definición. Si recuerdas la clase Car, este contenía una instancia de Driver. La flecha apuntará hacia la dependencia. 64 | 65 | - **Herencia** 66 | 67 | Siempre que veamos este tipo de flecha se estará expresando la herencia. 68 | En nuestro diagrama tuvimos al menos tres familias conviviendo. La dirección de la flecha irá desde el hijo hasta el padre. 69 | 70 | Al grupo de la superclase se puede llamar familia carro, persona, pago, etc- 71 | 72 | - **Composición** 73 | 74 | Pasemos a una de nuestras piezas claves, pues notarás en el centro del diagrama la clase Trip que está vinculada a User, Car, Route y Payment. La composición va a significar una asociación entre estas clases con la diferencia de que para que esta clase pueda vivir forzosamente necesita a las demás. Es decir que estas clases son obligatorias para que la clase Trip pueda existir, esta dependencia obligatoria podríamos expresarla en el método constructor de la clase Trip, pues para que un objeto pueda ser creado dependerá de que los demás existan. 75 | -------------------------------------------------------------------------------- /POO/orientacion_a_objetos.md: -------------------------------------------------------------------------------- 1 | # Orientación a Objetos 2 | 3 | ## Objetos 4 | 5 | Los Objetos son aquellos que tienen propiedades y comportamientos, también serán sustantivos. 6 | 7 | - Pueden ser Físicos o Conceptuales 8 | 9 | Las **Propiedades** también pueden llamarse atributos y estos también serán sustantivos. Algunos atributos o propiedades son nombre, tamaño, forma, estado, etc. Son todas las características del objeto. 10 | 11 | Los **Comportamientos** serán todas las operaciones que el objeto puede hacer, suelen ser verbos o sustantivos y verbo. Algunos ejemplos pueden ser que el usuario pueda hacer login y logout. 12 | 13 | ## Abstracción y Clases 14 | 15 | Una **Clase** se el modelo por el cual nuestros objetos se van a construir y nos van a permitir generar más objetos. 16 | 17 | Analizamos Objetos para crear Clases. Las **Clases** _son los modelos sobres los cuales construiremos nuestros objetos_. 18 | 19 | **Abstracción** es cuando separamos los datos de un objeto para generar un molde. 20 | 21 | ## Modularidad 22 | 23 | La **modularidad** va muy relacionada con las clases y es un principio de la Programación Orientado a Objetos y va de la mano con el Diseño Modular que significa dividir un sistema en partes pequeñas y estas serán nuestros módulos pudiendo funcionar de manera independiente. 24 | 25 | La **modularidad** de nuestro código nos va a permitir 26 | 27 | - Evitar colapsos 28 | - Hacer nuestro código más mantenible 29 | - Legibilidad 30 | - Resolución rápida de problemas 31 | 32 | Una buena práctica es separando las clases en archivos diferentes. 33 | 34 | ## Análisis en Programación Orientada a Objetos. 35 | 36 | 1. Identificar el problema 37 | 2. Identificar los objetos 38 | 3. Definir las clases 39 | 4. Implementar las clases 40 | 41 | Las clases se definen así en los diferentes leguajes de programación 42 | 43 | ```php 44 | // PHP 45 | class Person{ 46 | 47 | $name = ""; 48 | function walk(){} 49 | 50 | } 51 | ``` 52 | 53 | ```java 54 | // Java 55 | class Person { 56 | 57 | String name = ""; 58 | void walk(){} 59 | 60 | } 61 | ``` 62 | 63 | ```python 64 | # Python 65 | class Person: 66 | 67 | name = ""; 68 | def walk(): 69 | 70 | ``` 71 | 72 | ```js 73 | // Javascript 74 | function Person() {} 75 | 76 | Person.prototype.walk() = function() {}; 77 | ``` 78 | 79 | ## ¿Qué es la herencia? 80 | 81 | **Don’t repeat yourself** es una filosofía que promueve la reducción de duplicación en programación, esto nos va a inculcar que no tengamos líneas de código duplicadas. 82 | 83 | Toda pieza de información nunca debería ser duplicada debido a que incrementa la dificultad en los cambios y evolución 84 | 85 | La **herencia** nos permite crear nuevas clases a partir de otras, se basa en modelos y conceptos de la vida real. También tenemos una jerarquía de **padre e hijo**. 86 | 87 | ## Clases, Objetos y Método Constructor 88 | 89 | En python de usa lowerCamelCase para nombrar los archivos, pero para los nombres de las clases se usa UpperCamelCase 90 | 91 | Para agregar soporte de PHP en VSCode, debemos agregar el intérprete en las configuraciones del sistema. 92 | 93 | Los dos codigos que van en la configuracion de VSCODE 94 | 95 | - `"php.executablePath": "C:/xampp/php/php.exe"` 96 | 97 | - `"php.validate.executablePath": "C:/xampp/php/php.exe"` 98 | 99 | Ruta variables de entorno 100 | 101 | - `C:\xampp\php` 102 | 103 | ## Objetos, método constructor y su sintaxis en código 104 | 105 | Los **objetos** nos ayudan a crear instancia de una clase, el objeto es el resultado de lo que modelamos, de los parámetros declarados y usaremos los objetos para que nuestras clases cobren vida. 106 | 107 | Los **métodos constructores** dan un estado inicial al objeto y podemos añadirle algunos datos al objeto mediante estos métodos. Los atributos o elementos que pasemos a través del constructor serán los datos mínimos que necesita el objeto para que pueda vivir. 108 | 109 | Declaración de objetos en los diferentes lenguajes 110 | 111 | ```java 112 | // Java 113 | Person person = new Person(); 114 | ``` 115 | 116 | ```python 117 | # Python 118 | persona = Person() 119 | ``` 120 | 121 | ```js 122 | // Javascript 123 | var person = new Person(); 124 | ``` 125 | 126 | ```php 127 | // php 128 | $person = new Person(); 129 | ``` 130 | 131 | **Método constructor** 132 | 133 | - Dar un estado inicial al objeto 134 | - Tiene el mismo nombre de la clase (En algunos lenguajes) 135 | - Son los parámetros mínimos que necesita el objeto para que pueda vivir. 136 | 137 | Métodos constructores en distintos lenguajes 138 | 139 | ```php 140 | // PHP 141 | class Person{ 142 | 143 | public $name; 144 | 145 | public function __construct($name){ 146 | $this->name = name; 147 | } 148 | 149 | } 150 | ``` 151 | 152 | ```java 153 | // Java 154 | class Person { 155 | 156 | String name = ""; 157 | 158 | public Person(String name){ 159 | this.name = name; 160 | } 161 | 162 | } 163 | ``` 164 | 165 | ```python 166 | # Python 167 | class Person: 168 | 169 | name = ""; 170 | 171 | def __init__(self, name): 172 | self.name = name; 173 | 174 | ``` 175 | 176 | ```js 177 | // Javascript 178 | function Person(name) { 179 | this.name = name; 180 | } 181 | ``` 182 | 183 | En python con **`print(vars(car))`** se imprimen todos las variables del objeto. 184 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Introducción a la programación 2 | 3 | ## Qué es la programación 4 | 5 | Es el proceso de diseñar, codificar, depurar y mantener el código fuente de un programa de computadora. 6 | 7 | Es el arte que nos permite representar por medio de código una de las muchas soluciones para resolver un problema. Cada programador tiene sus propias características. 8 | 9 | La **creatividad** es una cualidad muy importante para un programador, necesitamos resolver problemas y debemos imaginar soluciones. 10 | 11 | > Los pequeños detalles hacen una gran diferencia. 12 | 13 | ![Programación](img/programacion.jpg) 14 | 15 | ## ¿Cómo funciona la programación? 16 | 17 | Le damos órdenes a la computadora para realizar una acción. En programación existen dos elementos importantes: 18 | - **Código** Instrucciones que le damos a la computadora 19 | - **Intérprete y/o compilador** Algunos lenguajes pueden ser interpretados y otros compilados. Este elemento nos permite el código a un lenguaje máquina (1 y 0) 20 | 21 | > NO puedes usar un mismo lenguaje para todo, para eso existen distintas herramientas. 22 | 23 | ## ¿En dónde se utiliza la programación? 24 | 25 | Se usa en todos lados. Los sistemas operativos y embebidos funcionan con código. No importa a lo que te dediques, simpre podrás dar solución a un problema. 26 | De una pequeña idea surge grandes cosas. 27 | 28 | > Cree en lo que haces y eso definirá tu futuro. 29 | 30 | ## Ventajas de ser programador. 31 | 32 | Algunas ventajas de ser programador son: 33 | - La remuneración (USD$ 1600 - 1900) 34 | - Puedes trabajar en cualquier lugar, tiene muchas salidas. 35 | - Capacidad de resolver problemas desde diferentes perspectivas 36 | 37 | **Importante** Hacer proyectos para ganar experiencia. Desarrollar Apps, páginas web, etc. 38 | 39 | ## Cualidades de un programador 40 | 41 | - Creatividad 42 | - Siempre estás aprendiendo 43 | - Es autodidacta. (Hambre de aprender más y más) 44 | - Perseverancia > Talento 45 | - Comunicación. Ser claros y más si se trabaja en equipo 46 | 47 | 48 | ## Lenguajes de programación 49 | 50 | Los lenguajes de programación nos permiten comunicarnos con la computadora. 51 | 52 | **Qué es un lenguaje de programación** 53 | Es un lenguaje que contiene reglas específicas que nos permiten realizar o controlar ciertas acciones en una computadora. Es el puente de comunicación entre la persona y la máquina. 54 | 55 | El intérprete traduce el código del lenguaje de programación a lenguaje máquina; binario (1 y 0). 56 | 57 | Los lenguajes de programación se dividen en dos grupos: 58 | - Lenguajes de alto nivel 59 | - Lenguajes de bajo nivel 60 | 61 | > NO hay mejor lenguaje, algunos hacen tareas mejor que otros. Todo depende de lo que quieras hacer. 62 | 63 | ## Lenguajes de Alto y Bajo Nivel 64 | 65 | Cada uno de ellos tienen una característica importante 66 | 67 | - **Lenguajes de alto Nivel** Los comprendemos mejor las personas. Algunos lenguajes de alto nvel son: 68 | - Python 69 | - PHP 70 | - Ruby 71 | - Java 72 | - C# 73 | 74 | Las ventajas de ellos es que son portables, sencillos y fácil de leer y mantener el código 75 | 76 | - **Lenguajes de bajo Nivel** Lo comprende mejor la máquina. Algunos lenguajes de bajo nivel son: 77 | - Ensamblador 78 | 79 | La ventaja es que se compilan mucho más rápido y optimizan la memoria. 80 | 81 | - **Lenguajes de nivel medio** Por ejemplo **C**. No se pueden considerar de bajo nivel porque usa una sintaxis legible, y se puede manejar fácilmente el hardware de un equipo, escribiendo código optimizado. 82 | 83 | ## Lenguajes interpretados y compilados 84 | 85 | Podemos clasificar los lenguajes en 2 tipos. 86 | 87 | - **Lenguajes compilados** Usan un programa llamada compilador, para traducir el código a lenguaje máquina y crea un archivo ejecutable 88 | 89 | 90 | - **Lenguajes interpretados** Usan un programa llamado intérprete, para poder traducir lo escrito a lenguaje máquina. El código es leido por el intérprete y no crea archivos ejecutables `.exe` 91 | 92 | 93 | ## Algoritmos 94 | 95 | Es un conjunto de reglas ordenadas, definidas y finitas. Que nos permite realizar una actividad. 96 | 97 | ![Algoritmos](img/algoritmo.png) 98 | 99 | 100 | ## Instalación de Python en windows 101 | 102 | Debemos instalar el intérprete de python en windows para poder empezar a escribir nuestras primera líneas de código. También debemos descargar un editor de código. Puede ser Visual Studio Code. 103 | 104 | *Para más información ver* [Python VSCode](https://codigofacilito.com/articulos/python-vsc) 105 | 106 | 107 | **Para ver el contenido de python** ir al directorio [python](python) 108 | 109 | 110 | ## Configurando VS code para desarrollo 111 | 112 | ### **plugins** 113 | 114 | - **Prettier - Code formatter** Nos sirve para formatear el código y que sea más legible. 115 | - **Color Highlight** Nos colorea los hexadecimales que definamos en los estilos. 116 | - **Bracket Pair Colorizer** Nos colorea los llaves, ubicándolos por bloques. 117 | - **Live Server** Ejecuta un servidor local con recargas en vivo para recargar páginas estáticas o dinámicas. 118 | - **Path Intellisense** Completa automáticamente los nombres de archivo que tengamos en los directorios 119 | - **Auto Rename Tag** Cambia automáticamente el nombre de la etiqueta HTML/XML emparejada, igual que visualmente lo hace el IDE de Visual Studio. 120 | - **Material Icon Theme** Íconos de material design para los proyectos que abramos en VSCode 121 | 122 | ### Instalando WSL on Windows 10 123 | 124 | - [:notebook: Windows Subsystem for Linux Installation Guide for Windows 10](https://docs.microsoft.com/en-us/windows/wsl/install-win10) 125 | 126 | Para la instalación de WSL segumos los pasos anteriores. Es importante tener instalado Windows 10. 127 | 128 | Luego, que se tenga habilitada WSL. Descargamos los siguiente desde la windows store. 129 | - Ubuntu 20.04 LTS 130 | - Windows terminal 131 | 132 | Usando el comando pwd, nos indica en qué directorio estamos trabajando. 133 | 134 | - **`pwd`** 135 | - **`cd`** chage directory 136 | - **`ls`** list directory 137 | - **`cd /`** Vamos a la raíz del SO 138 | - **`cd mnt`** Encontramos los discos del PC 139 | - **`cd ~`** Con este comando nos dirije al home del usuario instalado 140 | 141 | 142 | **Creando una carpeta para ls proyectos** 143 | 144 | - **`mkdir dev`** Con este comando creamos un directorio 145 | - **`touch index.html`** Con este comando creamos un archivo 146 | - **`mv index.html dev`** Mueve un archivo dentro de un directorio (Aplica también para carpetas) 147 | - **`cat file`** Muestra el contenido de los archivos. 148 | - **`man cat`** Muestra la documentación de cada comando 149 | 150 | ## Actualizar los paquetes 151 | 152 | Se actualiza los repositorios del sistema operaitivo 153 | - **`sudo apt-get update`** 154 | - **`sudo apt-get upgrade`** 155 | 156 | - **`sudo apt install nodejs`** Instala nodejs 157 | - **`node -v`** Para ver la versión de nodejs instalada. 158 | 159 | - **`sudo apt install npm`** Instala node package manager 160 | 161 | ### Configurando el proyecto con ReactJS 162 | 163 | *__npx__* Instala los paquetes de nodeJS, lo que hace es descargar el programa y ejecutarla borrando los instaladores. 164 | 165 | - **`npx create-react-app react_first`** 166 | 167 | Para darle permisos a un directorio en Linux, podemos usar el comando. 168 | 169 | - **`sudo chown -R user path/to/folder`** 170 | 171 | ### Borrar directorio en linux 172 | 173 | - **`rm directory`** Borra un directorio vacío 174 | - **`rm -rf directory`** Borra un directorio con los archivos que tenga dentro (Borrado recursivo) 175 | 176 | - **`sudo apt install git`** Con esto se instala `git` en linux 177 | 178 | ### Vincular clave SSH e github 179 | 180 | - **`ssh-keygen -t rsa -b 4096 -C email`** 181 | 182 | Usamos el ssh-agent 183 | 184 | - **`eval "$(ssh-agent -s)"`** Evalúa si hay un agente ejecutando 185 | 186 | Para modificar los datos de usuario en git, usamos 187 | 188 | - **`git config --global user.email [email]`** 189 | - **`git config --global user.name [name]`** 190 | 191 | Para verificar que tenemos acceso a github, podemos usar el comando 192 | 193 | - **`ssh -T git@github.com`** -------------------------------------------------------------------------------- /assets/Technical English for Professionals Course.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jocode/Getting-Started/5edf25376e68940e58f9f6adf9e061f749006158/assets/Technical English for Professionals Course.pdf -------------------------------------------------------------------------------- /assets/curso-trabajar-como-freelancer.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jocode/Getting-Started/5edf25376e68940e58f9f6adf9e061f749006158/assets/curso-trabajar-como-freelancer.pdf -------------------------------------------------------------------------------- /basicos-git.md: -------------------------------------------------------------------------------- 1 | # Qué es Git 2 | 3 | Version control systems (VCS) for tracking changes in computeer files 4 | 5 | * Distributed version control 6 | * Coordinates works between multiple developers 7 | * Who made what change and when 8 | * Revert back any time 9 | * Local & remotes repos 10 | 11 | ## Conceptos de Git 12 | 13 | * Mantiene el seguimiento del código en la historia 14 | * Toma (Snapshots) de los archivos 15 | * Usted decide cuando hacer los snapshot a través de un commit (Confirmación, anotación) 16 | 17 | 18 | ## Comandos básicos 19 | 20 | En git hay 3 estados: 21 | 1. El **working directory** Donde se va a estar trabajando con todos los archivos 22 | 2. El **staging area** Es el lugar donde prepara los archivos que va a ser guardados en el repositorio 23 | 3. **repository** Son los archivos que se guardan como snapshots 24 | 25 | * `git init` Inicia un repositorio 26 | 27 | * `git add ` Agrega un archivo a working directory 28 | 29 | * `git status` Muestra el estado de los archivos 30 | 31 | * `git commit` Agrega los archivos del staging area al repositorio 32 | 33 | * `git push` Envía los cambios en tu copia local a un repositorio remoto 34 | 35 | * `git pull` Trae los cambios de un servidor remoro 36 | 37 | * `git clone` Copia el repositorio desde un repositorio remoto 38 | 39 | * `git checkout -- file` Revierte los cambios de los archivos 40 | 41 | * `git diff` Para ver las diferencias hechas en los archivos 42 | 43 | 44 | - **ls** Lista los archivos que hay en ese directorio 45 | - **pwd** Ver la ruta en la terminal 46 | 47 | En el archivo **.gitignore** podemos colocar los archivos y carpetas que queremos que git ignore y no los agregue al repositorio -------------------------------------------------------------------------------- /comandos_git.md: -------------------------------------------------------------------------------- 1 | # Comandos para la terminal en Git :sunglasses: 2 | 3 | - **`$ git init`** 4 | Rastrea todos los archivos que tengas en un directorio o carpera, es decir, con este comando es que creas 5 | el inicio de git, para que funcione como un CVS 6 | 7 | 8 | 1. Agregar Usuario 9 | - **`$ git config --global user.name "Mi nombre"`** 10 | 11 | 2. Agregar Email de Usuario (Debe ser el que tenga en la cuenta de GitHub, para sincronizar los proyectos) 12 | - **`$ git config --global user.email "email"`** 13 | 14 | 3. LLaves SSH, alternativas al protocolo FTP 15 | - El FTP No lleva control de Versiones del Software 16 | - Los archivos FTP no son seguras, al enviar datos al servidor 17 | - Las claves SSH encripta los archivos incluso las imagenes 18 | 19 | 20 | ## Usando SSH :key: 21 | 22 | - Para comprobar claves SSH existentes 23 | - `$ ls -al ~/.ssh` -> # Lists the files in your .ssh directory, if they exist 24 | 25 | - `$ ssh-keygen` -> Genera la llave 26 | 27 | - `$ ssh-keygen -t rsa -b 4096 -C "your_email@example.com"` Genera la llave, le indicamos el email el cuál usará para la conexión 28 | 29 | - `$ cd .ssh` -> Para ingresar a la carpeta donde se guarda la Llave SSH 30 | 31 | - `$ cat ` -> Con este comando, le digo a git, que me mueste la llave, y con ella la conecto a gitHub para que sincronice los proyectos, la llave es única, e identifica al ordenador 32 | 33 | Copiar la llave pública (id_rsa.pub) en la cuenta de GitHub, colocar el nombre y la clave, y guardar los cambios. 34 | 35 | - `$ eval $(ssh-agent -s)` -> Es el agente que mantiene las claves publicas y privadas y verifica las claves para ese servicio 36 | 37 | - `$ ssh-add ~/.ssh/id_rsa` -> Para agregar la contraseña y que git no la pregunte cada vez que haga un pull o push, el agente se inicia manualmente cada vez que se abre el shell o bash de git 38 | 39 | - `$ shh -T git@github.com` -> Confirmar si la llave SSH está vinculada con la cuenta de GitHub 40 | 41 | ## Vincular la llave SSH con github 42 | 43 | - `$ clip < ~/.ssh/id_rsa.pub` -> Copies the contents of the id_rsa.pub file to your clipboard 44 | 45 | - Luego en la cuenta de github, vamos a `settings -> SSH and GPG keys -> New SSH key` 46 | - Le damos un nombre a la llave para identificar el computador que se conectar 47 | - Copiamos la llave en el campo "Key" 48 | Finalmente le damos en el botón "Add SSH key" 49 | 50 | 51 | **_Para más información, visitar los enlaces_** 52 | - https://help.github.com/articles/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent/ 53 | - https://help.github.com/articles/working-with-ssh-key-passphrases/ 54 | 55 | 56 | Para auto ejecutar en **ssh-agent** en Git para windows, debemos crear un archivo `~/.profile o ~/.bashrc` 57 | **~** Hace referencia a la carpeta del perfil del usuario, para comprobarlo usar el comando 58 | - `$ echo ~` 59 | 60 | To run ssh-agent automatically add following lines on ~/.profile o ~/.bashrc 61 | ```bash 62 | env=~/.ssh/agent.env 63 | 64 | agent_load_env () { test -f "$env" && . "$env" >| /dev/null ; } 65 | 66 | agent_start () { 67 | (umask 077; ssh-agent >| "$env") 68 | . "$env" >| /dev/null ; } 69 | 70 | agent_load_env 71 | 72 | # agent_run_state: 0=agent running w/ key; 1=agent w/o key; 2= agent not running 73 | agent_run_state=$(ssh-add -l >| /dev/null 2>&1; echo $?) 74 | 75 | if [ ! "$SSH_AUTH_SOCK" ] || [ $agent_run_state = 2 ]; then 76 | agent_start 77 | ssh-add 78 | elif [ "$SSH_AUTH_SOCK" ] && [ $agent_run_state = 1 ]; then 79 | ssh-add 80 | fi 81 | 82 | unset env 83 | ``` 84 | Now, when you first run Git Bash, you are prompted for your passphrase: 85 | 86 | 87 | 4. Navegar por directorios y crear nuevas carpetas 88 | 89 | - `$ cd` -> Current Directory 90 | - `$ cd ..` -> Se sale una carpeta más 91 | - `$ mkdir ` -> Crea una nueva carpeta 92 | - `$ > file.ext` -> Crea un nuevo archivo 93 | 94 | 5. Traer repositorios desde GitHub 95 | 96 | - `$ git remote add origin ` -> Indica la ruta del repositorio que quiero traer 97 | - `$ git pull` -> Descargo todos los archivos del repositorio remoto a la computadora 98 | 99 | 100 | 6. Conflictos con el archivo index.lock 101 | 102 | - `$ rm -f ./.git/index.lock` 103 | 104 | 105 | 106 | **TIPS** 107 | 108 | En algunas ocasiones git no deja trabajar porque el index esta bloqueado y al realizar commit no lo toma, porque dice que ese directorio tiene otro proceso entonces le da la solucion de que elimine ese archivo 109 | 110 | `fatal: Unable to create '/path/my_proj/.git/index.lock': File exists.` 111 | 112 | If no other git process is currently running, this probably means a 113 | git process crashed in this repository earlier. Make sure no other git 114 | process is running and remove the file manually to continue. 115 | 116 | 117 | [Markdown Emojis on Github :eyes:](https://gist.github.com/rxaviers/7360908) -------------------------------------------------------------------------------- /css/style.css: -------------------------------------------------------------------------------- 1 | @import url('https://fonts.googleapis.com/css?family=Nunito'); 2 | 3 | * { 4 | padding: 0 auto; 5 | margin: 0 auto; 6 | font-family: 'Nunito', sans-serif; 7 | } 8 | 9 | body { 10 | font-family: 'Josefin Sans', sans-serif; 11 | } 12 | 13 | h1 { 14 | text-align: center; 15 | } 16 | 17 | /* Estilos para los textos */ 18 | .text{ 19 | 20 | } 21 | .text-center { 22 | text-align: center; 23 | } 24 | .text-white { 25 | color: white; 26 | } 27 | 28 | .header { 29 | 30 | } 31 | .header-bg { 32 | background-color: salmon; 33 | height: 150px; 34 | width: 100%; 35 | } 36 | 37 | .article { 38 | 39 | } 40 | .article-bg { 41 | width: 80%; 42 | padding: 10px 10px 10px 10px; 43 | background-color: powderblue; 44 | } 45 | 46 | .flex { 47 | display: flex; 48 | flex-wrap: wrap; 49 | justify-content: center; 50 | align-items: center; 51 | } 52 | -------------------------------------------------------------------------------- /english.md: -------------------------------------------------------------------------------- 1 | # Curso de Inglés Técnico para Profesionales 2 | 3 | ## How to create a professional profile? 4 | 5 | - **Why is it important to work on our professional profile?** 6 | 7 | - Professional Profile 8 | - Workplace Communication 9 | - Tech world 10 | - Content 11 | 12 | Better Job, Salaries, Recognized 13 | - Writting a goob descriptive professional profile 14 | - Creating a new updating your CV 15 | - Preparing yourself for an interview 16 | - Being able to communicate in your workplace: email, reports, presentations, etc. 17 | - Creating content for your social networks 18 | - Creating a professional portfolio 19 | - Participating un events 20 | 21 | > First, I want to learn English, because I **like it** ... Also, because I want to be a **_better version of myself_**, and this course is an excellent resource to reach my goals. 22 | 23 | 24 | ### Glossary - How to create a professional profile? 25 | 26 | Analysis: Detailed examination of something 27 | 28 | Bachelor degree: Is an undergraduate degree awarded by universities 29 | 30 | Backend developer: A programmer who creates the backend of a website, software or information system 31 | 32 | Business: A commercial activity 33 | 34 | Careers: An occupation undertaken for a significant period of time 35 | 36 | CEO - Chief executive officer: The highest ranking person in a company or other institution 37 | 38 | Cheerful: Happy and optimistic 39 | 40 | City of residence: The city where a person lives 41 | 42 | Collaborate: To work jointly with someone 43 | 44 | Colleagues: A person with whom you work 45 | 46 | Communications: The act of exchanging information 47 | 48 | Company: A commercial business 49 | 50 | Confident: Feeling or believing trust in oneself 51 | 52 | Content marketing: A type of marketing which is focused on creating content to attract clients 53 | 54 | Copy-writing: Act of writing text for advertising purposes 55 | 56 | Curriculum Vitae - CV: A brief account of a person’s, qualifications, and previous occupations 57 | 58 | Curious: Eager to know and learn things 59 | 60 | CTO - Chief technology officer: The person in charge of technology operations within a company 61 | 62 | Descriptive: A detailed characterization of something 63 | 64 | Design: A plan or drawing that shows the functionalities of something 65 | 66 | Designer: A person who plans the functionalities of something 67 | 68 | Determined: Having a firm decision or thought about something 69 | 70 | Draw: Produce a diagram of a person, an animal or an object 71 | 72 | Entrepreneur: A person who owns a business or company 73 | 74 | Experience: The events a person has lived and that has left impression 75 | 76 | Event: A thing that happens or takes place 77 | 78 | Feedback: Information about the performance of a person in a given task 79 | 80 | Fields: A particular branch of study 81 | 82 | Frontend developer: A developer who creates websites or web applications with which the user can interact directly 83 | 84 | Goal-oriented: Focused on achieving one objective only 85 | 86 | Graduate education: Degrees obtained after the bachelor education 87 | 88 | Growth: Something that has grown over time 89 | 90 | Growth team: The team that is in charge of expanding the value of a company 91 | 92 | Job: A paid position of regular employment 93 | 94 | Junior: Low or lower in rank and status 95 | 96 | Illustrator: A person who draws and creates pictures 97 | 98 | Improve: To make or become better 99 | 100 | Interview: A meeting of people face to face 101 | 102 | Leader: A person who commands a group 103 | 104 | Logic: Reasoning conducted according to strict parameters of validity 105 | 106 | Marketing professional: A person who is in charge of running marketing campaigns 107 | 108 | Master’s degree: A degree awarded by university upon the completion of a course of study demonstrating master knowledge of a field 109 | 110 | Portfolio: A folder which contains samples of work, like drawings, projects and outcomes 111 | 112 | Position: The role that a person assumes in a company 113 | 114 | Product areas: The area in charge of developing a product 115 | 116 | Proactive: Controlling the situation and proposing new solutions 117 | 118 | Professional profile: A short description of a person in their professional dimension 119 | 120 | Programmer: A person who writes computer programs 121 | 122 | Project: An enterprise that is planned to achieve a goal 123 | 124 | Project Manager: The person in charge of a project 125 | 126 | Organize: Arrange something systematically 127 | 128 | Outgoing: Friendly and sociable 129 | 130 | Outstanding: Exceptionally good 131 | 132 | Recognition: The acknowledgement of a person within a given field 133 | 134 | Research: The systematic study of a field 135 | 136 | Sales: The exchange of commodities for money 137 | 138 | Sensitive: Highly responsive or susceptible 139 | 140 | Senior: With high or higher rank 141 | 142 | Skill: The ability to do something 143 | 144 | Speciality: A subject of study or line of work 145 | 146 | Social networks: A network of social interactions. A website dedicated to social interactions 147 | 148 | Social relationships: Any relation between two individuals 149 | 150 | Sociable: Willing to talk, interact with others and engage in social activities 151 | 152 | Software: Programs used by a computer 153 | 154 | Start-up: A newly established business 155 | 156 | Strategy: A plan to achieve a specific goal 157 | 158 | Strengths: The things a person considers his or her qualities 159 | 160 | Stress: The state of mental tension 161 | 162 | Support professional: A professional in charge of assisting customers 163 | 164 | Talent: Natural aptitude or skill 165 | 166 | Task: An activity to be done 167 | 168 | Teamwork: The action of a group, especially when is effective 169 | 170 | Tech-world: Industry of technology 171 | 172 | UI designer: The person in charge of designing the interface for the user 173 | 174 | Update: Bring something to a new version 175 | 176 | UX designer: The person in charge of designing the user experience 177 | 178 | Visualize: Form a mental image of a person, an object or an event 179 | 180 | Wardrobe: A person’s entire collection of clothes 181 | 182 | Weaknesses: The things that a person considers he or she needs to work on 183 | 184 | Webinars: A seminar conducted over the internet 185 | 186 | Workflows: A sequence of processes to complete a specific task 187 | 188 | Workplace: The physical place in which a person performs his or her work 189 | 190 | 191 | ### Using specific vocabulary for careers in Information Technology 192 | 193 | I really like everything. I am currently a developer, although I design applications, logos, etc. for me. 194 | 195 | I **like** to get **involved in everythin**g from the conception of the idea to launch the project to the market. _In the not too distant future, I would like to take my own venture forward._ 196 | 197 | 198 | ### How to create a successful profile? 199 | 200 | To create your professional profile you must identify **what you can do, what you like and what you are really good at**. Try writing a list for each of them. 201 | 202 | Once you are clear about the things that make you stand out, you can move on to build your professional profile. Review the examples and try to build yours. 203 | 204 | When you are building your profile you should be very descriptive in terms of experience. Do not forget to add adjectives that allow you to talk about your personality, which is also important to include. Remember that recruiters want to know about your professional experience but also how you are on a personal level. 205 | 206 | - **Adjetives** 207 | - Outgoing 208 | - Curious 209 | - Proactive 210 | - Sociable 211 | - Goal-oriented 212 | - Cheerful 213 | 214 | - **Academic achievements** 215 | 216 | > Frontend developer with experience in Javascript, HTML, CSS, CSS preprocessors, ReactJS, VueJS and Android developer. I also work as a backend developer with python, PHP and NodeJS. 217 | 218 | > I like to learn every day, work as a team, I’m curious and I like to create tools that serve people. **_My goal is to help people through technology_** 219 | 220 | 221 | ### Creating your curriculum vitae 222 | 223 | **How to make a good CV?** 224 | A brief description 225 | - Personal information 226 | - Experience 227 | - Education 228 | - Software 229 | - Skills 230 | 231 | 232 | ### Preparing yourself for a job interview 233 | 234 | - When do you feel confident? 235 | - What are your qualities? 236 | - Why do you think this company needs you? 237 | - How can you exceed the positions expectations? 238 | 239 | - **Strengths** 240 | - Organize 241 | - Teamwork 242 | - Leadership 243 | - I like to learn 244 | - **Weaknesses** 245 | - In some cases multitasking 246 | - Patience 247 | - Perfectionist 248 | 249 | 250 | 251 | ### Good strategies for writing in the workplace 252 | 253 | **In this class we will focus on how to write emails, reports and communication via chat.** 254 | 255 | - **Emails**: Each time you write one notice the extension. You must find the balance between what you want to say and the importance of that information for the person who is going to read it. 256 | 257 | - **Reports**: The structure of a good report depends on the data and statistics. Check the expressions that you can use according to what you want to achieve with your report. 258 | 259 | - **Chats**: Conversations via chat are usually more informal than in other channels. There are recognized expressions that are used in English, anywhere in the world, that can help you to be much faster and more effective. 260 | 261 | 262 | 263 | ## How to create content to enhance your professional profile 264 | 265 | ### How to create content to enhance your professional profile 266 | 267 | Nowadays everything is about content. Content gives you the possibility of entering into people’s lives without being intrusive. Right now, all brands, organizations and people that want to be successful create content so their audience and users feel they have something to learn. In this sense, it is important to create a content marketing strategy which allows you to touch people who surround you. 268 | 269 | - **What is the most common way to create a content strategy?** 270 | 271 | For starters, it is necessary to **identify the type of audience** you are communicating with. Knowing their **profile** is going to allow you to recognize the things that might or might not work with them. Consider that it’s different to be a teacher of math, than being a dev who works in San Francisco. With this in mind, you can start creating a map which includes the **topics** that you audience might like the most. 272 | 273 | - **There are many formats to reach your audience** 274 | 275 | Creating content for the audience does not need to be so **rigid**. In fact, you can show your audience that you have many **channels** to teach them things. For instance, you can create **blog posts, videos, webminars, infographics**, instagram stories, and more. Just make sure what the channels are used by the audience you aim to reach and start creating **suitable** content. 276 | 277 | - **Do it frequently** 278 | 279 | Creating content is not a matter of one time, one week or one month, if you want that your content **strategy** works you need to maintain your audience **updated**. To do this, it is advisable to create a **calendar** that helps you determine the time in which is pertinent to publish content. This can be as simple as having an **excel document** where you write the topics you want to cover and the **dates** to publish them. 280 | 281 | These three tips are going to help you create successful content and get recognition in your work environment. 282 | 283 | ### How to use English in your social networks? 284 | 285 | The use of social networks can be very useful when you are looking for a better job. In this class you will learn how to create content for specific social networks. 286 | 287 | - Be very careful with the way you write (spelling and writing). 288 | - Use appropriate vocabulary Don´t be redundant with adjectives and verbs. 289 | - Try to be as professional as possible if your profiles are public. 290 | - Avoid informal language and abbreviations. 291 | - Keep it professional 292 | 293 | 294 | ### Writing good blog posts 295 | 296 | Writing articles for a blog is something that can strengthen your personal brand, and doing it in English can help you better position yourself in different markets. 297 | 298 | - Select a topic that you would like to write about. 299 | - Identify the aspects that you will cover in the article and divide them into fragments. 300 | - Write a draft that includes all the details you will consider. 301 | - Read the draft or ask someone else to read it to get feedback. 302 | - Make sure your content is SEO friendly. 303 | 304 | In the links section you will find an example of bad practices for you to review and propose how to improve. 305 | 306 | [The worst SEO Blog Ever](https://worstseoblogever.wordpress.com/) 307 | 308 | 309 | ## English for programming, marketing and business 310 | 311 | ### Vocabulary for Programming 312 | 313 | - Programming Languages 314 | - Features 315 | - Develop Sites 316 | - Programs 317 | - Algorithms 318 | - Scope 319 | - Steps 320 | - Flowchart 321 | - Graphical representation 322 | - Syntax 323 | - General-purpose 324 | - Backend 325 | - Web Project 326 | - HTML 327 | - High-level 328 | - Weakly-type 329 | - Interpreted Language 330 | - Frameworks 331 | - Libraries 332 | - Angular 333 | - React 334 | - Multiparadigm 335 | - Readeble 336 | - Indentation 337 | - Code blocks 338 | - Parenthesis 339 | - Brackets 340 | - Coders 341 | - Lines of code 342 | - Open source 343 | - Productive 344 | - Functional programming 345 | - Interpretative programming 346 | - Object-oriented 347 | 348 | 349 | ### Best strategies to learn English 350 | 351 | We have learned vocabulary for programmers. Now we will see strategies that you can adopt to keep improving. 352 | 353 | - Read the documentation of the tools you use 354 | - Pay attention to the names of the commands and the syntax of the programming languages you use. 355 | - Participate in forums and events. 356 | 357 | 358 | ### Vocabulary for Marketing 359 | 360 | - Consumer 361 | - Brand 362 | - Cost 363 | - Distribution 364 | - Label 365 | - Launch 366 | - Market reserach 367 | - PR - Public Relations 368 | - Ad copy 369 | - Banner Ad 370 | - Tracking 371 | - CPC - Cost per Click 372 | - CPA - Cost per Acquisition 373 | - LTV - Life Time Value 374 | - MRR - Monthly Recurring Revenue 375 | - Creative stategy 376 | - Demographics 377 | - Campaign Traffic 378 | - Impressions 379 | - Strategic MarketPlanning 380 | - Content Strategy 381 | - Google Adwords 382 | - facebook Ads 383 | - Chanels 384 | - Audience 385 | - Convert 386 | - Display 387 | - Customer Persona 388 | - Age 389 | - Service 390 | - Social media 391 | - Benefits 392 | - Bussiness 393 | - Invest 394 | - Search 395 | - Blog post 396 | - Email arketing 397 | - Promotions 398 | - Discounts 399 | - Promotions 400 | - Discounts 401 | - Updates 402 | - Killer campaigns 403 | 404 | 405 | ### How to create good copy for marketing campaigns 406 | 407 | - Keep it short and strong 408 | - Use "you" 409 | - Know your audience 410 | - Focus on one objetive only 411 | 412 | 413 | ### Business vocabulary overview 414 | 415 | - **Organize**: To arrange something 416 | - **Competitor**: Another business that has a similar service 417 | - **Public Relation (PR)**: The strategy a company creates to appear in relevan media 418 | - **After-sales service**: It is the support that bussinesses provide to ther clients after the purchase 419 | - **Stategy**: A plan that has been designed to achieve a goal 420 | - **Team**: The people that work in a company or a project 421 | - **Headquarters** The place where the main office of a company is located 422 | - **Product** The thing that you offer and sell to you clients 423 | - **Investors** People who give to a company to grow their business 424 | - **Clause** A statement in a contract 425 | 426 | 427 | ### Tips for creating a successful pitch in English 428 | 429 | - Take maximum 10 minutes 430 | - Explain what your product or service really is 431 | - The idea is to sell your product 432 | - Know the audience 433 | - Formal tone 434 | - Informal tone 435 | - Explain your marketing strategy 436 | - **Show enthusiasm** 437 | 438 | (Practice your pitch) 439 | -------------------------------------------------------------------------------- /estrategias_aprender_efectivamente.md: -------------------------------------------------------------------------------- 1 | # Curso de Estrategias para Aprender en Línea Efectivamente 2 | 3 | 4 | ## Estilos de aprendizaje 5 | 6 | ### Tipos de pensamiento 7 | 8 | La neurociencia es el campo de la ciencia que se encarga de estudiar el sistema nervioso. Hay muchos estudios e investigaciones al respecto pero todavía no tenemos certeza total de cómo funciona nuestro cerebro. 9 | 10 | Según la doctora Barbara Oakley existen dos tipos de pensamientos: 11 | 12 | - **Enfocado:** Cuando nos concentramos en un largo periodo de tiempo ininterrumpido. Podrías concentrarte tratando de aprender algo por muchas horas. Este tipo de pensamiento es adecuado cuando ya tienes una base de conocimiento. 13 | 14 | - **Difuso:** Cuando nos encontramos ante problemas nuevos. Cuando partes desde cero y quieres aprender algo nuevo. Lo mejor es usar este tipo de pensamiento cuando estudias algo nuevo (por ejemplo, en Platzi). Se trata de estudiar con interrupciones de tiempo. La técnica pomodoro te ayudará mucho en este tipo de pensamiento. 15 | 16 | 17 | > **Libro recomendados** Abre tu mente a los números *Barbara Oakley* 18 | 19 | 20 | ### ¿Qué es el aprendizaje? 21 | 22 | **Aprender** es la capacidad de adquirir conocimiento. 23 | 24 | Si quisiéramos abstraer la palabra *aprender* necesitamos definir tres palabras: **Perseguir, Atrapar o Prender**. Estamos tratando de perseguir o atrapar algún conocimiento o dato específico. 25 | 26 | Aprender significa apoderarse de algo, no solo es adquirir conocimiento como dijimos anteriormente. También significa darle sentido a ese concepto y hacerlo más poderoso para luego compartirlo y generar opiniones acerca de él. 27 | 28 | **Psicología, pedagogía y neurociencias** son estas ciencias que se encargan de estudiar cómo funcionan los procesos de aprendizaje en nuestro cerebro. A lo largo de este curso veremos algunos métodos y descubrimiento científicos de cómo podemos mejorar nuestra **capacidad de aprender**. 29 | 30 | **Aprender = Apoderarse de algo** 31 | 32 | 33 | ### Etapas del aprendizaje 34 | 35 | - En la entrada de información tenemos dos tipos de experiencia: 36 | - [x] **Experiencia concreta (EC)**: Es un perfil que le gusta involucrarse y de tener la experiencia. 37 | - [ ] **Observación reflexiva (OR)**: Es un perfil que le gusta comenzar su aprendizaje por medio de la lectura o la teoría. 38 | 39 | - La salida depende un poco de cómo fue la entrada: 40 | - [ ] **Conceptualización abstracta (CA)**: Si eres una persona teórica tendrás una conceptualización abstracta en base a la hipótesis generada sobre la teoría leída. 41 | - [x] **Experimentación activa (EA)**: Son ese tipo de alumnos pragmáticos donde comienzan a través de la experiencia y a partir de ahí pueden generar nuevas experiencias para aplicarlo a nuevas. 42 | 43 | 44 | ### Tipos de estudiantes 45 | 46 | - **Modelo de Kolb:** 47 | - [x] Actuar (Alumno activo) => Reflexionar (Alumno Reflexivo) 48 | - [ ] Teorizar (Alumno teórico) => Experimentar (Alumno pragmático) 49 | 50 | 51 | - [ ] **Alumnos activos**: Son entusiastas y les apasiona las cosas nuevas. Son este tipo de alumnos que actúa antes de pensar. Por lo general, aprenden mejor si tienen una actividad que consideren un desafío. Realizan actividades cortas de resultado inmediatos. Les cuesta aprender cuando se les da un papel pasivo, cuando están en un salón de clases, no se sienten protagonistas de la lección. También cuando deben analizar e interpretar datos y cuando trabajan solos. 52 | 53 | - [x] **Alumnos reflexivos**: Aprenden más cuando pueden observar detenidamente la información que les rodea, cuando les ofrecen tiempo de analizar y reflexionar antes de actuar y pueden pasar desapercibidos. Les cuesta aprender cuando tienen que ser el centro de atención, cuando no pueden realizar la tarea tomándose el tiempo que consideren y cuando tienen que actuar sin reflexionar antes. 54 | 55 | - [ ] **Alumnos teóricos**: Aprenden mejor cuando les presentan modelos objetivos, teorías y sistemas; cuando pueden investigar y rastrear información. A este tipo de alumnos les gusta mucho la forma secuencial de pensamiento, la forma lógica para llegar a la resolución del problema. Les cuesta aprender cuando se les presentan actividades que consideran confusas o inciertas, cuando deben desarrollar actividades muy subjetivas o emocionales y cuando tienen que trabajar sin un marco teórico de referencia. 56 | 57 | - [x] **Alumnos pragmáticos**: Aprenden mejor cuando se les ofrecen actividades en las que pueden relacionar las teorías con situaciones prácticas y cuando pueden poner en práctica lo que deben aprender. Les cuesta aprender cuando se presentan actividades que no se relacionan con la realidad y cuando no pueden relacionar la información con situaciones prácticas. 58 | 59 | 60 | 61 | ### Reglas de aprendizaje efectivo 62 | 63 | - **Aprender individualmente**: 64 | - Interioriza lo aprendido 65 | - Asimila la información Adquirida 66 | - Interioriza pensamientos y reflexiones 67 | - Tómate tu tiempo 68 | 69 | - **Aprender en grupo**: 70 | - Comparte lo que estás aprendiendo 71 | - Explica lo que aprendiste 72 | - Recuerda que entre más explicas, más - aprendes 73 | 74 | - **Aprender colaborativamente**: 75 | - Crea una opinión fuerte de lo que aprendiste 76 | - Ten la oportunidad de que alguien cuestione el conocimiento que adquiriste 77 | 78 | 79 | 80 | ## Estrategias de aprendizaje individual 81 | 82 | ### ¿Nacemos o nos volvemos inteligentes? 83 | 84 | Elementos claves para poder tener un **aprendizaje individual efectivo** son: 85 | - Inteligencia 86 | - Atención 87 | - Memoria 88 | 89 | El aprendizaje individual es el que se genera únicamente entre el estudiante y el profesor o cualquier otra figura que nos esté enseñando algo. Los 3 elementos importantes son: inteligencia, atención y memoria. 90 | 91 | ¿Tú qué dices? ¿Nacemos o nos volvemos inteligentes? 92 | 93 | Según algunos estudios la respuesta es que **nacemos inteligentes**, la inteligencia es heredada de nuestros ancestros. Pero también puedes volverte inteligente o mejorar tu inteligencia gracias al ambiente que nos rodea y qué tan interesados estamos en volvernos aún más inteligentes. 94 | 95 | > Entre el 40% y 50% de la inteligencia es heredada pero el otro 50% es determinado por la influencia de lo que nos rodea y nuestra voluntad de aprender algo nuevo todos los días. 96 | 97 | 98 | ### La atención y lo que no sabías sobre la técnica pomodoro 99 | 100 | La **atención** es un proceso cognitivo que nos permite enfocarnos y concentrarnos en una cosa en específico. Un proceso cognitivo será todo aquel que nos permita procesar información para transmitirla o transformarla en aprendizaje. 101 | 102 | No podemos concentrarnos en muchos estímulos al mismo tiempo porque este lleva a una **sobrecarga cognitiva**. Es por esto que el multitasking es muy mala práctica. 103 | 104 | En el tiempo de pensamiento enfocado el nivel de atención o concentración es bastante prolongado con un tiempo de hasta 10 horas. Debes estar muy atento a qué estás pensando. 105 | 106 | En el tipo de pensamiento difuso, la **técnica pomodoro** nos puede ayudarnos mucho, ya que debemos concentrarnos por lapsos de tiempo mucho más cortos y, además, nos ayuda a **evitar la procrastinación**. 107 | 108 | 109 | ### Cómo puedo sacar el máximo provecho a mi memoria 110 | 111 | La **memoria** es la capacidad de recordar algo. Cuando memorizamos estamos utilizando dos habilidades específicas: abstracción y síntesis. No me memorizamos algo por completo, memorizamos palabras o ideas claves, por eso es importante la abstracción. 112 | 113 | La **memoria funcional** es la parte de nuestro cerebro que nos ayuda a recordar cosas de manera mecánica, es decir, de memoria. Aquí se apoya la teoría de no hacer multitasking cuando intentamos aprender algo. Si hacemos más cosas cuando estamos aprendiendo nuestro coeficiente intelectual será menos efectivo. 114 | 115 | Cuando memorizamos algo tendremos el 90% de probabilidad de olvidarlo. 116 | 117 | Una técnica que puedes seguir para reducir este porcentaje a un 10% es: 118 | - Repasa un concepto 24 horas después (70%) 119 | - Repasa el concepto 1 semana después (50%) 120 | - Repasa el concepto 1 mes después (10%) 121 | 122 | **Correlaciones mnemotécnicas**: Hacer conexiones de lo aprendido con asuntos cotidianos. 123 | 124 | 125 | ### Consejos para memorizar mejor 126 | 127 | - **Antes de dormir**: Recapitula lo que aprendiste durante el día. Puede ser en una libreta, smartphone o en tu cabeza. Recuerda que nunca debes parar de aprender. 128 | 129 | - **Deportes**: Para que nuestro cerebro funcione muy bien necesita altos grados de oxigenación y hace que nuestra memoria esté siempre fresca y sea más prolongada. Nos ayuda a reducir los riesgos de Alzheimer. 130 | 131 | - **Dormir**: Es importante para la memoria y la agilidad mental de nuestro cerebro. Cuando dormimos es cuando se liberan las toxinas que nos hacen daño. 132 | 133 | > Recuerda que todo lo que nos permite desarrollar conocimiento es un proceso cognitivo. 134 | 135 | - **Consejos para memorizar mejor** 136 | - Recapitula lo que aprendiste durante el día 137 | - Haz deporte 138 | - Duerme 139 | 140 | 141 | ### Chunking como estrategia de aprendizaje individual 142 | 143 | El **Chunking**, que significa dividir o fragmentar la información en trozos, es una habilidad muy útil cuando tenemos muchísima información y debemos procesarla para convertirla en aprendizaje. 144 | 145 | Se trata dividir la información que vamos a estudiar por partes y luego volver a conectarlas para darles sentido, ya que estamos tratando de interrelacionar todos estos conceptos. Algo así como separar la información para procesarla más fácilmente y volver a unirla cuando logramos entenderla mejor. 146 | 147 | 148 | ### Hacer apuntes mejora mi proceso de aprendizaje 149 | 150 | Los **apuntes** pueden ser la columna vertebral del conocimiento, son una forma de organizar y estructurar la información de tal manera que tengan sentido para nosotros. 151 | 152 | El uso del lápiz en la toma de apuntes tiene mejor resultados en el proceso de aprendizaje porque el movimiento de nuestras manos implica el uso de los sentidos que producen resultados más altos en las actividades neurales. 153 | 154 | 155 | ### Haciendo apuntes como las Notas de Cornell 156 | 157 | > Universidad de Cornell, Nueva York EEUU 158 | 159 | Las Notas de Cornell son uno de los métodos más efectivos (y desconocidos) para guardar nuestros apuntes efectivamente, debemos seguir los siguientes lineamientos: 160 | 161 | - **Tema, Título o Materia**: ¿Qué vamos a estudiar? Esto lo vas a escribir en la parte superior de tu libreta o donde guardes tus notas. 162 | - **Glosario, Preguntas y Palabras clave**: Esta sección ocupará menos de la mitad del espacio de la primera mitad de tus apuntes. En ella vamos a definir los objetivos o cuestiones que debes resolver con este aprendizaje. Puedes usar el método de correlación mnemotécnico y asignar conceptos familiares para relacionarlos con los nuevos conceptos. 163 | - **Notas**: Esta sección ocupara un poco más de la mitad del espacio después del glosario. Puedes usar lo que mejor te convenga para plasmar la información que estás estudiando: bulletpoints, paráfrasis (evita las frases muy largas), símbolos, colores, entre otras. 164 | - **Resumen o Idea Principal**: Idealmente, esta sección debería ser muy breve y, aún así, capaz de resumir la nota por completo. Para entrar en más detalles podremos leer las notas y el glosario. 165 | 166 | 167 | - **Paráfrasis** Escribir con nuestras propias palabras 168 | 169 | 170 | - **¿Cómo incrementar mi velocidad de lectura?** 171 | 1. Reduce los movimientos sacádicos 172 | 2. Concentrate al máximo para evitar relee 173 | 3. Lee en silencio 174 | 4. Usa un señalador 175 | 5. Visualiza frases completas en lugar de palabras individuales 176 | 177 | 178 | ## Estrategias de aprendizaje en grupo 179 | 180 | **Aprender en grupo** es una gran estrategia de aprendizaje. En principio, porque tienes un motivador personal al estar aprendiendo con otras personas que, además, pueden apoyarte compartiendo su conocimiento. Funcionan como un ancla que nos ayuda a continuar. 181 | 182 | - **Ventajas** de estudiar en grupo: 183 | - Tenemos la oportunidad de aprender de otros 184 | - Exponer tus dudas 185 | - Compartir tu conocimiento 186 | - Entre más explicas más aprendes 187 | 188 | > *"Si no puedes explicar algo de forma sencilla es que ni tú mismo lo has entendido lo suficiente** - Albert Einstein 189 | 190 | 191 | ### Profesor por un día 192 | 193 | Cuando somos **profesores** estamos en la posición de explicar algo a otras personas sobre lo que estamos aprendiendo, estudiando e investigando. 194 | 195 | - **Parafrasear**: Nos da la posibilidad de recordar algo y repetirlo usando nuestras propias palabras. 196 | - **Cuestionar mi conocimiento**: En ese momento, cuando estamos explicando el tema, también tenemos una reflexión sobre qué tanto aprendimos del tema a explicar. 197 | - **Repasar lo aprendido**: Como profesores debemos estudiar y repasar los conceptos para tener los conocimientos al alcance y poderlos explicar. 198 | - **Hacer notas extras**: Las notas normales se nos quedan cortas y debemos extenderlas un poco más cuando queremos explicárselo a otras personas. 199 | 200 | _Solo puedes explicar algo cuando lo entiendes profundamente._ 201 | 202 | - **Técnica de Feynman:** 203 | 1. Elige un tema 204 | 2. Escribe lo aprendido usando paráfrasis y lenguaje sencillo, luego léelo en voz alta. 205 | 3. Arregla lo que no está bien explicado 206 | 4. Repasa la información e intenta simplificarlo todavía más. 207 | 208 | **_Nuestros alumnos son los que más comparten._** 209 | 210 | 211 | ### Evaluar mi conocimiento 212 | 213 | **Evaluar conocimiento** te da la oportunidad de corroborar lo que aprendiste, evaluar qué tanto has aprendido. Por lo general, lo mejor es que estas evaluaciones sean diseñadas y aplicadas por otra persona diferente a ti. 214 | 215 | Las **evaluaciones** deben ser diseñadas con ejemplos diversos que te confronten a la resolución de otro tipo de problemas diferentes a lo que aprendiste. Esto también te permitirá complementar tu conocimiento y darte la posibilidad de aprender a aplicarlo en más áreas. 216 | 217 | 218 | ## Estrategias de aprendizaje colectivo 219 | 220 | ### El diálogo me conduce a la reflexión de mi aprendizaje 221 | 222 | Un **argumento** es una reflexión, una respuesta construida en base a la razón, defender una postura con el mayor racionamiento posible y así sea aceptado por la otra persona. Debemos comprender el tema y conocer la mayoría de las alternativas. 223 | 224 | Con estos argumentos lo que queremos es conseguir la aceptación de la otra persona de manera racional. También desarrollamos capacidades lingüísticas, incrementamos en una **50%** la adquisición del conocimientos para el día siguiente. 225 | 226 | 227 | 228 | ## Hábitos para un aprendizaje efectivo 229 | 230 | 231 | - Toma los cursos completos y aprueba el examen. 232 | - Cumples tus objetivos. 233 | - Quita toda distracción. Coloca tu teléfono en modo “No Molestar” o “Do Not Disturb” 234 | - Ten un lugar para estudiar. 235 | - Calendariza tu tiempo de estudio. Como si fueras a la escuela. 236 | - Estudia todos los días. Repasar lo aprendido o aprender algo nuevo. 237 | - Darse recompensas por cada avance. Una recompensa puede ser desde ver una buena película hasta unas buenas vacaciones. 238 | - Descansa y cuida tu vista. Usar gafas o pantallas con filtros. 239 | - Tener pasión por el aprendizaje. Nunca parar de aprender. -------------------------------------------------------------------------------- /formacion_profesional_integral.md: -------------------------------------------------------------------------------- 1 | # Formación Profesional Integral 2 | 3 | ## ¿Que significa FPI? 4 | 5 | FPI es la formación profesional integral, que es el proceso donde se adquieren conocimientos, destrezas, actitudes y aptitudes para la participación activa en el trabajo y desarrollo profesional y personal. 6 | 7 | ## ¿Cuales son las partes principales del FPI? 8 | 9 | Aprender a aprender, aprender a ser, aprender a hacer y aprender a gestionar. Lo que se enfoca en los 3 pilares del Ser, Hacer y Saber 10 | 11 | ## ¿Cuales son las partes de una guía de aprendizaje? 12 | 13 | Las partes de la guía de aprendizaje son: Conocimientos previos, desarrollo del conocimiento y adherencia del conocimiento, que es donde aplicamos los conocimientos mediante la práctica. 14 | 15 | ## ¿Cual es diferencia entre asincrónico y sincrónico? \* 16 | 17 | Asíncrono se refierere al proceso de comunicación de forma no simultánea, es decir en el que las personas no se conectan al mismo tiempo, es decir, el trabajo que realizamos de forma independiente. Síncrono se refiere al proceso de comunicacion en tiempo real, es decir en donde todas las personas se conectan al tiempo, es este caso el proceso de aprendizaje se da entre todo el grupo. 18 | 19 | ## ¿Cual es la función de la APE? 20 | 21 | La agencia pública se empleo del Sena, es un servicio que permite conectar a empresas y profesionales de forma que se brinde un servicio para las personas que buscan empleo. 22 | 23 | ## ¿Cual es la función de la transversal de idiomas? 24 | 25 | Permite desarrollar habilidades en un nuevo lenguaje, lo que me sirve a mí como aprendiz mejorar en el aspecto personal y laboral, abriendo más oportunidades laborales y ser competitivo a nivel internacional. 26 | 27 | ## ¿Cual es la función de la transversal promover? 28 | 29 | Es la competencia que desarrolla las actividades blandas en los aprendices, como empatía, trabajo en grupo, habilidades sociales, habilidades de comunicación, aceptación de las críticas, toma de decisiones etc. Donde se desarrollan destrezas humanas mediante actividades como la danza, deporte y recreación. 30 | -------------------------------------------------------------------------------- /git_cmd.md: -------------------------------------------------------------------------------- 1 | # ⌨️ Comandos en Git (La guía completa) ⭐ 2 | 3 | ## :coffee: Agregar la identidad 4 | Es necesario configurar la primera vez git, y eso lo hacemos usando los siguientes comandos. Para descargar git en windows, lo podemos hacer en la siguiente dirección https://git-scm.com/download/win. 5 | 6 | ### Identidad 7 | 8 | * `$ git config --global user.name "John Doe"` 9 | * `$ git config --global user.email johndoe@example.com` 10 | 11 | ### Editor por defecto 12 | 13 | * `$ git config --global core.editor emacs` 14 | 15 | ### Herramienta de diferencias 16 | Esta herramienta se usa para resolver conflictos 17 | 18 | * `$ git config --global merge.tool vimdiff` 19 | 20 | ### Comprobar configuración 21 | 22 | * `$ git config --list` 23 | 24 | ### Obtener ayuda 25 | 26 | * `$ git help ` 27 | * `$ git --help` 28 | * `$ man git-` 29 | 30 | ### Conectando a github mediante SSH 31 | 32 | Para agregar la clave ssh a github, en caso de realizar conexiones al servidor mediante este protocolo, ver el la documentación de github [Conectando a github con SSH](https://help.github.com/articles/connecting-to-github-with-ssh/) 33 | 34 | 35 | ## :coffee: Comandos Básicos 36 | 37 | ### Iniciar un repositorio en un directorio existente 38 | 39 | * `$ git init` 40 | * `$ git add *.c` 41 | * `$ git add README` 42 | * `$ git commit –m 'versión inicial del proyecto'` 43 | * `$ git commit ` Abre una ventana en Vim para escribir el mensaje de la confirmación del cambio 44 | 45 | * `$ git remote set-url origin url-ssh-del-repositorio-en-github` Definimos el repositorio remoto origin usando la conexión por SSH (Podemos cambiar la dirección del repositorio remoto). 46 | * `$ git remote add origin url-ssh-repo` Se usa para agregar un repositorio remoto. 47 | 48 | ## :coffee: Eliminar commit 49 | 50 | * `$ git reset --soft HEAD~1` Elimina el commit más reciente, guardando el trabajo realizado 51 | * `$ git reset --hard HEAD~1` Elimina el commit más reciente destruyendo el trabajo que has hecho 52 | 53 | ### Cambiar el ultimo commit enviado a GitHub 54 | Si ya he enviado ina confirmación y deseo cambiarlo, debo forzar el envio del commit cambiado con el comando. Recuerde que ya debe haber cambiado el commit localmente 55 | 56 | * `$ git push --force origin master` 57 | 58 | ### Cambiar mensaje de commit antiguos 59 | 60 | * `git rebase -i HEAD~3` Displays a list of the last 3 commits on the current branch 61 | * `pick e499d89 Delete CNAME` 62 | * `reword 0c39034 Better README` 63 | 64 | Luego reemplazar pick con reword antes de cada mensaje del commit que desee cambiar y guardar los cambios. 65 | Finalmente forzar el envío 66 | 67 | * `git push --force` 68 | 69 | 70 | 71 | ## :coffee: Clonar un Repositorio 72 | 73 | * `$ git clone [url]` 74 | * `$ git clone git://github.com/schacon/grit.git mirepo` Renombra el directorio al clonar, con el nombre `` 75 | 76 | ## Comprobar estado de los archivos 77 | 78 | * `$ git status` Muestra los archivos añadidos o eliminados 79 | * `$ git diff` Muestra las líneas añadidas y eliminadas, muestra los cambios que no han sido preparados. 80 | 81 | 82 | ### Saltar el área de preparación 83 | 84 | * `$ git commit -a -m 'added new benchmarks'` Prepara todos los archivos, sin necesidad de agregar el comando git add 85 | 86 | ## :coffee: Eliminando archivos 87 | 88 | * `$ git rm ` Elimina el archivo del staging area 89 | 90 | ## Moviendo archivos 91 | 92 | * `$ git mv ` Renombra los archivos 93 | 94 | ## :coffee: Viendo el histórico de confirmaciones 95 | 96 | * `$ git log` 97 | * `$ git log -p` Muestra las diferencias introducidas en cada confirmación 98 | * `$ git log -2` Muestra únicamente las dos últimas entradas del histórico 99 | * `$ git log --stat` Muestra las estadísticas de cada confirmación 100 | * `$ git log --oneline` Muesta información de un commit en una línea 101 | 102 | ### Modificando la última confirmación 103 | 104 | * `$ git commit --amend` Reescribe el mensaje y los archivos para realizar la confirmación 105 | 106 | ### Deshaciendo preparación de un archivo 107 | 108 | * `$ git reset HEAD ` Saca el archivo del staging area 109 | 110 | ### Deshaciendo la modificación de un archivo 111 | 112 | * `$ git checkout -- ` Elimina las modificaciones que le hayas hecho al archivo 113 | 114 | 115 | 116 | ## :coffee: Trabajando con repositorios remotos 117 | 118 | ### Mostrar repositorios remotos 119 | 120 | * `$ git remote` Obtiene el nombre del repositorio remoto 121 | * `$ git remote -v` Obtiene la url del repositorio 122 | 123 | ### Añadiendo repositorios remotos 124 | 125 | * `$ git remote add [nombre] [url]` 126 | 127 | ### Recibiendo repositorios remotos 128 | 129 | * `$ git fetch [remote-name]` Recupera todos los datos del proyecto remoto que no tengas todavía pero no une las rama remota con la local. 130 | * `$ git pull` Trae los datos del proyecto remoto y lo une a las rama del repositorio local 131 | 132 | ### Enviar datos a repositorio remoto 133 | 134 | * `$ git push [nombre-remoto][nombre-rama]` 135 | 136 | **Importante** 137 | Este comando funciona únicamente si has clonado de un servidor en el que tienes permiso de escritura, y nadie ha enviado información mientras tanto. Si tú y otra persona clonais a la vez, y él envía su información y luego envías tú la tuya, tu envío será rechazado. Tendrás que bajarte primero su trabajo e incorporarlo en el tuyo para que se te permita hacer un envío. Véase el Capítulo 3 para ver en detalle cómo enviar a servidores remotos 138 | 139 | ### Inspeccionando un repositorio remoto 140 | 141 | * `$ git remote show [nombre]` 142 | 143 | ### Renombrando repositorios remotos 144 | 145 | * `$ git remote rename [from] [to]` 146 | 147 | 148 | ## :coffee: Etiquetas 149 | Especifica puntos especificos importantes en la historio, por ejemplo vesiones. 150 | 151 | ### Listar etiquetas 152 | 153 | * `$ git tag` 154 | 155 | * `$ git tag -l 'v1.4.2.*'` Etiquetas por un patron en particular 156 | 157 | ### Crear etiquetas anotadas 158 | 159 | * `$ git tag -a v1.4 -m 'my version 1.4'` 160 | 161 | Esto muestra la información del autor de la etiqueta, la fecha en la que la confirmación fue etiquetada, y # el mensaje de anotación antes de mostrar la información de la confirmación. 162 | 163 | ### Crear etiquetas firmadas 164 | 165 | * `$ git tag -s v1.5 -m 'my signed 1.5 tag'` 166 | Crea una etiqueta firmada con GPG, siempre que tengas una clave privada 167 | 168 | 169 | ### Crear etiquetas ligeras 170 | 171 | * `$ git tag v1.4-lw` Este tipo de etiqueta no almacena información extra 172 | 173 | ### Verificar etiquetas firmadas 174 | 175 | * `git tag -v [tag-name]` 176 | 177 | 178 | ### Etiquetar commit 179 | 180 | * `$ git tag -a v1.2 -m 'version 1.2' 9fceb02` Agregar una etiqueta a un commit 181 | 182 | ### Editar etiquetas 183 | 184 | * `$ git tag -f -m ""` Creará una nueva etiqueta con el mismo nombre sobreescribiendo la original 185 | 186 | * `$ git tag --force [tag name] [commit id]` Edita una etiqueta a un commit específico. 187 | 188 | * `$ git push origin --force --tags` En caso de que haya subido ya la etiqueta debe forzar envío 189 | 190 | ### Enviar etiquetas 191 | 192 | * `git push origin [tagname]` 193 | 194 | Git no manda las etiquetas al servidor cuando de hace un push, para ello se debe hacer un push al igual como una rama pero con el nombre de la etiqueta 195 | 196 | * `$ git push origin --tags` Envía varias etiquetas a la vez 197 | 198 | 199 | ## :coffee: Alias en Git 200 | 201 | Git permite colocar alias a los comandos que vienen por defecto 202 | 203 | * `$ git config --global alias.co checkout` 204 | * `$ git config --global alias.br branch` 205 | * `$ git config --global alias.ci commit` 206 | * `$ git config --global alias.st status` 207 | 208 | * `$ git config --global alias.unstage 'reset HEAD --' ` 209 | * `$ git config --global alias.last 'log -1 HEAD'` 210 | 211 | 212 | ## :coffee: Branch 213 | 214 | * `$ git branch` Lista ramas del proyecto local 215 | 216 | * `$ git branch name-branch` Crear ramas 217 | 218 | * `$ git checkout -b name-branch` Crear ramas y cambiar a la rama creada 219 | 220 | * `$ git pull origin name-branch` Traer ramas remotas 221 | 222 | * `$ git push origin --delete name-branch` Eliminar ramas remotas 223 | 224 | 225 | ## :coffee: Creación de primeros archivos para repositorio 226 | 227 | Crear un nuevo repositorio en la línea de comandos 228 | 229 | * `$ echo "# repositorio" >> README.md` 230 | * `$ git init` 231 | * `$ git add README.md` 232 | * `$ git commit -m "first commit"` 233 | * `$ git remote add origin git@github.com:user/repositorio.git` 234 | * `$ git push -u origin master` 235 | 236 | 237 | Enviar un repositorio exitente desde la línea de comandos 238 | 239 | * `$ git remote add origin git@github.com:user/repositorio.git` 240 | * `$ git push -u origin master` 241 | 242 | 243 | 244 | En el caso de crear submodulos que luego quiere agregarlos al repositorio principal podemos usar el comando 245 | 246 | - `$ git rm --cached ` Elimina las secciones submodule en el archivo *.git/config* 247 | -------------------------------------------------------------------------------- /git_cmd.txt: -------------------------------------------------------------------------------- 1 |  COMANDOS GIT 2 | 3 | * Identidad 4 | $ git config --global user.name "John Doe" 5 | $ git config --global user.email johndoe@example.com 6 | 7 | * Editor por defecto 8 | $ git config --global core.editor emacs 9 | 10 | * Herramienta de diferencias 11 | # Se usa para resolver conflictos 12 | $ git config --global merge.tool vimdiff 13 | 14 | * Comprobar configuración 15 | $ git config --list 16 | 17 | * Obtener ayuda 18 | $ git help 19 | $ git --help 20 | $ man git- 21 | 22 | /*********** Comandos Básicos *************/ 23 | 24 | * Iniciar un repositorio en un directorio existente 25 | $ git init 26 | 27 | $ git add *.c 28 | $ git add README 29 | $ git commit –m 'versión inicial del proyecto' 30 | $ git commit # Abre una ventana en Vim para escribir el mensaje de la confirmación del cambio 31 | 32 | /***** Eliminar Commit *****/ 33 | $ git reset --soft HEAD~1 #Elimina el commit más reciente, guardando el trabajo realizado 34 | $ git reset --hard HEAD~1 # Elimina el commit más reciente destruyendo el trabajo que has hecho 35 | 36 | /** Cambiar el ultimo commit enviado a GitHub **/ 37 | Si ya he enviado ina confirmación y deseo cambiarlo, debo forzar el envio del commit cambiado con el comando. Recuerde que ya debe haber cambiado el commit localmente 38 | 39 | $ git push --force origin master 40 | 41 | * Cambiar mensaje de commit antiguos 42 | 43 | git rebase -i HEAD~3 # Displays a list of the last 3 commits on the current branch 44 | 45 | pick e499d89 Delete CNAME 46 | reword 0c39034 Better README 47 | 48 | Luego reemplazar pick con reword antes de cada mensaje del commit que desee cambiar y guardar los cambios. 49 | Finalmente forzar el envío 50 | 51 | git push --force 52 | 53 | /**** Clonar un Repositorio ****/ 54 | $ git clone [url] 55 | $ git clone git://github.com/schacon/grit.git mygrit # Renombra el directorio al clonar 56 | 57 | * Comprobar estado de los archivos 58 | $ git status # Mustra los archivos añadidos o eliminados 59 | $ git diff # Muestra las líneas añadidas y eliminadas, muestra los cambios que no han sido preparados. 60 | 61 | /**** Saltar el área de preparación ****/ 62 | $ git commit -a -m 'added new benchmarks' # Prepara todos los archivos, sin necesidad 63 | de agregar el comando git add 64 | 65 | * Eliminando archivos 66 | $ git rm # Elimina el archivo del staging area 67 | 68 | * Moviendo archivos 69 | $ git mv # Renombra los archivos 70 | 71 | * Viendo el histórico de confirmaciones 72 | $ git log 73 | $ git log -p # Muestra las diferencias introducidas en cada confirmación 74 | $ git log -2 # Muestra únicamente las dos últimas entradas del histórico 75 | $ git log --stat # Muestra las estadísticas de cada confirmación 76 | $ git log --oneline # Muesta información de un commit en una línea 77 | 78 | * Modificando la última confirmación 79 | $ git commit --amend # Reescribe el mensaje y los archivos para realizar la confirmación 80 | 81 | * Deshaciendo preparación de un archivo 82 | $ git reset HEAD # Saca el archivo del staging area 83 | 84 | 85 | * Deshaciendo la modificación de un archivo 86 | $ git checkout -- # Elimina las modificaciones que le hayas hecho al archivo 87 | 88 | 89 | /******** Trabajando con repositorios remotos *********/ 90 | 91 | * Mostrar repositorios remotos 92 | $ git remote # Obtiene el nombre del repositorio remoto 93 | $ git remote -v # Obtiene la url del repositorio 94 | 95 | * Añadiendo repositorios remotos 96 | $ git remote add [nombre] [url] 97 | 98 | * Recibiendo repositorios remotos 99 | $ git fetch [remote-name] # Recupera todos los datos del proyecto remoto que no tengas todavía. 100 | pero no une las rama remota con la local 101 | $ git pull # Trae los datos del proyecto remoto y lo une a las rama del repositorio local 102 | 103 | 104 | * Enviar datos a repositorio remoto 105 | $ git push [nombre-remoto][nombre-rama] 106 | # Importante 107 | Este comando funciona únicamente si has clonado de un servidor en el que tienes permiso de escritura, y nadie ha enviado información mientras tanto. Si tú y otra persona clonais a la vez, y él envía su información y luego envías tú la tuya, tu envío será rechazado. Tendrás que bajarte primero su trabajo e incorporarlo en el tuyo para que se te permita hacer un envío. Véase el Capítulo 3 para ver en detalle cómo enviar a servidores remotos 108 | 109 | 110 | * Inspeccionando un repositorio remoto 111 | $ git remote show [nombre] 112 | 113 | * Renombrando repositorios remotos 114 | $ git remote rename [from] [to] 115 | 116 | 117 | /********** Etiquetas *********/ 118 | Especifica puntos especificos importantes en la historio, por ejemplo vesiones. 119 | 120 | * Listar etiquetas 121 | $ git tag 122 | $ git tag -l 'v1.4.2.*' # Busca etiquetas por un patron en particular 123 | 124 | * Crear etiquetas anotadas 125 | $ git tag -a v1.4 -m 'my version 1.4' 126 | # Esto muestra la información del autor de la etiqueta, la fecha en la que la confirmación fue etiquetada, y # el mensaje de anotación antes de mostrar la información de la confirmación. 127 | 128 | *Crear etiquetas firmadas 129 | $ git tag -s v1.5 -m 'my signed 1.5 tag' 130 | # Crea una etiqueta firmada con GPG, siempre que tengas una clave privada 131 | 132 | * Crear etiquetas ligeras 133 | $ git tag v1.4-lw # Este tipo de etiqueta no almacena información extra 134 | 135 | * Verificar etiquetas firmadas 136 | git tag -v [tag-name] 137 | 138 | 139 | * Etiquetar commit 140 | $ git tag -a v1.2 -m 'version 1.2' 9fceb02 # Agregar una etiqueta a un commit 141 | 142 | * Editar etiquetas 143 | $ git tag -f -m "" 144 | # Creará una nueva etiqueta con el mismo nombre sobreescribiendo la original 145 | 146 | # Si quires editar una etiqueta a un commit específico, Git permite hacerlo 147 | $ git tag --force [tag name] [commit id] 148 | 149 | En caso de que haya subido ya la etiqueta debe forzar envío 150 | $ git push origin --force --tags 151 | 152 | * Enviar etiquetas 153 | git push origin [tagname] # Git no manda las etiquetas al servidor cuando de hace un push, para ello 154 | se debe hacer un push al igual como una rama pero con el nombre de la etiqueta 155 | 156 | $ git push origin --tags # Envía varias etiquetas a la vez 157 | 158 | 159 | /******************* Alias en Git **********************/ 160 | Git permite colocar alias a los comandos que vienen por defecto 161 | $ git config --global alias.co checkout 162 | $ git config --global alias.br branch 163 | $ git config --global alias.ci commit 164 | $ git config --global alias.st status 165 | 166 | $ git config --global alias.unstage 'reset HEAD --' 167 | $ git config --global alias.last 'log -1 HEAD' 168 | 169 | 170 | /******************** Branch ***************************/ 171 | 172 | * Listar ramas del proyecto local 173 | $ git branch 174 | 175 | * Crear ramas 176 | $ git branch name-branch 177 | 178 | * Crear ramas y cambiar a la rama creada 179 | $ git checkout -b name-branch 180 | 181 | * Traer ramas remotas 182 | $ git pull origin name-branch 183 | 184 | * Eliminar ramas remotas 185 | $ git push origin --delete name-branch 186 | 187 | 188 | /***************** Creación de primeros archivos para repositorio ***********************/ 189 | 190 | * create a new repository on the command line 191 | 192 | $ echo "# Emproyect" >> README.md 193 | $ git init 194 | $ git add README.md 195 | $ git commit -m "first commit" 196 | $ git remote add origin git@github.com:ideascompany/Emproyect.git 197 | $ git push -u origin master 198 | 199 | * push an existing repository from the command line 200 | 201 | $ git remote add origin git@github.com:ideascompany/Emproyect.git 202 | $ git push -u origin master 203 | 204 | 205 | -------------------------------------------------------------------------------- /img/algoritmo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jocode/Getting-Started/5edf25376e68940e58f9f6adf9e061f749006158/img/algoritmo.png -------------------------------------------------------------------------------- /img/instalacion_raspberry.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jocode/Getting-Started/5edf25376e68940e58f9f6adf9e061f749006158/img/instalacion_raspberry.png -------------------------------------------------------------------------------- /img/programacion.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jocode/Getting-Started/5edf25376e68940e58f9f6adf9e061f749006158/img/programacion.jpg -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Una breve introducción a GitHub 6 | 7 | 8 | 9 |
10 |

Introducción a Git & GitHub

11 |
12 |
13 |

Temario

14 |
15 |
    16 |
  • Qué es Git?
  • 17 |
  • Para qué Sirve Git?
  • 18 |
  • Quién creo Git?
  • 19 |
  • Que empresas usan Git?
  • 20 |
  • Catálogo de palabras en Git
  • 21 |
      22 |
    • init
    • 23 |
    • commit
    • 24 |
    • branch
    • 25 |
    • merge
    • 26 |
    • checkout
    • 27 |
    • reset
    • 28 |
    • remote
    • 29 |
    • push
    • 30 |
    • pull
    • 31 |
    32 |
  • Clientes de Git con Interfaz Gráfica
  • 33 |
  • Trabajando con la terminal | Comandos para Git
  • 34 |
      35 |
    • 36 |
    37 |
38 |
39 |
40 | 41 | 42 | 43 | -------------------------------------------------------------------------------- /instalar-lamp.md: -------------------------------------------------------------------------------- 1 | # Instalar Lamp 2 | 3 | > **Importante** 4 | > El símbolo `^` el linux, significa `ctrl`, por ejemplo si aparece `^+W` es la tecla `ctrl+w` 5 | 6 | A continuación se configura el servidor apache con los motores de base de datos MySQL, postgress y sqlite3 7 | 8 | Primero instalaremos a instalar apache2, php7, mysql 5.6 y algunas librerías 9 | 10 | * `sudo apt-get install apache2 mysql-server php libapache2-mod-php php-mcrypt php-mysql php-cli mcrypt php-pear` 11 | 12 | Si por alguna razón el paquete *php-mcrypt* no está disponible, eliminarlo del comando 13 | 14 | Otras librerías importantes 15 | 16 | * `sudo apt-get install php-gd php-intl php-readline` 17 | 18 | El parámetro *php-gd* para trabajar con imágenes como los captcha 19 | 20 | Instalar mbstring 21 | 22 | * `sudo apt-get install php-mbstring php7.0-mbstring php-gettext libapache2-mod-php7.0` 23 | 24 | Habilitamos el mcrypt y mbstring 25 | 26 | * `sudo phpenmod mcrypt` 27 | * `sudo phpenmod mbstring` 28 | 29 | Habilitar el mod_rewrite para trabajar con urls enriquecidas 30 | 31 | * `sudo a2enmod rewrite` 32 | 33 | 34 | ## Reiniciar el servidor Apache 35 | 36 | Para reiniciar el servidor *apache* ejecutamos el siguiente comando. 37 | 38 | * `service apache2 restart` 39 | 40 | Para mysql, también podemos ejecutar ese comando para mysql. 41 | 42 | - **start** Inicia el servicio 43 | - **stop** Detiene el servicio que le indiquemos 44 | 45 | 46 | ### Instalar sqlite3 47 | 48 | Para instalar sqlite y el respectivo soporte para php, lo hacemos mediante el siguiente comando 49 | 50 | - `sudo apt-get install sqlite php-sqlite3` 51 | 52 | ### Instalar Postgresql 53 | 54 | Para instalar postgresql, su respectivo soporte para php y la herramienta pgadmin 55 | 56 | `sudo apt-get install postgresql postgresql-contrib pgadmin3 pgagent php-pgsql` 57 | 58 | 59 | ### Instalar soporte de MySQL para python 60 | 61 | Para instalar el soporte de MySQL para python, lo instalamos mediante el siguiente comando. 62 | 63 | - `sudo apt-get install python-mysqldb` 64 | 65 | 66 | ### Cambiar la carpeta de trabajo por defecto `/var/www/html` 67 | 68 | Si deseamos cambiar la carpeta de trabajo por defecto que se encuentra en `/var/www/html` debemos modificar el archivo de configuración de apache 69 | 70 | * `sudo nano /etc/apache2/apache2.conf` 71 | 72 | Allí buscamos la directiva *Directory* y configuramos la carpeta que deseemos 73 | 74 | ```xml 75 | 76 | Options indexes FollowSymLinks 77 | AllowOverride All 78 | Require all granted 79 | 80 | ``` 81 | 82 | Luego se hacer esta modificación, reiniciamos apache 83 | 84 | * `sudo service apache2 restart` 85 | 86 | Es importante que en *AllowOverride* esté en All para permitir las urls amigables 87 | 88 | Luego modificamos el archivo de sitios 89 | 90 | * `sudo nano /etc/apache2/sites-enabled/000-default.conf` 91 | 92 | Buscamos la línea de `DocumentRoot`, la comentamos y agregamos la nuestra 93 | 94 | ``` 95 | #DocumentRoot /var/www/html 96 | DocumentRoot /home/user/public_html 97 | ``` 98 | 99 | Una vez terminada la configuración p después de cualquier cambio es importante reiniciar el servidor. 100 | 101 | * `sudo service apache2 restart` 102 | 103 | ## Dar permisos de escritura 104 | 105 | Para permisos de escritura en linux, ejecutamos el siguiente comando en consola. 106 | 107 | * `sudo chmod +w -R carpeta/` 108 | 109 | El parámetro **+w** da permisos se escritura para la carpeta 110 | 111 | El parámetro **-R** le da permiso de escritura a todas las carpetas contenidas en la carpeta raíz (Que le hemos especificado) 112 | 113 | 114 | ## Ingresar a mysql por consola 115 | 116 | Para ingresar a mysql por consola, podemos usar el comando 117 | 118 | * `mysql -u root -p` 119 | 120 | *root* es el nombre de usuario, y con *-p* le indicamos la contraseña 121 | 122 | ## Instalar phpMyAdmin 123 | 124 | 1. Instalarlo desde los repositorios 125 | 126 | * `sudo apt-get install phpmyadmin` 127 | 128 | Los paquetes recomendados 129 | - `php-gd` 130 | - `php-tcpdf` 131 | 132 | * `sudo apt-get install php-gd php-tcpdf` 133 | 134 | 2. Configurar apache para que tome la ruta, para eso debemos abrir el archivo `/etc/apache2/apache2.conf` y agregamos las siguientes líneas 135 | 136 | * `sudo nano /etc/apache2/apache2.conf` 137 | 138 | O abrir el archivo con sublime 139 | 140 | * `sudo subl /etc/apache2/apache2.conf` 141 | 142 | ``` 143 | # phpMyAdmin Configuration 144 | Include /etc/phpmyadmin/apache.conf 145 | ``` 146 | 147 | 3. Guardar el archivo y reiniciar apache 148 | 149 | * `sudo service apache2 restart` 150 | * `sudo service mysql start` 151 | 152 | 153 | Después de eso se podrá ingresar desd *htt//localhoost/phpmyadmin* 154 | 155 | Para instalar LAMPP se puede usar el siguiente comando 156 | 157 | * `sudo apt-get install mysql-server-5.6 php5 apache2 php5-mysql` 158 | 159 | 160 | > Si por algún motivo, durante la instalación aparece el siguiente error `Access denied for user 'root'@'localhost'` podemos solucionarlo siguiendo los pasos en este enlace: 161 | 162 | - [Access denied for user 'root'@'localhost'](https://stackoverflow.com/questions/39281594/error-1698-28000-access-denied-for-user-rootlocalhost) 163 | - [Habilitar la contraseña para el root en Linux](http://www.conchaalviz.com/blog/como-habilitar-contrasena-para-el-root-de-mysql-en-linux/) 164 | 165 | Por defecto, mysql no permite dejar espacio en blanco para la contraseña. 166 | 167 | Estos errores, pueden arreglarse, al crear la contraseña e instalar los paquetes recomendados. Con eso, se garantiza una buena instalación del gestor de base de datos. 168 | 169 | 170 | 171 | ## Ver los errores de Apache 172 | 173 | Para ver los errores de apache, es necesario ir a la ruta `/var/log/apache2/error.log`. En este archivo, se registran todos los errores que hayan en el servidor y en los proyectos qe estemos desarrolando. 174 | 175 | En caso de cualquier problema, puede ser por la versión de php, al incluir nuevas reglas para la programación. Para eso, copiar el error tal cual y buscarlo, porque los errores pueden ser aleatorios. 176 | 177 | ## Ver el valor de `sql_mode` de MySQL 178 | 179 | Esta configuración de mysql, en algunas ocasiones no deja ingresar valores vacíos en los autoincrementables 180 | 181 | Para ver la configuración, podemos ingresar el siguiente comando 182 | 183 | * `mysql -u user -p` 184 | 185 | Ingresar el usuario, reemplazar *user* por el que tenga y escribir la contraseña 186 | 187 | * `mysql> SELECT @@sql_mode;` 188 | 189 | Luego que esté dentro, vemos la configuración de este parámetro. En algunos casos puede ser este por defecto. 190 | 191 | `ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION` 192 | 193 | 194 | Para cambiar este parámetro y que nos permite ingresar datos vacíos como `' '` debemos cambiar el **sql_mode**, y lo podemos hacer de la siguiente manera 195 | 196 | 197 | Si en la consola, ejecutamos la consulta 198 | 199 | * `SELECT @@GLOBAL.sql_mode;` 200 | 201 | Nos arrojara esto: 202 | `ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION` 203 | 204 | Podemos cambiarlos a 205 | 206 | * `SET GLOBAL sql_mode = '';` 207 | 208 | De esta manera, nos dejar+a ingresar valores vacíos en los campos, pero no es lo más recomendable. 209 | 210 | 211 | *Ver la información* https://stackoverflow.com/questions/35037288/incorrect-decimal-integer-value-mysql#35037657 212 | 213 | Sin embargo, con esta configuración debemos cada vez que se reinicie el servidor, se reestablecen los valores. Para solucionar esto, debemos dejar configurado este desde la configuración de mysql. 214 | 215 | Este archivo de configuración lo encontramos en **`/etc/mysql/my.cnf`**, en la sección *mysqlid* 216 | 217 | Luego que estemos en este archivo, debemos colocar la siguiente sentencia, para indicar la configuración. 218 | 219 | ```sql 220 | [mysqld] 221 | sql-mode="" 222 | ``` 223 | 224 | Hay que estar seguros que se tenga **sql-mode** y no guiones bajos y sin comillas dobles en versiones mysql 5.7.8 or mayores. 225 | 226 | *Para más información ver* [Configuración global de sql_mode en mysql](https://stackoverflow.com/questions/2317650/setting-global-sql-mode-in-mysql#26104070) 227 | 228 | 229 | ## :start: Issues en instalación de LAMP on WSL 230 | 231 | Para instalar LAMP en WSL, se usa el comando 232 | 233 | - **`sudo apt-get install lamp-server^`** 234 | 235 | Esto nos instalará todos los servicios necesarios. 236 | 237 | Si por alguna razón, al intentar abrir mysql o apache desde la terminal, da error. Se puede usar la siguiente configuración. 238 | 239 | - **`sudo mysql`** Si no funciona este comando, usar 240 | - **`sudo service mysql start`** 241 | - **`sudo /etc/init.d/mysql start`** 242 | 243 | - **`service apache2 start`** Si no funciona este comando usar el siguiente 244 | - **`sudo service apache2 start`** 245 | - **`sudo /etc/init.d/apache2 start`** 246 | 247 | _**Refs**_ 248 | 249 | - [Ubuntu 20.04 set mysql phpmyadmin root password](https://stackoverflow.com/questions/61430362/ubuntu-20-04-set-mysql-phpmyadmin-root-password) 250 | - [Cómo instalar la pila Linux, Apache, MySQL y PHP (LAMP) en Ubuntu 20.04](https://www.digitalocean.com/community/tutorials/how-to-install-linux-apache-mysql-php-lamp-stack-on-ubuntu-20-04-es) 251 | 252 | 253 | ## Cambiar privilegios en MySQL 254 | 255 | - **`ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass';`** 256 | 257 | Cambiar requetimientos para la contraseña 258 | 259 | - **`SHOW VARIABLES LIKE 'validate_password%';`** 260 | - **`SET GLOBAL validate_password.length = 6;`** 261 | - **`SET GLOBAL validate_password.policy=LOW;`** 262 | 263 | 264 | ## Comandos en VIM 265 | 266 | Presione la tecla `Esc` para ingresar al **"Modo normal"**. Luego puede escribir `:` para ingresar al **"Modo de línea de comandos"**. Aparecerán dos puntos (`:`) en la parte inferior de la pantalla y puede escribir uno de los siguientes comandos. Para ejecutar un comando, presione la tecla `Enter`. 267 | 268 | - `:q` Para salir (Abreviatura para `:quit`) 269 | - `:q!` salir sin guardar (abreviatura de `:quit!`) 270 | - `:wq` para escribir y salir 271 | - `:wq!` para escribir y salir incluso si el archivo solo tiene permiso de lectura (si el archivo no tiene permiso de escritura: forzar escritura) 272 | - `:x` para escribir y salir (similar a `:wq`, pero solo escriba si hay cambios) 273 | - `:qa` para salir de todo (abreviatura de `:quitall`) 274 | - `:cq` para salir sin guardar y hacer que Vim devuelva un error distinto de cero (es decir, salir con error) 275 | 276 | Vim tiene una amplia ayuda, a la que puede acceder con el comando **`:help`**, donde puede encontrar respuestas a todas sus preguntas y un tutorial para principiantes. -------------------------------------------------------------------------------- /nota.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jocode/Getting-Started/5edf25376e68940e58f9f6adf9e061f749006158/nota.txt -------------------------------------------------------------------------------- /python/aritmetico.py: -------------------------------------------------------------------------------- 1 | print("Ingresa el primer valor") 2 | num1= int(input()) 3 | print("Ingresa el segundo valor") 4 | num2= int(input()) 5 | 6 | suma = num1+num2 7 | resta = num1-num2 8 | multiplicacion = num1*num2 9 | division = num1/num2 10 | 11 | print("Suma: "+str(suma)) 12 | print("Resta: "+str(resta)) 13 | print("Multiplicación: "+str(multiplicacion)) 14 | print("División: "+str(division)) -------------------------------------------------------------------------------- /python/arreglos.py: -------------------------------------------------------------------------------- 1 | numbers = [1,2,3,4,5] 2 | # Position 0 1 2 3 4 3 | 4 | #Imprimirá '1' 5 | print(numbers[0]) -------------------------------------------------------------------------------- /python/comparacion.py: -------------------------------------------------------------------------------- 1 | print("Ingresa su edad") 2 | edad = int(input()) 3 | 4 | if (edad > 18): 5 | print("Eres mayor de edad") 6 | elif (edad == 18): 7 | print("Tienes justo la edad de mayor de edad") 8 | else: 9 | print("Eres menor de edad") 10 | -------------------------------------------------------------------------------- /python/for.py: -------------------------------------------------------------------------------- 1 | numbers = [1,2,3,4,5,] 2 | nombre = "Johan Camilo" 3 | 4 | for elemento in nombre: 5 | print(elemento) -------------------------------------------------------------------------------- /python/funcion.py: -------------------------------------------------------------------------------- 1 | def saludar(): 2 | print("Hola, bienvenido al mundo de la programación") 3 | 4 | def saludo(nombre): 5 | return "Hola {}, bienvenido".format(nombre) 6 | 7 | print("Ingresa tu nombre") 8 | nombre = input() 9 | print(saludo(nombre)) -------------------------------------------------------------------------------- /python/holamundo.py: -------------------------------------------------------------------------------- 1 | print("Bienvenido, ingresa tu nombre") 2 | saludo = "Hola: " 3 | nombre = input() 4 | print(saludo + nombre) -------------------------------------------------------------------------------- /python/readme.md: -------------------------------------------------------------------------------- 1 | # Python 2 | 3 | Python es un lenguaje de programación interpretado cuya filosofía hace hincapié en una sintaxis que favorezca un código legible. 4 | 5 | Se trata de un lenguaje de programación multiparadigma, ya que soporta orientación a objetos, programación imperativa y, en menor medida, programación funcional. Es un lenguaje interpretado, usa tipado dinámico y es multiplataforma. 6 | 7 | Python a diferencia de otros lenguajes de programación no usa llaves, en lugar de ellas,usa la identación para reconocer los bloques de código. Por esta razón, y al no usar punto y coma al final de cada sentencia es uno de los lenguajes más legibles y fáciles de codificar. 8 | 9 | ![Python](http://es.scoda.okfn.org/files/2017/07/python-logo-master-v3-TM-flattened.png) 10 | 11 | ## Primer hola mundo en python 12 | 13 | Para hacer nuestro primero `hola mundo` en python, usamos la función **print();** 14 | ```python 15 | print("Hola mundo") 16 | ``` 17 | 18 | Si creamos un archivo con esta línea de código, debemos ubicarnos en la carpeta raíz y a partir de ella ejecutar el comando python, indicando luego el archivo que queremos ejecutar. Por ejemplo 19 | 20 | ``python holamundo.py` 21 | 22 | *La extensión de python `.py`* 23 | 24 | En python los comentarios se pueden poner de dos formas: 25 | 26 | - Escribiendo el símbolo almoadilla (`#`) delante de la línea de texto donde está el comentario. 27 | - Escribiendo triple comilla doble (`"""`) al principio y al final del comentario (que puede ocupar más de una línea). 28 | 29 | ```python 30 | # Este es un comentario de una sola línea 31 | 32 | """ Este es un comentario multilinea. "" 33 | ``` 34 | 35 | ## ¿Cómo funciona una variable? 36 | 37 | las variables son espacios en memoria, son como cajas donde podemos guardar valores de un sólo tipo de dato. 38 | 39 | Hay otro tipo de variables que son llamadas **constantes** este tipo de variable no cambia su valor durante la ejecución del programa. 40 | 41 | El signo __+__ funciona como operador de concatenación de 2 variables de tipo texto. Concatenar, quiere decir unir dos textos en uno solo. 42 | 43 | ## Lectura de Datos 44 | 45 | Para leer datos por consola en python, debemos usar la función **input()** precedida de una variable donde queremos que se almacene el valor que digitemos. 46 | 47 | ```python 48 | nombre = input() 49 | ``` 50 | 51 | ## Operadores Aritméticos 52 | 53 | Son parte esencial de la programación. Éstos operadores aritméticos son: 54 | - `+` Suma o concatenación 55 | - `-` Resta 56 | - `/` Division 57 | - `*` Multiplicación 58 | - `%` Módulo (Resto o residio de la división) 59 | 60 | Con la función **int()** convertimos una cadena de texto u otro valor a tipo de dato entero. 61 | `int(input())` De esta forma estammos convirtiendo el texto a un número entero 62 | 63 | La función **str()** convierte un tipo de dato a cadena de texto (string) 64 | 65 | 66 | ## Operadores de comparación 67 | 68 | Estos operadores, no permiten comparar 2 valores. Los operadores de comparación son: 69 | - `>` Mayor que 70 | - `<` Menor que 71 | - `>=` Mayor o igual que 72 | - `<=` Menor o igual que 73 | - `==` Igual a 74 | - `===` Idéntico (Quiere decir que tiene el mismo valor y tipo de dato) 75 | 76 | Los operadores de comparación son muy usados junto con las estructuras de control como los condicionales. Un ejemplo de operadores de comparación con condicionales es el siguiente: 77 | 78 | ```python 79 | print("Ingresa su edad") 80 | edad = int(input()) 81 | 82 | if (edad > 18): 83 | print("Eres mayor de edad") 84 | elif (edad == 18): 85 | print("Tienes justo la edad de mayor de edad") 86 | else: 87 | print("Eres menor de edad") 88 | ``` 89 | 90 | ## Casting (Conversión de tipos de datos) 91 | 92 | Muchas veces para poder trabajar con la información, es necesario que sean del tipo de dato necesario para hacer comparaciones, sumas y demás. 93 | 94 | Por defecto al usar la función `input()`, estamos esperando que el usuario digite un valor por teclado, entonces python lo reconocerá como texto. 95 | 96 | El Casteo o casting, se le conoce al proceso de conversión de un tipo de dato a otro. Algunas funciones para conversión de tipos son: 97 | - **int()** Convierte de string a entero 98 | - **float()** Convierte de string o entero a decimal 99 | - **str()** Convierte un número a decimal 100 | 101 | ## Arreglos 102 | 103 | Son variables que pueden almacenar más de un valor, es como guardar muchas cosas en una sola caja. 104 | 105 | Los arreglos están formados por una colleción de datos, sean números o cadenas de caracteres, pero siempre del mismo tipo de dato. 106 | 107 | Para declarar un arreglo se colocan dentro de corchetes. 108 | ```python 109 | numbers = [1,2,3,4,5] 110 | 111 | ''' Imprime 1 112 | print(numbers[0]) 113 | ``` 114 | 115 | Para acceder a un valor del arreglo, debemos acceder a la posición en el que se encuentre. La posición inicia desde 0. 116 | 117 | ## Funciones 118 | 119 | Las funciones están definidas por un conjunto de lineas de código, las cuales realizan una función específica. Las funciones nos permiten descomponer los problemas, en tareas pequeñas. 120 | 121 | Para declarar una función, debemos usar la palabra reservada **def** seguido el nombre de la función con *()* al final de la palabra 122 | 123 | ```python 124 | # Definicion de la función 125 | def saludar(): 126 | print("Hola, bienvenido al mundo de la programación") 127 | 128 | # LLamada a la función 129 | saludar() 130 | ``` 131 | 132 | ### Los argumentos 133 | 134 | Los argumentos nos permiten recibir valores del exterior para usarlas en las funciones. 135 | 136 | ```python 137 | def saludo(nombre): 138 | return "Hola {}, bienvenido".format(nombre) 139 | 140 | print("Ingresa tu nombre") 141 | nombre = input() 142 | print(saludo(nombre)) 143 | ``` 144 | 145 | ## Los ciclos 146 | 147 | Son bloques de código que realizan tareas repetitivas, pueden ejecutar acciones cierto número de veces mientras una condición se cumpla 148 | 149 | ### Ciclo while 150 | 151 | Repite un bloque de código mientras se cumpla una condición. 152 | ```python 153 | rep = 0 154 | while rep <= 3: 155 | print("Mensaje") 156 | rep+=1 157 | 158 | print("El ciclo se terminó") 159 | ``` 160 | 161 | ### Ciclo For 162 | 163 | Repite un bloque de código un determinado número de veces, dependiendo de la condición que tengamos. 164 | 165 | ```python 166 | numbers = [1,2,3,4,5,] 167 | nombre = "Johan Camilo" 168 | 169 | # Imprime cada letra de la variable nombre en una nueva línea 170 | for elemento in nombre: 171 | print(elemento) 172 | ``` 173 | 174 | En python, podemos usar el ciclo for, para imprimir items de un arreglo o cadenas de caracteres como en el ejemplo anterior -------------------------------------------------------------------------------- /python/while.py: -------------------------------------------------------------------------------- 1 | rep = 0 2 | while rep <= 3: 3 | print("Mensaje") 4 | rep+=1 5 | 6 | print("El ciclo se terminó") 7 | -------------------------------------------------------------------------------- /raspberry_optimization.md: -------------------------------------------------------------------------------- 1 | # Optimizando OpenCV en la Raspberry Pi 2 | 3 | :octocat: https://github.com/opencv/opencv_contrib/releases 4 | 5 | - :star: [Install OpenCV 4 on your Raspberry Pi](https://www.pyimagesearch.com/2018/09/26/install-opencv-4-on-your-raspberry-pi/) 6 | - :star: [Optimizing OpenCV on the Raspberry Pi](https://www.pyimagesearch.com/2017/10/09/optimizing-opencv-on-the-raspberry-pi/) 7 | - [Raspbian Stretch: Install OpenCV 3 + Python on your Raspberry Pi](https://www.pyimagesearch.com/2017/09/04/raspbian-stretch-install-opencv-3-python-on-your-raspberry-pi/) 8 | - [Building a Raspberry Pi security camera with OpenCV](https://www.pyimagesearch.com/2019/03/25/building-a-raspberry-pi-security-camera-with-opencv/) 9 | - [Home surveillance and motion detection with the Raspberry Pi, Python, OpenCV, and Dropbox](https://www.pyimagesearch.com/2015/06/01/home-surveillance-and-motion-detection-with-the-raspberry-pi-python-and-opencv/) 10 | - [Tutorial de python Virtualenv](https://rukbottoland.com/blog/tutorial-de-python-virtualenv/) 11 | 12 | # NEON and FVPV3 13 | 14 | ARM NEON es una extensión de arquitectura de optimización para procesadores ARM. Fue diseñado por los ingenieros de ARM específicamente para un procesamiento de video, procesamiento de imágenes, reconocimiento de voz y aprendizaje automático más rápido. Esta optimización admite datos múltiples de instrucción única (SIMD) (a diferencia de SISD, MISD, MIMD), que describe una arquitectura en la que múltiples elementos de procesamiento en la tubería realizan operaciones en múltiples puntos de datos (hardware) todos ejecutados con una sola instrucción. 15 | 16 | Los ingenieros de ARM también incorporaron VFPV3, una optimización de punto flotante, en el chip que utiliza nuestro Raspberry Pi 3. La página ARM vinculada aquí describe las características incluidas en esta optimización, como los modos de redondeo configurables y el comportamiento personalizable predeterminado, no un número (NaN). 17 | 18 | Lo que esto significa para nosotros es que es probable que nuestra red neuronal funcione más rápido porque el procesador ARM en la Raspberry Pi 3 tiene optimizaciones de hardware que podemos aprovechar con el procesador 4 × ARM Cortex-A53, 1.2GHz. 19 | 20 | Creo que quedará realmente impresionado con los resultados, así que sigamos adelante y obtenga su OpenCV optimizado instalado en la Raspberry Pi. 21 | 22 | # Paso # 1: expanda el sistema de archivos y reclame espacio 23 | 24 | Para el resto de este tutorial haré los siguientes supuestos: 25 | 26 | 1. Estás trabajando con una nueva instalación nueva de Raspbian Stretch. 27 | 2. Esta no es la primera vez que instala OpenCV en Raspberry Pi usando entornos virtuales Python. Si es así, moje sus pies usando una de mis guías introductorias de instalación de OpenCV. 28 | 3. Te sientes cómodo con la línea de comandos y los entornos Unix. 29 | 4. Sabe cómo depurar la salida de CMake para errores comunes (entorno virtual de Python no encontrado, bibliotecas de Python faltantes, etc.). 30 | 31 | Una vez más, este tutorial es una guía avanzada, por lo que presentaré los comandos y solo proporcionaré una explicación si es pertinente; en general, debe saber qué hacen estos comandos antes de ejecutarlos. 32 | 33 | El primer paso es ejecutar, `raspi-config` y expandir su sistema de archivos: 34 | 35 | - **`sudo raspi-config`** 36 | - **`sudo reboot`** 37 | 38 | A partir de ahí, elimine Wolfram Engine y LibreOffice para recuperar ~ 1GB de espacio en su Raspberry Pi: 39 | 40 | ``` 41 | $ sudo apt-get purge wolfram-engine 42 | $ sudo apt-get purge libreoffice* 43 | $ sudo apt-get clean 44 | $ sudo apt-get autoremove 45 | ``` 46 | 47 | # Paso # 2: Instalar dependencias 48 | 49 | Los siguientes comandos actualizarán y actualizarán cualquier paquete existente, seguido de la instalación de dependencias, bibliotecas de E / S y paquetes de optimización para OpenCV: 50 | 51 | ``` 52 | $ sudo apt-get update && sudo apt-get upgrade 53 | $ sudo apt-get install build-essential cmake pkg-config 54 | $ sudo apt-get install libjpeg-dev libtiff5-dev libjasper-dev libpng12-dev 55 | $ sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev 56 | $ sudo apt-get install libxvidcore-dev libx264-dev 57 | $ sudo apt-get install libgtk2.0-dev libgtk-3-dev 58 | $ sudo apt-get install libcanberra-gtk* 59 | $ sudo apt-get install libatlas-base-dev gfortran 60 | $ sudo apt-get install python2.7-dev python3-dev 61 | ``` 62 | 63 | Todo este proceso debería tomar unos 5 minutos. 64 | 65 | **Nota**: agregué libcanberra-gtk \* que toma el GTK específico de ARM para evitar las advertencias GTK (no errores; advertencias) que puede encontrar al ejecutar scripts Python + OpenCV en la Raspberry Pi. 66 | 67 | # Paso # 3: descargue el código fuente de OpenCV 68 | 69 | A continuación, descargue el código fuente de OpenCV para los repositorios opencv y opencv_contrib, y luego descomprimalos: 70 | 71 | ``` 72 | $ cd ~ 73 | $ wget -O opencv.zip https://github.com/opencv/opencv/archive/4.3.0.zip 74 | $ unzip opencv.zip 75 | $ wget -O opencv_contrib.zip https://github.com/opencv/opencv_contrib/archive/4.3.0.zip 76 | $ unzip opencv_contrib.zip 77 | ``` 78 | 79 | **NOTA:** Para esta publicación de blog, utilizaremos OpenCV 4.3.0; sin embargo, a medida que se lanzan versiones más nuevas de OpenCV, puede actualizar los números de versión correspondientes. 80 | 81 | Ver las versiones en: 82 | 83 | - :start: [opencv](https://github.com/opencv/opencv/releases) 84 | - :start: [opencv contrib](https://github.com/opencv/opencv_contrib/releases) 85 | 86 | # Paso 4: crea tu entorno virtual de Python e instala NumPy 87 | 88 | Utilizaremos entornos virtuales de Python, una práctica recomendada cuando trabajemos con Python. 89 | 90 | Puede instalar pip, `virtualenv` y `virtualenvwrapper` usando los siguientes comandos: 91 | 92 | ``` 93 | $ sudo pip3 install virtualenv virtualenvwrapper 94 | $ sudo rm -rf ~/.cache/pip 95 | ``` 96 | 97 | Una vez que se hayan instalado `virtualenv` y `virtualenvwrapper`, abra su `~ / .bashrc` y agregue las siguientes líneas al final del archivo, utilizando su editor de texto basado en terminal favorito, como vim, emacs o nano: 98 | 99 | ``` 100 | # virtualenv and virtualenvwrapper 101 | export WORKON_HOME=$HOME/.virtualenvs 102 | export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3 103 | export VIRTUALENVWRAPPER_VIRTUALENV=/usr/local/bin/virtualenv 104 | source /usr/local/bin/virtualenvwrapper.sh 105 | export VIRTUALENVWRAPPER_ENV_BIN_DIR=bin 106 | ``` 107 | 108 | - **`nano ~/.profile`** 109 | 110 | Deberá ejecutar `source ~ / .bashrc` **cada vez** que abra un nuevo terminal / SSH en su Pi para asegurarse de que las variables del sistema se hayan configurado correctamente (también carga este archivo en el arranque). 111 | 112 | A continuación, cree su entorno virtual Python 3: 113 | 114 | - **`mkvirtualenv cv -p python3`** 115 | 116 | Aquí estoy creando un entorno virtual de Python llamado _cv_ usando Python 3 (alternativamente, también puede usar Python 2.7 cambiando el interruptor `-p` a `python2`). 117 | 118 | Puedes nombrar el entorno virtual como quieras, pero yo uso **`cv`** como la convención de nomenclatura estándar aquí en PyImageSearch. 119 | 120 | Finalmente, instale NumPy en el entorno virtual de Python: 121 | 122 | - **`pip install numpy`** 123 | 124 | # Paso 5: compila e instala la biblioteca OpenCV optimizada para Raspberry Pi 125 | 126 | Ahora estamos listos para compilar e instalar la versión optimizada de Raspberry Pi. 127 | 128 | Asegúrese de estar en el entorno virtual de `cv` con el comando `workon`: 129 | 130 | - **`workon cv`** 131 | -------------------------------------------------------------------------------- /raspberrypi.md: -------------------------------------------------------------------------------- 1 | # :rocket: Guía de instalación para Raspberry PI :white_check_mark: 2 | 3 | ## Instalando el SO para la tarjeta microSD 4 | 5 | Vamos a la [página oficial](https://www.raspberrypi.org/downloads/) de Raspberry en el apartado de descargas y tenemos 2 opciones: 6 | 7 | - Descargar el **_Raspberry Pi Imager_**, esta aplicación nos facilita el proceso de descarga y escritura del SO en la tarjeta SD (Así como Media Creation Tools de windows) 8 | - Descargar las imágenes del sistema operativo que deseemos usar e instalar el SO en la tarjeta SD mediante programas como [Rufus](https://rufus.ie/) (Más ligero que el siguiente pero sólo funciona para Windows) o [balenaEtcher](https://www.balena.io/etcher/) 9 | - Raspberry OS (Antes llamado Raspbian) es el sistema operativo de Raspberry y existen [3 alternativas](https://www.raspberrypi.org/downloads/raspberry-pi-os/) 10 | - Raspberry Pi OS (32 bits) con escritorio y software recomendado 11 | - Raspberry Pi OS (32-bit) with desktop (Mejor relación) 12 | - Raspberry Pi OS (32-bit) Lite 13 | 14 | También podemos seguir la [guía oficial](https://projects.raspberrypi.org/en/projects/raspberry-pi-setting-up) 15 | 16 | ## Conectando la Tarjeta 17 | 18 | Para ello necesitamos 19 | 20 | - Raspberry Pi 21 | - Fuente de alimentación 22 | - Tarjeta micro SD con Raspbian instalado 23 | - Teclado y Mouse 24 | - Cable HDMI 25 | 26 | Luego seguimos el proceso de configuración del sistema operativo como el idioma deseado y la conexión a red wifi. 27 | 28 | Para actualizar los repositorios usamos los comandos (Recordar que Raspberry OS funciona con Debian, una distribución de Linux) 29 | 30 | - `sudo apt-get update` 31 | - `sudo apt-get upgrade` 32 | 33 | - **`clear`** Limpia la terminal 34 | 35 | Por defecto, Raspberry OS crea un usuario llamado **pi** `pi@raspberrypi` 36 | 37 | - **`pwd`** (print working directory) Muestra la ruta donde esta ubicado actualmente 38 | 39 | - **`ls`** Mustra los archivos que hay en una carpeta 40 | 41 | - **`cd ..`** (cd => change directory) Sube un nivel en la carpetas 42 | 43 | - **`cd home`** Cambia de directorio a la carpeta especificada 'home' 44 | 45 | - **`mkdir micarpeta`** (mkdir => Make Directory) Crea una carpeta con el nombre 'micarpeta' 46 | 47 | - **`rmdir micarpeta`** Elimina la capeta 'micarpeta' 48 | 49 | - **`touch miarchivo.txt`** Creamos un archivo llamado 'miarchivo.txt' 50 | 51 | - **`rm miarchivo.txt`** Eliminamos el archivo con el nombre 'miarchivo.txt' 52 | 53 | - **`nano texto.txt`** Abre un programa editor en la terminal en dónde podemos editar el contenido 54 | 55 | `nano` no es l único editor, también está vim p `imacs` 56 | 57 | - **`cat texto.txt`** Vemos el contenido que hay dentro de un archivo 58 | 59 | - **`history`** Muestra el historial de los comandos digitados (Con las flechas del teclado arriba y abajo podemos navegar entre ellos) 60 | 61 | - **`rm -rf micarpeta`** Elimina una carpeta que contiene archivos 62 | 63 | ## **`apt`** Advance Packaging Tool 64 | 65 | Raspberry OS es basado en Debian. El administrador de paquetes en un programa que administra otros paquetes. Con él podemos instalar y remover paquetes de software. 66 | 67 | - **`sudo`** (SuperUser DO) Debemos digitar este comando cuando deseemos instalar paquetes que requieran privilegios 68 | 69 | - **`sudo apt-get dist-upgrade`** Actualiza y remueve los programas que ya están obsoletis 70 | 71 | - **`sudo apt-get install screenfetch`** Con este comando instalamos programas, éste programa **screenfetch** se ejecuta desde consola y muestra las propiedades del sistema Operativo 72 | 73 | Como Raspberry en un mini computador, podremos programar en él. 74 | 75 | ## **Headless Mode** Modo sin periféricos 76 | 77 | Apagamos la Raspberry Pi. Luego de apagado se puede desconectar. 78 | 79 | - Ver la guía [Cómo configurar Raspberry Pi Zero W en modo Headless vía WiFi](https://mecatronicauno.com/configurar-raspberry-pi-zero-w-modo-headless-via-wifi/) 80 | - Recomendado: [Cómo instalar Raspbian en Raspberry](www.youtube.com/watch?v=fFj3a4qtTkA) 81 | 82 | Para ello necesitamos algunos programas **nmap**, que lo usaremos para escanear que dispositivos están conectados a la red para saber la IP del dispositivo. 83 | 84 | En linux podemos instalarlo usando 85 | 86 | - **`sudo apt-get install nmap`** 87 | 88 | Para escanear las IPs usamos 89 | 90 | - `nmap -sn 192.168.0.0/24` Escanea los primeros 24 dispositivos 91 | 92 | Para escanear las IPs de la red local usamos 93 | 94 | - `nmap -sn 192.168.0.0/24 -oG-` 95 | 96 | O descargar el programa [Advanced IP Scanner](https://www.advanced-ip-scanner.com/es/) Es un software grafico que escanea una red en cuestión de segundos 97 | 98 | ### Putty 99 | 100 | Para conectarnos por SSH podemos usar Putty para windows o usar git bash si tienen instalado git. 101 | 102 | GPIO Hammer Header (Solderless) - Para la conexión en Raspberry Pi Zero W 103 | 104 | [VNC-Connect-and-Raspberry Pi](https://help.realvnc.com/hc/en-us/articles/360002249917-VNC-Connect-and-Raspberry-Pi#operating-vnc-server-at-the-command-line-0-6) 105 | 106 | ## :zap: Configurando Raspberry Pi para conexión por SSH 107 | 108 | > Por defecto la conexión **ssh** no está habilitada en la raspberry Pi. Para ello debemos habilitar la opción usando. 109 | 110 | 1. Insertamos la memoria microSD en el PC y vamos a la carpeta **boot** 111 | 2. Creamos una archivo **ssh** sin extensión. Con windows podemos usar PowerShell y escribir 112 | 113 | - `type nul > ssh` (Ésto nos creará el archivo con nombre ssh) 114 | 115 | 3. Desconectamos la tarjeta y la insertamos en la Raspberry Pi. 116 | 117 | **_Es importante ver la guía 'Cómo configurar Raspberry Pi Zero W en modo Headless vía WiFi, esto nos permitirá conectar la tarjeta a la red WiFi para poder identificarla sin tener que usar monitor, teclado y mouse._** 118 | 119 | Sin para conectarla por wifi, sólo debemos crear el siguiente archivo en la misma carpeta donde se ha colocado el archivo `ssh`. Este archivo lleva el nombre de **`wpa_supplicant.conf`** 120 | 121 | ``` 122 | country=CO 123 | ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev 124 | update_config=1 125 | network={ 126 | ssid="NombreDeMiRedWiFi" 127 | psk="ContraseñaDeMiRedWiFi" 128 | key_mgmt=WPA-PSK 129 | } 130 | ``` 131 | 132 | Donde debemos cambiar el país (**Country**) y el nombre y contraseña de la red a la cual estamos conectados. (Esto es si no se tiene un cable ethernet, o si si se quiere conectar vía WIFI para evitar cables) 133 | 134 | Con esto, al conectar la Raspberry se conectará a la red ya podrá ver el dispositivo conectado. 135 | 136 | Si lo deseas, puedes incluir más de una red _wpa_supplicant_ seleccionará la red que califica como la mejor opción basada en: 137 | 138 | - Orden de redes en el archivo wpa_supplicant.conf 139 | - Nivel de seguridad (se prefiere WPA2) 140 | - Intensidad de señal 141 | Al hacerlo se verá algo como esto: 142 | 143 | ``` 144 | # Red 1 145 | network={ 146 | ssid="SSID1" 147 | psk="password1" 148 | key_mgmt=WPA-PSK 149 | } 150 | 151 | # Red 2 152 | network={ 153 | ssid="SSID2" 154 | psk="password2" 155 | key_mgmt=WPA-PSK 156 | } 157 | ``` 158 | 159 | ### :lock: Conexión SSH 160 | 161 | Para conectar por SSH podemos usar la terminal de Windows CMD, o usar Putty, (Es un programa que debemos descargar) o mediante GitBash si tienen git instalado. 162 | 163 | En putty, escribimos la ip a la cual está conectada la tarjeta y las contraseña por defecto es **raspberry** 164 | 165 | Usando la terminal, bien sea CMD, o la del sistema operativo que tengamos, digitamos **SSH** y colocamos los siguientes comandos. Recordar que por defecto raspberry tiene el usuario **pi**: 166 | 167 | - **`ssh pi@192.168.0.x`** 168 | - Ingresamos la contraseña, por defecto es **_raspberry_** 169 | 170 | * **`sudo apt-get install screenfetch`** Instala in programa que nos permite ver las características del dispositivo 171 | 172 | Para **cambiar las configuraciones en la raspberry**, de puede acceder a: 173 | 174 | - **`sudo raspi-config`** 175 | 176 | Esto nos abrirá las opciones para configurar raspberry pi 177 | 178 | :star: Para hablitar la opción de VNC (Para ver la interfaz desde otro computador), debemos seleccionar la opción 179 | 180 | - Interface Option 181 | - VNC (Habilitar o deshabilitar la opción gráfica remota) 182 | 183 | Aquí se puedes cambiar otras opciones como la contraseña o el usuario de la tarjeta conectada a la red. 184 | 185 | ### Instalando VNC en Raspberry Pi 186 | 187 | Debemos tener instalado el programa que nos permite realizar la conexión remota. Para ello debemos instalar el paquete en linux mediante 188 | 189 | - `sudo apt-get install -y realvnc-vnc-server realvnc-vnc-viewer` 190 | 191 | Esto nos descargará los archivos necesarios para realizar la conexión y ver la interfaz gráfica. 192 | 193 | - `vncserver` (Con este comando ejecutamos el programa) 194 | 195 | Este programa ejecuta el programa y nos muestra las opciones para poder conectarnos desde el otro ordenador. 196 | 197 | ### Instalando VNC Viewer en el PC 198 | 199 | Se necesita descargar el programa en el PC para poder realizar la conexión. Luego de tenerlo instalado, lo abrimos y vamos a la opción 200 | 201 | - Archivo 202 | - Nueva Conexión 203 | 204 | Esto nos arbirá una ventana donde debemos ingresar los datos que nos ha proporcionado la Raspberry Pi 205 | 206 | ## Apagar la Raspberry Pi usando la consola 207 | 208 | Para apagar la raspberry Pi (Recordar que estamos trabajando con una versión de Linux), podemos ejecutar la siguientes instrucciones: 209 | 210 | - **`sudo power off`** Apaga inmediatamente 211 | 212 | - **`sudo poweroff`** Pregunta la contraseña del super usuario como confirmación para apagar el sistema. 213 | 214 | ## :eyes: :star: Instalando OpenCV en Raspberry Pi 215 | 216 | **REF** [Cómo instalar OpenCV en Raspberry Pi](https://omes-va.com/como-instalar-opencv-en-raspberry-pi/) 217 | 218 | Previo a la instalación de OpenCV en python 3, necesitamos instalar algunos paquetes, esto lo haremos a través de la siguiente línea: 219 | 220 | - `sudo apt-get install libhdf5-dev libhdf5-serial-dev libatlas-base-dev libjasper-dev libqtgui4 libqt4-test` 221 | 222 | > Es importante ejecutar la línea anterior para un correcto funcionamiento 223 | 224 | ### Instalando OpenCV 4 en Raspberry Pi 225 | 226 | Vamos a instalar la versión de OpenCV 4.1.0.25. Usamos pip3 install `opencv-contrib-python`, tal y como lo hicimos en la instalación de OpenCV en Windows, empleamos contrib para que se instalen los módulos principales y extras. 227 | 228 | - `pip3 install opencv-contrib-python==4.1.0.25` 229 | 230 | ## Comprobar que OpenCV 4 se ha instalado correctamente en la Raspberry Pi 231 | 232 | Para comprobar que se ha instalado OpenCV, digitamos python3 en el terminal e importamos OpenCV para finalmente imprimir la versión instalada. 233 | 234 | Digitamos python3 y escribimos los siguiente. Esto nos debería arrojar 235 | 236 | ```py 237 | import cv2 238 | cv2.__version__ 239 | # 4.1.0 240 | ``` 241 | 242 | - **Probando con una imagen** 243 | 244 | ```py 245 | import cv2 246 | 247 | image = cv2.imread('nombreimagen.jpg') 248 | cv2.imshow('Imagen', image) 249 | cv2.waitKey(0) 250 | cv2.destroyAllWindows() 251 | ``` 252 | 253 | - **Reproducir un vídeo** 254 | 255 | ```py 256 | import cv2 257 | 258 | cap = cv2.VideoCapture('nombrevideo.avi') 259 | 260 | while (cap.isOpened()): 261 | ret, frame = cap.read() 262 | 263 | cv2.imshow('Video', frame) 264 | 265 | if cv2.waitKey(25) & 0xFF == 27: # Si se presiona ESC cerramos el ciclo 266 | break 267 | 268 | cap.release() 269 | cv2.destroyAllWindows() 270 | ``` 271 | 272 | ## Extras para mejor funcionamiento en Raspberry Pi Zero W 273 | 274 | **REF** [Installing OpenCV in PiZeroW](https://towardsdatascience.com/installing-opencv-in-pizero-w-8e46bd42a3d3) 275 | 276 | 1. Expander el sistema de archivos 277 | 278 | Expandemos el sistema de archivos para no tener problemas de espacio de almacenamiento 279 | 280 | - **`sudo raspi-config --expand-rootfs`** 281 | 282 | 2. Aumentar espacio de intercambio 283 | 284 | El espacio de intercambio es una parte de una unidad de disco duro (HDD) que se utiliza para la memoria virtual. Tener un archivo de intercambio permite que el sistema operativo de su computadora simule que tiene más RAM de la que realmente tiene. Esto aumentará el proceso de compilación de openCV. De lo contrario, terminará con un error de memoria agotada. 285 | Para aumentar el tamaño de Swapsize, abra el archivo de intercambio de su pi zero con el siguiente comando: 286 | 287 | - **`sudo nano /etc/dphys-swapfile`** 288 | 289 | Vaya a Cambiar tamaño y cámbielo a 2048 desde 100. como se muestra a continuación. 290 | 291 | ``` 292 | . 293 | # where we want the swapfile to be, this is the default 294 | #CONF_SWAPFILE=/var/swap 295 | # set size to absolute value, leaving empty (default) then uses computed value 296 | # you most likely don't want this, unless you have an special disk situation 297 | #CONF_SWAPSIZE=100 298 | CONF_SWAPSIZE=2048 299 | . 300 | ``` 301 | 302 | **_Reiniciamos el sistema_** 303 | 304 | - **`sudo reboot`** 305 | 306 | ## Installing dependencies 307 | 308 | Primero vamos a actualizar y actualizar los paquetes existentes: 309 | 310 | - **`sudo apt-get update`** 311 | - **`sudo apt-get upgrade`** 312 | 313 | Si está utilizando **Raspbian Buster**, ejecute el siguiente comando: 314 | 315 | - **`sudo apt update`** 316 | - **`sudo apt upgrade`** 317 | 318 | Instalar las herramientas de desarrollo 319 | 320 | - **`sudo apt-get install build-essential cmake pkg-config`** 321 | 322 | Instale los paquetes IO: 323 | 324 | - **`sudo apt-get install libjpeg-dev libtiff5-dev libjasper-dev libpng12-dev`** 325 | 326 | Junto con algunos paquetes de E / S de video (aunque es poco probable que realice un gran procesamiento de video con Raspberry Pi Zero): 327 | 328 | - **`sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev`** 329 | - **`sudo apt-get install libxvidcore-dev libx264-dev`** 330 | 331 | Necesitaremos instalar la biblioteca de desarrollo GTK para la interfaz GUI de OpenCV: 332 | 333 | - **`sudo apt-get install libgtk2.0-dev`** 334 | 335 | Y paquetes de optimización de rutina apalancados por OpenCV: 336 | 337 | - **`sudo apt-get install libatlas-base-dev gfortran`** 338 | 339 | El único requisito para construir enlaces de Python + OpenCV es tener instalado NumPy, así que instale NumPy usando pip: 340 | 341 | - **`pip3 install numpy`** 342 | 343 | Finalmente todos los comandos son: 344 | 345 | ``` 346 | 1. sudo apt-get update & sudo apt-get upgrade & sudo rpi-update 347 | 2. sudo nano /etc/dphys-swapfile 348 | CONF_SWAPSIZE=2048 349 | 3. sudo apt-get install build-essential cmake pkg-config 350 | 4. sudo apt-get install libjpeg-dev libtiff5-dev libjasper-dev libpng12-dev 351 | 5. sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev 352 | 6. sudo apt-get install libxvidcore-dev libx264-dev 353 | 7. sudo apt-get install libgtk2.0-dev libgtk-3-dev 354 | 8. sudo apt-get install libatlas-base-dev gfortran 355 | - sudo apt install libqtgui4 (Por si lanza error en ImportError: libQtGui.so.4) 356 | ``` 357 | 358 | **Prerrequisitos** :star: [`pip install opencv`](https://www.pyimagesearch.com/2018/09/19/pip-install-opencv/#download-the-code) 359 | 360 | ``` 361 | $ sudo apt-get install libhdf5-dev libhdf5-serial-dev libhdf5-103 362 | $ sudo apt-get install libqtgui4 libqtwebkit4 libqt4-test python3-pyqt5 363 | $ sudo apt-get install libatlas-base-dev 364 | $ sudo apt-get install libjasper-dev 365 | ``` 366 | 367 | :star: **REF** [Install OpenCV 4 on Raspberry Pi 4](https://www.pyimagesearch.com/2019/09/16/install-opencv-4-on-raspberry-pi-4-and-raspbian-buster/) 368 | 369 | Si tiene un módulo de cámara Raspberry Pi conectado a su RPi, también debe instalar la API PiCamera ahora: 370 | 371 | - **`pip3 install "picamera[array]"`** 372 | 373 | - **`pip3 install opencv-contrib-python==4.1.0.25`** 374 | 375 | **NOTA** No haga este paso si ha realizado el anterior 376 | 377 | Avancemos y descarguemos el código fuente de OpenCV para los repositorios opencv y opencv_contrib, seguido de desarchivarlos: 378 | 379 | ``` 380 | - $ cd ~ 381 | - $ wget -O opencv.zip https://github.com/opencv/opencv/archive/4.1.1.zip 382 | - $ wget -O opencv_contrib.zip https://github.com/opencv/opencv_contrib/archive/4.1.1.zip 383 | - $ unzip opencv.zip 384 | - $ unzip opencv_contrib.zip 385 | - $ mv opencv-4.1.1 opencv 386 | - $ mv opencv_contrib-4.1.1 opencv_contrib 387 | ``` 388 | 389 | Y... eso es todo amigos :octocat: 390 | -------------------------------------------------------------------------------- /ser_freelance.md: -------------------------------------------------------------------------------- 1 | # Trabajar como Freelance 2 | 3 | El término **freelancer**, como dato curioso, viene de las personas que se conocían como mercenarios, personas dueñas de su tiempo, de su agenda. Eran personas que eran contratadas para asesinar o secuestrar a otras personas. 4 | 5 | Un **freelancer** es un trabajador independiente que ofrece sus servicios específicos para empresas o personas. Trabaja de forma autónoma gestionando su tiempo y trabajo. 6 | 7 | No tiene horarios fijos, ni usa uniforme, tampoco sufre por el tráfico de la ciudad o el ajetreo del trasporte público. 8 | 9 | Ser **freelancer** es un estilo de vida, es una actitud ante la profesión. Una responsabilidad que debe tener, es ser responsable de si mismo. 10 | 11 | Tu carrera profesional dependerá solo de ti y por eso es importante tener un portafolio, estar actualizado sobre tecnologías, tener proyectos claves, clientes claves, puntos interesantes para trabajar. 12 | 13 | - Ser freelance 14 | - Estilo de vida 15 | - Actitud ante la profesión 16 | 17 | 18 | - **¿Cuál es el mejor momento para ser freelancer?** 19 | 20 | Cuando ya tienes experiencia trabajando en un ambiente laboral y en equipo, esto te va a servir de práctica para cuando estés en situaciones donde trabajes remotamente, sin dejar a un lado tu objetivo: lograr resultados. 21 | 22 | Cuando ya tienes **disciplina** en tu vida personal, y sabes **comunicarte** con las personas. Además de saber tratar a tus clientes como **clientes** y sepas vivir de manera **organizada** utilizando herramientas que te ayuden. 23 | 24 | 25 | ## Mi portafolio y mi marca personal 26 | 27 | Debes tener un perfil de **Linkedin** no importa tu carrera o profesión, esta es la red profesional para conseguir empleo. 28 | - Incluye tus mejores proyectos, es tu oportunidad para mostrar la calidad de tu trabajo. 29 | - Describe los skills que usaste para la construcción de tus proyectos. Colocándolas harás que más personas se interesen en tu perfil. 30 | - Si tienes certificaciones muéstralas también. 31 | 32 | 33 | - Usar **Linkedin** para 34 | - Mejores proyectos 35 | - Skills 36 | - Certificaciones 37 | 38 | - Desarrollo (Github & Twitter) 39 | - Diseñador (Behance, Instagram, Dribble) 40 | - Producción Audivisual (Youtube, Instagram, 500px.com) 41 | 42 | 43 | - **Dónde encontrar trabajo como Freelancer** 44 | 45 | Uno de los retos más grandes de ser Freelancer es conseguir los clientes suficientes para generar los proyectos más interesantes además de mantener un ingreso constante. 46 | 47 | - [Freelancer](https://m.freelancer.es/) 48 | - [Workana](https://www.workana.com/dashboard) 49 | - [Fiverr](https://www.fiverr.com/) 50 | - [Soy Freelancer](https://www.soyfreelancer.com/) 51 | 52 | 53 | ## Pagos 54 | 55 | ### Cómo cobrar como Freelancer 56 | 57 | **Aspectos a considerar para poner precio a tu trabajo** 58 | 59 | - Averigua cuánto cobrar por proyecto. 60 | - Compara lo que ganas con lo que deberías ganar. Debes repensar cuanto estás ganando y cuánto es el estimado del proyecto. En caso de que te estés vendiendo caro procura hacer notorio el valor agregado al proyecto. 61 | - Los freelancer no ganan poco, el pago debería ser una negociación con el cliente para concretar un acuerdo mutuo. 62 | - El cliente es una persona, una empresa, cliente eventual, cliente a largo plazo. No hagas tratos con la familia porque puede complicar la relación familiar. 63 | - Elabora un presupuesto mensual. 64 | - Estima cuántos proyectos podrías hacer al mes. No te atiborres con proyectos, se realista en cuántos proyectos puedes hacer al mismo tiempo. 65 | - Evalúa los costos relacionados 66 | - Estima el esfuerzo que requiere cada proyecto. 67 | 68 | 69 | Herramientas útiles 70 | - [Cuánto cobrar por su trabajo](https://www.soyfreelancer.com/cuanto-cobrar-por-tu-trabajo) 71 | - [Cómo funciona la cultura de Platzi](https://platzi.com/blog/como-funciona-cultura-platzi/) 72 | 73 | 74 | ## Contratos 75 | 76 | En este tema debemos ser serios y responsables. Debemos tener claro el pago y las condiciones que estamos solicitando. También debemos ser empáticos con el cliente que espera recibir garantías. 77 | 78 | - **Plan de trabajo**. El cliente se va a seguir más tranquilo si le muestras esta proyección de actividades y resultados. 79 | - **Cronogramas**. Puedes enseñarle que harás en los próximos días. 80 | - **Documentación**. 81 | - **Alcances**. 82 | 83 | > **Nunca ejecutes un proyecto sin un contrato** 84 | 85 | En **cobros** se suele pedir 50% del costo total para arrancar y 50% al finalizar. 86 | 87 | Una recomendación es solicitar 50% para iniciar el proyecto y el resto diferido en meses. 88 | 89 | **Contratos Digitales** Es una plataforma para contratos. 90 | - [HelloSign](https://www.hellosign.com/) 91 | 92 | > Como freelance se debe garatizar un flujo de dinero mensual. 93 | 94 | 95 | ### Recibir pagos trabajando como Freelance 96 | 97 | **Transferencia Electrónicas.** 98 | 99 | Debes tener una cuenta en el banco a tu nombre, en algunas empresas no te van a realizar el pago si la cuenta no está a tu nombre. Esto funciona muy bien cuando están en el mismo país, si manejas negocios con bancos nacionales. 100 | 101 | **Payoneer** 102 | 103 | Esto funciona muy bien cuando tu cliente se encuentra en otro país. Payoneer es la forma de manejar transferencias electrónicas de manera internacional y te proporciona una tarjeta de débito, puedes manejar tu moneda en dolares y euros. 104 | 105 | **Paypal** 106 | 107 | Es la opción amada por muchos. Es el método de pago más popular, por la facilidad para crear una cuenta. Es como una capa que te permite generar transferencias internacionales y que al final se depositará en tu cuenta bancaria nacional. 108 | 109 | Paypal tiene una comisión al momento de hacer esta transferencia a tu cuenta bancaria nacional. 110 | 111 | **Skrill** 112 | 113 | Es un método de pago que también tiene bastante tiempo en el mercado. 114 | 115 | **MercadoPago** 116 | 117 | Con esta opción puedes generar un código QR y enviárselo a tu cliente y a partir de eso puede generar una transferencia a tu cuenta. Puede que tenga alguna restricción dependiendo de tu país. Funciona muy bien en México, Colombia y Argentina. 118 | 119 | 120 | 121 | ### Facturas e impuestos 122 | 123 | Cuando ya tengas un método de pago y contrato. Lo que un cliente te solicitará para realizarte un pago es una factura. Debes estar al día con todo el sistema tributario y **nunca evadir impuestos**. 124 | 125 | - **Colombia**: 126 | - No todos los profesionales están obligados a pagar impuestos. 127 | - Si ganas menos de 4.000 UVT no deberías pagar impuestos. 128 | - Date de alta como **Persona natural**, podrás generar facturas pero pagar menos impuestos 129 | - Es regulado por **DIAN** (Dirección de Impuestos y Aduanas Nacionales). Vas a recibir un **RUT** (Registro único tributario). También te añaden el **NIT**. 130 | - Las facturas también son en formato digital. 131 | 132 | 133 | - **México:** 134 | - El tipo de régimen en el sistema tributario recomendado es **Persona física con actividad empresarial**. - Es importante que no te des de alta como una empresa porque las únicas que pueden generar facturas son las empresas. 135 | - **RFC**. Registro Federal de Contribuyentes. 136 | - Mensualmente debes declarar el **IVA, ISR**. La institución encargada de regular esto es el **SAT** (Sistema de Administración Tributaria). 137 | - Las facturas son digitales respaldadas por un Comprobante Fiscal Digital por Internet(**CFDI**) 138 | 139 | 140 | ## Organizar mi tiempo y espacio 141 | 142 | ### Organizar mi espacio 143 | 144 | Trabajar en pijamas todo el día puede resultar muy cómodo, pero la recomendación es que tengas mucho orden en el espacio de trabajo que estás definiendo. Si nosotros decidimos colocar nuestro espacio de trabajo en el comedor nos vamos a sentir invadidos por nuestra familia, nosotros también estamos invadiendo un espacio de la casa que es para otro propósito. 145 | 146 | No tener las condiciones adecuadas de trabajo puede afectar mucho la productividad y el resultado que vas a entregar. Muchos de los retrasos o fallos en nuestro proyectos es porque no tenemos el espacio adecuado de trabajo. 147 | 148 | - **Reserva un espacio de trabajo** donde sea. Cómprate una mesa, un escritorio y una silla de trabajo donde estés cómodo. Elige un espacio de trabajo iluminado que te guste, donde te sientas tranquilo, debe ser tu lugar favorito para trabajar. 149 | - Si sientes que en tu casa no hay lugar de cómodo donde puedas trabajar. Puedes usar los **Coworking**, te ofrecen escritorios propios, decoraciones interesantes, algunos ofrecen cervezas, fiestas. Todo esto debes incluir en tu presupuesto y plan de trabajo. 150 | - **Tu equipo de cómputo** debe ser lo bastante portátil para poder irte a una cafetería o en cualquier lugar del mundo. 151 | - Debes tener un **internet** aceptable para mantener conversaciones remotas, llamadas, reuniones, etc. 152 | 153 | 154 | > El equipo de cómputo debe ser **potente** y muy **portátil**. Es la herramienta que tendrás por el resto de tu vida. 155 | 156 | ### Organizar mi jornada laboral 157 | 158 | Si crees que ser **freelance** te dará más tiempo libre para hacer todas tus cosas, pues deberías tener un horario fijo en donde tus clientes puedan contactarte. Algunos clientes pueden malinterpretar el ser autónomo como el hecho de estar disponible las 24 horas del día. 159 | 160 | Tienes que ser **disciplinado**. El ser freelancer y tener la autonomía de tu tiempo puede ser un **arma de doble filo** porque te puede dar la libertad de no hacer nada o para que te apasiones tanto y todo el día estés trabajando. Todo esto debe **equilibrarse** porque hace parte de nuestra **calidad de vida**. 161 | 162 | - Tiempo: 163 | - **Definir horarios de trabajo**, date un mínimo de horas pueden ser ocho, siete o cuatro, las que tu quieras. 164 | - Decide si vas a trabajar de lunes a viernes, de lunes a domingo, etc. 165 | - **Comida**. Define horarios de comida, muchas veces se nos olvida comer. 166 | - **Pausas activas**. Te ayudan a cuando algo no sale bien, estas pueden durar unos 10 o 15 minutos, sal de tu casa, respira aire. 167 | - **Concentración**. Busca un momento de silencio, tu familia debe saber que estás trabajando y deben respetar tu espacio de trabajo. 168 | 169 | 170 | ### Soy Freelancer, soy productivo 171 | 172 | Genera un plan de ejecución del proyecto organizado por días. Así tus clientes pueden saber el avance del proyecto por días y asegurarse que estás avanzando acorde al plan. 173 | 174 | Después de generar un cronograma de trabajo, puede seguir con una lista de tareas o *To-Dos*. Puedes apoyarte de herramientas como **Trello** y sacar mucho provecho de sus tableros con listas de tareas **To Do, Doing y Done**. Así puedes saber en qué estás trabajando. 175 | 176 | La **técnica de Pomodoro** te ayuda a enfocarte en las tareas específicas que quieres lograr. Debes decidir la tarea que debes hacer, un mínimo de tiempo(25 minutos) después un break de cinco minutos, después sigue trabajando en los 25 minutos cuantas veces quieres. Lo recomendado es hacer 4 pomodoros y después tomarte un descanso largo de 15 a 30 minutos. 177 | 178 | Utiliza todo lo que esté a tu alcance para ser más productivo. 179 | 180 | 181 | **Herramientas** 182 | - Jira (Cronograma de trabajo) 183 | - Trello (To-Do's) 184 | - Google Tasks (Controlar Detalles) 185 | - Google Calendar (Definir jornadas de trabajo) 186 | - Monday (Combina varias herramientas) 187 | - Técnica Pomodoro (Centra en tareas específicas) 188 | - Be Focused 189 | - [Tómate tu tiempo - Android](https://play.google.com/store/apps/details?id=com.crexative.pomtask) 190 | - Slack (Comunicación con tu equipo) 191 | - Google Meets, Skype, Zoom 192 | 193 | > Utiliza todo lo que esté a tu alcance para ser más productivo. **¡Vete de vacaciones!** 194 | 195 | 196 | ### Cuidarme laboralmente 197 | 198 | **Cuidar mi trabajo, cuidar mis ingresos, cuidarme a mi**. 199 | 200 | Esto debería ser un mantra en nuestra vida diaria, debe ser un balance en nuestra vida que debemos tener y procurar 201 | 202 | - Contrata un seguro médico. Al ser freelancer no tendremos este beneficio que nos otorga una compañía al ser obligado por la ley. Depende del freelancer contratarlo. 203 | - Prepárate para el futuro. Contratar una Afore o un Fondo de pensiones también va a correr por tu cuenta al no estar trabajando en una compañía 204 | - También puedes ir ahorrando una cantidad de dinero para tu casa. 205 | - Busca más fuentes de ingresos que sean recurrentes, mensuales y puedas estar seguro algunos meses para no pasar momentos difíciles. 206 | 207 | 208 | **Cuidado de las finanzas** 209 | 210 | Una de las artes que desarrollas con la experiencia es la de ser administrado. Administrar nuestras finanzas es uno de los retos más grandes y es aún más grande cuando tus ingresos no son regulares, como cuando eres Freelancer. 211 | -------------------------------------------------------------------------------- /software_development_style_guide.md: -------------------------------------------------------------------------------- 1 | # Guías de Estilo (Convenciones de Nombres) 2 | 3 | Uso de escritura en tipo CamelCase. 4 | * __UpperCamelCase__ Cuando la primera letra de cada una de las palabras es mayúscula. Ejemplo: `EjemploDeUpperCamelCase`. 5 | * __lowerCamelCase__ Igual que la anterior con la excepción de que la primera letra es minúscula. Ejemplo: `ejemploDeLowerCamelCase`. 6 | * __lowercase__ Todas las palabras en minúsculas. Ejemplo: `ejemplodelowercase` 7 | * __uppercase__ Toas las palabras en mayúsculas. Ejemplo: `EJEMPLODEUPPERCASE` 8 | 9 | Para los dos últimos casos, es importante separar cada palabra con guión bajo `_`, por ejemplo `ejemplo_de_lowercase` y `EJEMPLO_DE_UPPERCASE`, de esta forma se podrá leer mejor. 10 | 11 | ## Bases de Datos 12 | 13 | Algunos prefijos usados en bases de datos son: 14 | * __PK__: Primary key 15 | * __DF__: Default 16 | * __CK__: Check constraint 17 | * __FK__: Foreign Key 18 | 19 | 20 | Generalmente hay un debate en las convenciones de nombres. Cada uno de ellos son subjetivos dependiendo de la empresa o gustos personales. 21 | 22 | En este caso estableceremos algunas convenciones para las bases de datos. 23 | 24 | * **Reglas Generales** 25 | - Evitar espacios en blanco 26 | - No usar palabras clave reservadas por el motor de base de datos, en el nombre se las entidades o campos. 27 | - Evitar nombrar campos con valores de tipos de datos (text...) 28 | - Ser explícito en el nombrado de datos. 29 | - Usar inglés en el nombrado, por ser más compacto y no tener caracteres especiales. 30 | 31 | * **Tablas y Vistas** 32 | - Usar sustantivos (Nombres) en singular, y con la estructura UpperCamelCase 33 | _Person_, _User_, etc. Para las entidades. 34 | - Evitar el uso de prefijos y sufijos, porque son redundantes y resultan difíciles para determinar el objeto rápidamente. 35 | 36 | * **Claves y campos** 37 | - **Clave Primaria** Nombrar la columna de clave primaria con un simple `id` 38 | - **Clave foránea** Nombrar el campo con el nombre de la tabla referenciada y el id. Por ejemplo `person_id` 39 | - Para el nombrado de campos usar lowercase con uso de guines bajos, separando cada palabra. Por ejemplo `expiration_date` 40 | 41 | * **Restricciones (Relaciones)** 42 | - Usar una mezcla de prefijo, nombre de tabla y nombre de campo, usando UpperCamelCase, con guiones bajos. Por ejemplo: `FK_Order_CustomerId` 43 | 44 | De esta manera estamos indicando la relación a la llave foránea, indicando la tabla referenciada y el campo que almacena la clave foránea de la tabla. 45 | 46 | * **Procedimientos almacenados y funciones** 47 | - En estos casos, mezclar el nombre del objeto (Entidad o Tabla) en combinación con un verbo separado por guión bajo, usando UpperCamelCase. 48 | Por ejemplo: `Customer_GetAll` `Customer_Insert` 49 | 50 | -------------------------------------------------------------------------------- /tips_for_developers.md: -------------------------------------------------------------------------------- 1 | # Tips for developers 2 | 3 | Este archivo contiene consejos para desarrolladores, donde se muestran herramientas y consejos útiles a la hora de realizar proyectos para clientes. 4 | 5 | 6 | ## ¿Cómo realizar una cotización? 7 | 8 | Es importante destacar que **todos los proyectos son diferentes** por eso los precios no van a ser iguales, así sean del mismo tipo (Web, móvil, etc) 9 | 10 | 1. **Anota los requerimientos de tu cliente**. 11 | NO puedes poner un precio sin saber de qué se trata. Con esto evitarás pérdidas y enojos si defines bien esta parte y la pones en el contrao en el **contrato** 12 | 13 | En el contrato debe estimarse 14 | * Plazo 15 | * Tiempo de soporte 16 | 17 | 18 | 2. **Calcula los costos humanos** 19 | ¿Cuántas personas necesitarás para este proyecto? ¿Cuántas horas/hombre se requieren? 20 | 21 | 22 | 3. **Calcula los costos NO humanos** 23 | ¿Qué herramientas necesitas y cuánto le cuestan? Por ejemplo conexión a internet, licencias de software, movilidad, energía eléctrica, etc. 24 | 25 | Por ejemplo, una computadora que cuestra `USD $1000` y se estima una vida útil de 2 años = 24 meses 26 | 27 | De acuero a esto, calculamos el costo de la computadora al mes 28 | 29 | Costo PC mes = $1000 / 24 = $41,667 30 | 31 | 4. **Agrega 20% de ganancias** 32 | Los costos anteriores se van a pagar en herramientas y equipo humano. Necesitas ganancias, sin ganancias habrás trabajado gratis. 20% es el **mínimo** razonable 33 | 34 | 35 | 5. **Agrega 10% de extra para negociación** 36 | Siempre el cliente quiere pedir rebaja. Necesitarás un margen para negociar con el cliente. Si el presupuesto es exacto y el cliente le pide rebaja, quedarás en pérdida. 37 | 38 | 39 | 6. **Agrega los impuestos** 40 | El gobierno siempre nos va a pedir su parte. Suma todo lo anterior y aumentale el porcentaje de impuestos de acuerdo a tu paías. El resultado de todo lo anterior es la cotización que le puedes ofrecer al cliente. 41 | 42 | 43 | 7. **BONUS** 44 | - SIEMPRE cobra un anticipo (Nunca cobres al final) 45 | - Firma un contrato especificando los requerimientos, el plazo de entrega, las condiciones del servicio y el cronograma de pagos. *¡Todo debe estar en el contrato!*, es el respaldo que se tiene. 46 | 47 | 48 | 49 | ## ¿Cuánto cobrar por un proyecto? 50 | 51 | Muchas veces no sabemos cuánto cobrar por un proyecto, la siguiente guía nos dará una noción sobre cuánto podemos cobrar por un desarrollo. 52 | 53 | 1. Saber el salario promedio de un programador en tu país 54 | 55 | Por ejemplo, en Colombia el salario promedio es de `USD $1000`, por colocar un ejemplo 56 | 57 | En base a esto calculamos el salario anual 58 | 59 | Salario al año = $1000 * 12 meses = $120000/año 60 | 61 | Si un año tiene 52 semanas, y de esas 2 las tomamos de vacaciones nos quedará 50 semanas de trabajo. 62 | 63 | Si se trabajan 40 horas por semana, tendremos una cantidad de **2000 horas** laborales en el año 64 | 65 | Entonces basado en eso, calculamos el precio por hora 66 | 67 | `Precio Hora = $12000 / 2000 = $6 / hora` 68 | 69 | 70 | Ya como tenemos eso, debemos incluir los **impuestos** 71 | 72 | Si se suma el 30% de impuestos, el precio de la hora quedaría 73 | 74 | `$6 * 1.3 = 7.8 = $8 / hora (Redondeado)` 75 | 76 | *Teniendo definido el precio por hora, ya es cuestión de estimar la duración que puede tener el proyecto en horas* 77 | 78 | Si es un proyecto entero, es mejor acolchonar el tiempo que se ha estimado, porque pueden resultar algunas condiciones que pueden hacer que el proyecto dure más de los esperado y, en consecuencia tener pérdidas. En cambio, si se llega a hacer en menos tiempo, vas a tener unas horas extras "pagas" que pueden ayudar bastante en los momentos donde no haya trabajo, haciendo que no esté sin nada de dinero en este tiempo. Pero es bueno saber administrar el dinero que le llega apartando una porción para cada necesidad. 79 | 80 | Finalmente, cuando ganes más experiencia es bueno considerar aumentar los honorarios. -------------------------------------------------------------------------------- /tips_git.md: -------------------------------------------------------------------------------- 1 | 2 | # TIPS GIT 3 | 4 | _Son comandos generales usados en git, aquí están para recordarlos fácilmente y tenerlos a la mano._ 5 | 6 | - **git config --global color.ui true** // Configuramos el color de git, parahacerlo más didáctico 7 | 8 | - **cd** -> Nos permite movernos dentro de carpetas. 9 | - **cd..** -> Salimos de la captea 10 | - **mkdir name-folder** -> Crea una carpeta 11 | - **ls** -> Muestra el listado de las carpetas 12 | - **clear** -> Limpia la terminal 13 | - **Ctrl + L** -> Limpia la terminal 14 | - **touch name-file** -> Permite crear archivos 15 | - **rm name-file** -> Elimina archivos 16 | - **rm -rf name-folder** -> Elimina la carpeta 17 | 18 | - **:wq** -> Guarda los cambios de los archivos cuando se trabaja con vim 19 | 20 | __*Nunca usar rm -rf / o se despiden de su pc*__ 21 | 22 | ## VIM 23 | **i** = para poder editar 24 | 25 | **:wq** = para guardar y salir 26 | 27 | **:q!** = para salir sin guardar 28 | 29 | - **git init name_repositorio** -> Crea el repositorio con un nombre en específico 30 | - **git status** -> Vemos el estado de los archivos 31 | 32 | Untracked files -> Archivos en el working directory, no han sido agregados a git 33 | 34 | - **git add -A** -> Agrega todos los archivos del working directory al staging area 35 | - **git add name_file** -> Deja los archivos listos para agregarlos al repositotio (Staging area) 36 | - **git rm --cached [file]** -> Quita el archivo del area de preparacion 37 | git rm -f -> Elimina los archivos del area de trabajo y el area de preparacion 38 | 39 | - **git commit -m [message]** -> Confirmamos los cambios para agregar los archivos al repositorio 40 | - **start [filename]** -> Abrimos un archivo con el programa que tengamos predefinido en el SO 41 | 42 | - **git commit --amend** -> Concatena un commit anterior con el nuevo, dejando solo uno en caso de que te hayas olvidado agregar un archivo 43 | 44 | ## Etiquetas (git tag) 45 | Hay dos tipos de etiquetas 46 | * Ligeras 47 | * Anotadas 48 | 49 | - **git tag [version]** -> Etiqueta ligera 50 | - **git tag -a [version] -m [mensaje]** -> Etiqueta anotada 51 | - **git tag -l** -> Muestra el listado de las etiquetas 52 | 53 | 54 | ## Etiquetar un commit 55 | - **git tag [version] [SHA-1 Commit]** 56 | - **git tag -d [name tag]** -> Elimina la etiqueta 57 | - **git tag -f -a [name tag] -m [mensaje]** -> Renombra la etiqueta 58 | 59 | ## Historia de nuestro proyecto (git log) 60 | - **git log** -> Muestra los registros de los commits 61 | - **git log --oneline** -> Muestra solo el mensaje del commit 62 | - **git log --oneline --graph** -> Muestra los gradicos de la historia de los commits 63 | - **git log -[numero]** -> Muestra los ultimos registros de los commits 64 | - **git log --oneline --graph --decorate** -> Muestra los gráficos del historial y los nombres de las ramas 65 | 66 | ## Revisando Cambio entre versiones (git diff) 67 | Compara el estado inicial con el estado que queremos comparar 68 | 69 | - **git diff [SHA-1]** 70 | - **git diff [SHA-1] [SHA-1]** 71 | 72 | ## Quita un cambio (commits), y lo deja en el staging area (git reset --soft) 73 | * --soft 74 | * --mixed 75 | * --hard 76 | 77 | - **git reset --soft [SHA 1]**: elimina los cambios hasta el staging area 78 | - **git reset --mixed [SHA 1]**: elimina los cambios hasta el working area 79 | - **git reset --hard [SHA 1]**: regresa hasta el commit del [SHA 1] 80 | 81 | Es importante conocer los SHA-1, en el caso de borrar los registros con git reset--hard, 82 | también podemos recuperar los registros con este mismo comando, usando el SHA-1, mas reciente 83 | 84 | ## Configurar otro editor de texto en Git 85 | - **git config --global core.editor "subl --wait"** Configurar sublime como editor por defecto de git 86 | 87 | ## Ramas (Multiples variantes del repositorios) git branch 88 | - **git branch [name]** -> Crea una rama 89 | - **git branch -l** -> Muestra todas las ramas 90 | - **git branch -d [name]** -> Elimina una rama 91 | - **git branch -D [name]** -> Forza el borrado de una rama 92 | - **git branch -m [name] [new name]** -> Renombra las ramas 93 | 94 | ## Moviéndonos entre ramas y versiones (git checkout) 95 | - **git checkout [branch/tag/SHA-1]** -> Cambiamos de rama, commit, o etiqueta 96 | - **git checkout -b [name]** -> Crea y cambiamos a esa rama 97 | 98 | 99 | ## Mezclando ramas y resolviendo conflictos (git merge) 100 | Para mezclar los cambios deberíamos usar el comando git merge. Las instrucciones sería pararnos desde la rama que queremos mezclar y hacer un git merge con la rama que pretendemos usar. 101 | 102 | - **git merge [branch]** 103 | 104 | ## Reescribe la historia de tu proyecto (git rebase) 105 | - **git rebase [branch]** -> hace prácticamente lo mismo que merge, cambiamos la historia de nuestro proyecto sin crear bifurcaciones del proyecto. Es mejor usar merge 106 | - **git rebase -i [branch]** -> de manera interactiva, nos abrira el editor que tengamos definido en la configuración de git. 107 | 108 | ## Guardando cambios temporalmente (git stash) 109 | Stash es un estado que tenemos como intermedio. Para esto debemos ir a alguna de nuestras ramas y usando 110 | el comando git stash que nos permite hacer cambios, pero no confirmarlos. 111 | 112 | - **git stash** -> Es otro de los limbos, como el staging area. Para agregar los cambios estos deben estar en el staging area. 113 | - **git stash list** -> nos muestra la lista de stash que tengamos. 114 | - **git stash drop stash@{numero}** -> nos permite borrar un stash. 115 | - **git stash apply** -> aplicamos el último cambio 116 | - **git stash apply ** -> Aplica el cambio seleccionado 117 | 118 | ## Eligiendo commits selectivamente (Cherry pick) 119 | Si estás trabajando en una rama, pero de repente notas que hiciste un cambio en la rama que no debías, 120 | para esto podemos usar cherry pick. Este comando nos puede salvar la vida, ya que nos permite sacar 121 | cambios específicos de una rama y mezclarlos en otra. 122 | 123 | - **git cherry-pick [SHA1]** -> Cambia un commit a otra rama, lo copia 124 | 125 | ## Clonando Repositorios Remotos 126 | 127 | - **git clone [HTTPS/SSH]** 128 | 129 | ## Generar clave ssh 130 | 131 | - **ssh-keygen -t rsa -b 4096 -C "email@email.com"** -> Genera una clave SSH 132 | - **clip < ~/.ssh/id_rsa.pub** -> Copia la clave pública 133 | 134 | ## Repositorios Locales y remotos 135 | 136 | - **git remote add [origin] [SSH/HTTPS]** -> Conecta un repositorio con nuestro equipo local. 137 | - **git remote -v** -> Lista las conexiones existentes. 138 | - **git remote remove [origin]** -> Elimina una conexión con algún repositorio. 139 | 140 | ## Trayendo cambios desde el repositorio remoto 141 | 142 | - **git fetch [origin] [master]** -> Descarga los cambios a una rama generalmente llamada origin/master, seguido de esto tienes que fuisonar esa rama 143 | - **git pull [origin] [master]** Es como ejecutar los 2 pasos anteriores(fetch y merge) en uno solo 144 | - **git merge origin/master --allow-unrelated-histories** -> Mezcla la rama master del repositorio remoto con la de nuestro repositorio, esto se hace cuando usamos el comando git fetch 145 | 146 | ## Enviando cambios al repositorio remoto 147 | 148 | - **git push origin master** -> Enviamos los cambios que tengamos en nuestro repositorio local 149 | - **git push origin --tags** -> Enviamos las etiquetas que tengamos 150 | - **git push origin [branch]** -> Enviamos una rama 151 | 152 | ## Creando un template para Pull Request 153 | 154 | 1. Crear archivo llamado pull_request_template.md 155 | 2. Definir los lineamientos usando sintaxis markdown 156 | 3. Hacer commit 157 | 158 | ## Creando un template para issues 159 | Lo ideal es que siempre que creemos un proyecto tengamos un template para enviar pull requests o cuando tengamos issues. 160 | 161 | **issue_template.md** 162 | 163 | 164 | ## .gitignore (Ignorando archivos no deseados) 165 | 166 | Si tienes archivos que no pueden ser públicos, como archivos de configuración con contraseñas, lo ideal es que no los subas a tu repositorio, estos archivos los puedes poner en el archivo .gitignore. 167 | https://www.gitignore.io/ 168 | 169 | ## Issues y Milestones (Reportando y monitoreando errores eficientemente) 170 | - **Issues:** Sirve para reportar un problema o sugerir algún cambio que para el repositorio. 171 | - **Milestones:** Forma para agrupar Issues o Pull Request. 172 | 173 | ## Github Pages y Dominios personalizados en Github 174 | 175 | Además de servirme como hosting de páginas estáticas con [Github Pages](https://pages.github.com/), GitHub me permite personalizar la URL de mi GitHub Pages. ¿Cómo hacemos eso? 176 | 177 | 1. Primero debo comprar el dominio, por ejemplo lo compro en namecheap.com. 178 | 179 | 2. En el dashboard de namecheap vamos a *Manage* de nuestro dominio, vamos a *Advanced DNS*. 180 | 181 | 3. Allí debemos colocar en `A Record` el valor de la ip del servidor de github. Y en `CNAME Record`, el dominio a enlazar (*midominio.com*) 182 | 183 | 4. En **GitHub** vamos a *Settings* y damos clic en agregar una URL personalizada. 184 | 5. En la raíz del proyecto, creamos el archivo `CNAME` y en él ponemos la URL del dominio que compramos, por ejemplo `midominio.com`. 185 | 186 | Sólo eso, y ya debemos esperar a que se enlacen los servicios y, el tiempo depende del la empresa que nos lo ofrece. 187 | 188 | Desde la consola de comandos de windows, podemos verificar la ip, que tenemos asignada. 189 | - **ping username.github.io** -> Para verificar la ip asignada 190 | - **nslookup username.github.io** -> Verifica las ip del servidor 191 | 192 | ### Dominios personalizados configurados con `A Records` 193 | 194 | Si se configura un dominio personalizado utilizando un A Record, el A Record debe apuntar a una de las siguientes direcciones IP 195 | 196 | * 185.199.108.153 197 | * 185.199.109.153 198 | * 185.199.110.153 199 | * 185.199.111.153 200 | 201 | 202 | -------------------------------------------------------------------------------- /trabajo_programacion.md: -------------------------------------------------------------------------------- 1 | # Cómo conseguir trabajo en Programación 2 | 3 | ## ¿Qué necesitas para comenzar? 4 | 5 | Hoy la tecnología nos permite trabajar desde dónde estemos. 6 | 7 | - Trabajar desde tu lugar de origen 8 | - Trabajo de alto valor 9 | - Haz lo que te gusta 10 | - Haz tu propiia empresa o se parte de un gran proyecto 11 | 12 | 13 | **¿Cómo es la vida de desarrollo en el Silicon Valley?** 14 | 15 | - Optimiza el software que tiene todo el tiempo 16 | - Constante aprendizaje y actualización técnica 17 | 18 | 19 | **Qué hace diferente al programador del Silicon Valley?** 20 | 21 | - Su curiosidad 22 | - Su habilidad para resolver problemas 23 | - Enfoque de resultados 24 | - Explorar herramientas y formas de hacer las cosas 25 | 26 | > El sentido de experimentar, tener curiosidad e ir a hablar con clientes. 27 | 28 | 29 | **Información** 30 | 31 | - ¿Cómo puedo estar al día? 32 | - TechCrunch 33 | - Reddit 34 | - ProductHunt 35 | - Colaborar activamente y desarrollar nuevas ideas. 36 | 37 | 38 | ## Networking & Social Media 39 | 40 | - **¿Qué es un networking?** 41 | 42 | - Eventos, meetups, conferencias 43 | - Tendencias y líderes de opinión 44 | - Identifica y crea amigos con intereses comunes 45 | 46 | 47 | **¿Dónde puedo operar?** 48 | Tu trabajo, hoy en día lo puedes hacer donde quieras en el mundo 49 | - En mi localidad 50 | - Explorar un centro de emprendimiento local 51 | - Explorar el mundo y desarrollar una visión global. 52 | 53 | 54 | **Oportunidades para crear una carrera como Desarrollador de clase mundial** 55 | ¿Cómo crear valor? 56 | - Crear una experiencia de usuario UX interesante 57 | - Desarrolla para los temas de la actualidad 58 | - VR 59 | - AI 60 | - Big Data 61 | - Crear ambientes de operación en el back-end 62 | 63 | 64 | 65 | ## Minimum Viable Mindset 66 | 67 | Tu minimum viable mindset para ser un **gran desarrollar** 68 | 69 | > Pensar en hacer un gran producto requiere 70 | - Un buen diseño 71 | - Una operación confiable y eficiente que resuelva en forma simple un buen problema. 72 | 73 | - [The Minimum Viable Mindset](https://es.slideshare.net/zavala55/the-minimum-viable-mindset) 74 | 75 | 76 | - **Qué tan hambriento estás?** 77 | - ¿Conversas tus aspiraciones con expertos? 78 | - ¿Tienes un mentor? 79 | - ¿Cómo aprendes a hacer software? 80 | - ¿Valoras tus fracasos como fuentes de aprendizaje? 81 | 82 | **Tu estado de ánimo** 83 | Tu mindset determina tu éxito 84 | 85 | **Éxito = aprendizaje+práctica** 86 | 87 | ## Construyendo tu perfil 88 | 89 | - Tu portafolio 90 | - Un portafolio de proyectos 91 | - Github, LinkedIn 92 | - Lenguajes 93 | - Bases de datos 94 | - Métodos de trabajo 95 | - Herramientas 96 | 97 | > El mundo de la programación, no es el mundo de lo que sabes, es el mundo de la aplicación de tus conocimientos. 98 | 99 | Sólo tus proyectos te abren puertas y muestras quién eres como programador. 100 | 101 | 102 | ### Entrevista y caso de éxito 103 | 104 | Ser programador no es sólo poner líneas de código, es poder transformar la vida de las personas. 105 | 106 | - redglobalmxsf: https://www.facebook.com/redglobalmxsf/ 107 | - tieeco: https://www.tieeco.org/ 108 | - siliconvalleyforum: https://siliconvalleyforum.com/ 109 | - ecorner: https://ecorner.stanford.edu/ 110 | 111 | 112 | ### Tips para ser freelance en programación 113 | 114 | - Sitios para hacer Freelance 115 | - **workana**: https://www.workana.com/ 116 | - **toptal**: https://www.toptal.com/ 117 | - **freelancer**: https://www.freelancer.es/ 118 | - **upwork**: https://www.upwork.com/ 119 | - **freelancer**: https://www.freelancer.com/ 120 | 121 | 122 | - Sitios para Resolver Retos 123 | - **kaggle**: https://www.kaggle.com/ 124 | - **Codecombat**: https://codecombat.com/ 125 | - **fightcodegame**: https://www.fightcodegame.com/ 126 | - **battlecode**: http://www.battlecode.org/ 127 | - **Hackerrank** https://www.hackerrank.com/ 128 | --------------------------------------------------------------------------------