Documents Documentation Publicación 0.0.1 snicoper 10 de October de 2014 Índice general 1. Editores 1.1. Netbeans . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2. Sublime Text . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.3. vim . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 3 4 10 2. Git 2.1. 2.2. 2.3. 2.4. 2.5. 2.6. 15 15 17 18 22 22 23 Comandos Basicos Git . . . . . . . . . . . . . . Configruacion de Git desde la linea de comandos Crear repositorio centralizado . . . . . . . . . . Git en Windows . . . . . . . . . . . . . . . . . Git Config Linux . . . . . . . . . . . . . . . . . Gitignore Global . . . . . . . . . . . . . . . . . 3. Linux 3.1. Apache . . . . . . . . . . . . . . . . . 3.2. Fedora Centos . . . . . . . . . . . . . 3.3. Kde . . . . . . . . . . . . . . . . . . . 3.4. MariaDB . . . . . . . . . . . . . . . . 3.5. Nginx . . . . . . . . . . . . . . . . . . 3.6. PHP . . . . . . . . . . . . . . . . . . . 3.7. PostgreSQL . . . . . . . . . . . . . . . 3.8. Python . . . . . . . . . . . . . . . . . 3.9. Redis . . . . . . . . . . . . . . . . . . 3.10. Ruby . . . . . . . . . . . . . . . . . . 3.11. Scala . . . . . . . . . . . . . . . . . . 3.12. Ubuntu . . . . . . . . . . . . . . . . . 3.13. Añadir carpetas al PATH . . . . . . . . 3.14. Añadir programas al menu . . . . . . . 3.15. Bind . . . . . . . . . . . . . . . . . . 3.16. Comando Cat con texto coloreado . . . 3.17. Comando dd . . . . . . . . . . . . . . 3.18. Comando find . . . . . . . . . . . . . 3.19. Comando setfacl . . . . . . . . . . . . 3.20. Comprimir descomprimir desde consola 3.21. Configurar mutt . . . . . . . . . . . . 3.22. Comandos Utiles . . . . . . . . . . . . 3.23. Contar lineas de un proyecto . . . . . . 3.24. Crear grupos y añadir usuarios a grupos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 . 25 . 28 . 43 . 45 . 46 . 57 . 65 . 67 . 72 . 72 . 74 . 74 . 83 . 83 . 87 . 91 . 91 . 91 . 91 . 92 . 94 . 94 . 103 . 103 I 3.25. 3.26. 3.27. 3.28. 3.29. 3.30. 3.31. 3.32. 3.33. 3.34. 3.35. 3.36. 3.37. 3.38. 3.39. 3.40. 3.41. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104 104 105 105 106 106 106 107 108 110 111 111 111 112 112 112 112 4. Mono - Monodevelop 4.1. Compilar Mono y Monodevelop . . . . . . 4.2. Creacion de un proyecto ASP.NET MVC 5 4.3. Repos de Mono y Monodevelop . . . . . . 4.4. Mono 3.4.1 Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113 113 114 115 116 5. Programacion 5.1. Apuntes sin clasificar . . . . . . . . . . . . . 5.2. C# y ASP.NET MVC . . . . . . . . . . . . . 5.3. Html Css . . . . . . . . . . . . . . . . . . . 5.4. Javascript . . . . . . . . . . . . . . . . . . . 5.5. MariaDB . . . . . . . . . . . . . . . . . . . 5.6. PCRE - Perl Compatible Regular Expressions 5.7. PHP . . . . . . . . . . . . . . . . . . . . . . 5.8. PostgreSQL . . . . . . . . . . . . . . . . . . 5.9. Python . . . . . . . . . . . . . . . . . . . . 5.10. UML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117 117 120 152 155 161 164 166 167 171 191 6. Windows 6.1. Eliminar un Servicio . . . . . . . . . 6.2. Instalación de PostgreSQL Windows 6.3. Instalación Python en Windows . . . 6.4. Instalar Cygwin . . . . . . . . . . . 6.5. Instalar PHP y Laravel . . . . . . . . 6.6. KDE For Windows . . . . . . . . . . 6.7. MongoDB en Windows . . . . . . . 6.8. ODBC PostgreSQL en Windows . . . 6.9. Olbidar Red . . . . . . . . . . . . . 6.10. Visual Studio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195 195 195 197 198 198 200 200 201 201 202 II Diferencias entre adduser y useradd . . Instalar Dropbox . . . . . . . . . . . . Formatear discos con mkfs . . . . . . . Generar clave para SSH . . . . . . . . Instalación de Memcached . . . . . . . Instalación MongoDb . . . . . . . . . Instalación NodeJS . . . . . . . . . . . Mi bashrc . . . . . . . . . . . . . . . . Mostrar Imagenes BIN, ISO, CUE, etc. Montar particiones al iniciar sistema . . Redimensionar una imagen . . . . . . Saber donde esta un “ejecutable” . . . Saber temperatura del PC . . . . . . . Source Code Pro . . . . . . . . . . . . Tunel SSH . . . . . . . . . . . . . . . Ver permisos en octal de los archivos . Virtualbox, problema con Alt Gr . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Documents Documentation, Publicación 0.0.1 Estos son los apuntes que he ido acumulando durante los últimos años sobre informática que quiero compartirlos con todos. Algunos apuntes son sacados de otras paginas y no tengo links de referencia, eran apuntes personales!. Si eres autor de alguno de mis apuntes y quieres que ponga referencia a tu articulo o quieres que lo quite, por favor, mándame un email. Pido disculpas por las faltas de ortografía o errores en los apuntes, etc, pero solo eran unos apuntes .txt que lo he pasado a .rst. Cualquier sugerencia o corrección [email protected] Contents: Índice general 1 Documents Documentation, Publicación 0.0.1 2 Índice general CAPÍTULO 1 Editores Contents: 1.1 Netbeans Contents: 1.1.1 Join Lines Advertencia: Mejorar si lo vuelvo hacer. Añadir comando para juntar lineas. Tools->Options->Editor->Macros tab (New) button -> Macro Name type you want ex “join-line” below textarea Macro code: cut and paste this line (Set Shortcut) button -> Ctrl+J (press Ctrl key + J) End another useful thing delete-line macro NOT Ctrl+E caret-end-line selection-begin-line remove-selection test for yourself 1.1.2 LF Windows Poner final de linea LF en Netbeans Editar como administrador. 3 Documents Documentation, Publicación 0.0.1 C:\Program Files\NetBeans 7.3\etc\netbeans.conf Buscar netbeans_default_options= y añadir -J-Dline.separator=LF -J-Dfile.encoding=UTF-8 1.2 Sublime Text Contents: 1.2.1 Anaconda Fuentes https://github.com/DamnWidget/anaconda/blob/master/Anaconda.sublime-settings La configuración se pone en Preferences -> Package Settings -> Anaconda -> Settings User. { "python_interpreter": "/home/snicoper/.virtualenvs/default/bin/python", "anaconda_linter_mark_style": "none", "complete_parameters": true, "anaconda_gutter_theme": "alpha", "display_signatures": true, "pep8_max_line_length": 100, "auto_formatting": false, "pep8_ignore": [ ], } 1.2.2 Build Python 3 en Linux En Linux, tanto en Fedora como en Ubuntu se tiene instalado Python 2.x y 3.x, por defecto al pulsar Ctrl+B ejecuta Python 2.x. Para cambiar este comportamiento, en el editor: Tools -> Build System -> new Build System { "cmd": ["python3", "-u", "$file"], "file_regex": "^[ ]*File \"(...*?)\", line ([0-9]*)", "selector": "source.python" } Lo guardo como Python3.sublime-build en .config/sublime-text-3/Packages/User Ahora en Tools > Build System seleccionar Python3 4 Capítulo 1. Editores Documents Documentation, Publicación 0.0.1 Virtualenv Ejemplo de como ejecutarlo para un entorno virtual de Python Virtualenv { "cmd": ["/home/snicoper/.virtualenvs/py3venv/bin/python3", "-u", "$file"], "file_regex": "^[ ]*File \"(...*?)\", line ([0-9]*)", "selector": "source.python" } 1.2.3 Codeintel Atención: Para recordar, me dejo aquí algunos ejemplos, hay que cambiar las rutas. Configuracion Linux vim ~/.codeintel/config { "PHP": { "php": ’/usr/bin/php’, "phpExtraPaths": [], "phpConfigFile": ’/etc/php.ini’ }, "JavaScript": { "javascriptExtraPaths": [] }, "Perl": { "perl": "/usr/bin/perl", "perlExtraPaths": [] } "Python": { "python": ’/usr/bin/python’, "pythonExtraPaths": [] }, "Python3": { "python": ’/usr/bin/python3’, "pythonExtraPaths": [] }, "virtualenv_de_muestra": { "python": ’/home/snicoper/venvs/py3venv/bin/python3’, "pythonExtraPaths": [ ’/home/snicoper/venvs/py3venv/lib/python3.3/site-packages’ ] }, } 1.2.4 Error LANG=en_US.UTF-8 sublime_text Me paso en Ubuntu Editar 1.2. Sublime Text 5 Documents Documentation, Publicación 0.0.1 sudo vim /usr/share/applications/sublime_text.desktop Buscar y remplazar: # buscar Exec=/opt/sublime_text/sublime_text %F # remplazar Exec=bash -c "LANG=en_US.UTF-8 /opt/sublime_text/sublime_text %F" 1.2.5 Instalacion Packages Instalacion de Package Control import urllib.request,os,hashlib; h = ’7183a2d3e96f11eeadd761d777e62404’ + ’e330c659d4bb41d3bdf022e94 Packages comunes SublimeLinter DocBlockr Git SideBarGit GitGutter SidebarEnhancements Tabright BlockCursorEverywhere (https://github.com/jlangston/BlockCursorEverywhere) Theme Predawn Python Anaconda Djaneiro Python Imports Sorter # Linux: Super+Shift+I Python varios SublimeREPL PythonImproved 6 Capítulo 1. Editores Documents Documentation, Publicación 0.0.1 Javascript Css Requiere algunos paquetes de Instalación NodeJS less less2css Better Typescript Minifier (ctrl + alt + shift + m) Otros Me dejo aquí algunos addons para recordar el nombre. Theme - Flatland SublimeLinter-pep8 Monokai extended AllAutocomplete SublimeCodeIntel Markdown Preview Alignment Emmet PHP Getters and Setters php-twig FavoriteFiles Tomorrow Color Schemes Theme - Soda Theme - Spacegray Theme - Spacefunk 1.2.6 Key Bindings Algunas combinaciones de teclas no me funciona por defecto, por lo que tengo configuradas una pocas. Algunas sin modificar si funcionan el Windows, pero para no tener 2 diferentes, uso esta configuración en ambos sistemas. [ // Indetntar codigo { "keys": ["ctrl+shift+."], "command": "indent" }, // DesIndentar codigo { "keys": ["ctrl+shift+,"], "command": "unindent" }, // Comentar linea { "keys": ["ctrl+shift+c"], "command": "toggle_comment", "args": { "block": false } }, 1.2. Sublime Text 7 Documents Documentation, Publicación 0.0.1 // Comentar bloque { "keys": ["ctrl+shift+b"], "command": "toggle_comment", "args": { "block": true } }, // Join lines { "keys": ["ctrl+j"], "command": "join_lines" }, // Alignment (No lo instalo) // { "keys": ["ctrl+shift+a"], "command": "alignment" }, // Reindentar lineas { "keys": ["alt+shift+l"], "command": "reindent" , "args": { "single_line": false } } ] 1.2.7 Ejeplo de un Proyecto Referencia de un archivo de proyecto Sublime Text 3 { "folders": [ { "follow_symlinks": true, "path": "/home/snicoper/projects/python", "folder_exclude_patterns": [ ".idea", ], "file_exclude_patterns": [ "phpdoc-*", ".directory", ] } ], // Anaconda "settings": { "python_interpreter": "/home/snicoper/.virtualenvs/py3venv/bin/python3", "auto_complete_triggers": [ {"selector": "source.python - string - comment - constant.numeric", "characters": "."}] } } 1.2.8 SublimeREPL Por defecto ejecuta Python 2 en Linux, para cambiar de ejecutable, hay que modificar un archivo. Crear una copia Python/Main.sublime-menu cp .config/sublime-text-3/Packages/SublimeREPL/config/Python/Main.sublime-menu .config/sublime-text-3 Abrir el archivo vim .config/sublime-text-3/Packages/SublimeREPL/config/Python/Main.sublime-menu # Ejecutar en busqueda y remplazo con vim :%s/\"cmd\"\: \[\"python\"\,/\"cmd\"\: \[\"python3\"\,/g Para mostrar la consola Tools -> SublimeREPL -> Python -> Elegir uno 8 Capítulo 1. Editores Documents Documentation, Publicación 0.0.1 1.2.9 Typescript compiler Comprobar donde esta el binario de tsc which tsc Añadirlo a Preferences > Package Settings > Better Typescript > Settigs User { "binDir": "/usr/local/bin", "compileOnSave": true } 1.2.10 Settings User Esta configuración la uso tanto en Linux como en Windows, solo mirar que la fuente este instalada o cambiar por otra, también ajustar tamaño fuente. Abrir Preferences > Setting - User { // Colors and theme "theme": "predawn.sublime-theme", "color_scheme": "Packages/Predawn/predawn.tmTheme", "tabs_small": true, "findreplace_small": true, // Font "font_face": "Source Code Pro", "font_size": 10.5, "font_options": "subpixel_antialias", // Editor view look-and-feel "highlight_line": true, "show_minimap": false, "show_full_path": true, "bold_folder_labels": true, // Editor behavior "highlight_modified_tabs": true, "find_selected_text": true, "shift_tab_unindent" : false, "tab_completion": false, // Word wrapping - follow PEP 8 recommendations "rulers": [ 100 ], "word_wrap": false, // Whitespace - no tabs, trimming, end files with \n "tab_size": 4, "translate_tabs_to_spaces": true, "trim_trailing_white_space_on_save": true, "ensure_newline_at_eof_on_save": true, // Sidebar - exclude distracting files and folders "file_exclude_patterns": [ ".DS_Store", 1.2. Sublime Text 9 Documents Documentation, Publicación 0.0.1 "*.pid", "*.pyc", ".directory", "*.sublime*", ], "folder_exclude_patterns": [ ".git", ".svn", ".hg", "__pycache__", "env", "env3", ".idea", ".codeintel", "migrations", ], "ignored_packages": [ ], "vintage_start_in_command_mode": true } 1.3 vim Contents: 1.3.1 Mi .vimrc Fuentes https://github.com/spf13/spf13-vim https://github.com/chriskempson/tomorrow-theme/tree/master/vim/colors spf13-vim vim ~/.vimrc.bundles.local " Guias de indentacion " Bundle ’Yggdroot/indentLine’ vim ~/.vimrc.local set mouse= set nospell set nofoldenable set nocursorline colorscheme wombat256 let g:indent_guides_enable_on_vim_startup = 0 10 Capítulo 1. Editores Documents Documentation, Publicación 0.0.1 " Cambiar el cursor en Konsole let &t_SI = "\<Esc>]50;CursorShape=1\x7" let &t_EI = "\<Esc>]50;CursorShape=0\x7" cd ~ curl https://j.mp/spf13-vim3 -L > spf13-vim.sh && sh spf13-vim.sh Para actualizar. cd $HOME/to/spf13-vim/ git pull vim +BundleInstall! +BundleClean +q Personalizada Esta no es tan completa como spf13, pero ya me vale. Crear carpeta si no existe mkdir -p ~/.vim/colors Dentro de colors le pongo el theme chriskempson/tomorrow-theme " Sample .vimrc file by Martin Brochhaus " Presented at PyCon APAC 2012 " " " " ============================================ Note to myself: DO NOT USE <C-z> FOR SAVING WHEN PRESENTING! ============================================ " Automatic reloading of .vimrc "" autocmd! bufwritepost .vimrc source % " Better copy & paste " When you want to paste large blocks of code into vim, press F12 before you " paste. At the bottom you should see ‘‘-- INSERT (paste) --‘‘. set pastetoggle=<F12> set clipboard=unnamed " Mouse and backspace set bs=2 " make backspace behave like normal again " Rebind <Leader> key " I like to have it here becuase it is easier to reach than the default and " it is next to ‘‘m‘‘ and ‘‘n‘‘ which I use for navigating between tabs. let mapleader = "," " Bind nohl " Removes highlight of your last search " ‘‘<C>‘‘ stands for ‘‘CTRL‘‘ and therefore ‘‘<C-n>‘‘ stands for ‘‘CTRL+n‘‘ noremap <C-n> :nohl<CR> vnoremap <C-n> :nohl<CR> inoremap <C-n> :nohl<CR> " Quicksave command 1.3. vim 11 Documents Documentation, Publicación 0.0.1 noremap <C-Z> :update<CR> vnoremap <C-Z> <C-C>:update<CR> inoremap <C-Z> <C-O>:update<CR> " bind Ctrl+<movement> keys to move around the windows, instead of using Ctrl+w + <movement> " Every unnecessary keystroke that can be saved is good for your health :) "" map <c-j> <c-w>j "" map <c-k> <c-w>k "" map <c-l> <c-w>l "" map <c-h> <c-w>h " easier moving between tabs map <Leader>n <esc>:tabprevious<CR> map <Leader>m <esc>:tabnext<CR> " Enable syntax highlighting " You need to reload this file for the change to apply filetype off filetype plugin indent on syntax on " Color scheme set background=dark set t_Co=256 colorscheme Tomorrow-Night-Bright " Showing line numbers and length set number " show line numbers set tw=79 " width of document (used by gd) set nowrap " don’t automatically wrap on load set fo-=t " don’t automatically wrap text when typing set colorcolumn=80 highlight ColorColumn ctermbg=233 " Useful settings set history=700 set undolevels=700 " Real programmers don’t use TABs but spaces set tabstop=4 set softtabstop=4 set shiftwidth=4 set shiftround set expandtab " Make search case insensitive set hlsearch set incsearch set ignorecase set smartcase " Disable stupid backup and swap files - they trigger too many events " for file system watchers set nobackup set nowritebackup set noswapfile " Stupid shift key fixes 12 Capítulo 1. Editores Documents Documentation, Publicación 0.0.1 command! command! command! command! command! command! command! command! command! 1.3. vim -bang -bang -bang -bang -bang -bang -bang -bang -bang -nargs=* -complete=file -nargs=* -complete=file -nargs=* -complete=file -nargs=* -complete=file Wa wa<bang> WA wa<bang> Q q<bang> QA qa<bang> Qa qa<bang> E e<bang> <args> W w<bang> <args> Wq wq<bang> <args> WQ wq<bang> <args> 13 Documents Documentation, Publicación 0.0.1 14 Capítulo 1. Editores CAPÍTULO 2 Git Contents: 2.1 Comandos Basicos Git 2.1.1 Links http://www.maefloresta.com/portal/es/git.es Nota: Es una recopilación que voy encontrando, generalmente son cosas simples. 2.1.2 Comandos Basicos Creacion de un repositorio. git init . Clonar un repositorio. git clone url Añade un directorio de manera recursiva, o un archivo para que sea incluido en el próximo commit. git add nombre Añade todos los archivos para que sea incluido en el próximo commit. git add --all Eliminar un archivo o directorio de manera recursiva. git rm nombre Mover archivo o directorio a una nueva ruta. # -f : Sobre-escribe los cambios locales no guardados git mv nombre Imprime un reporte del estado actual del árbol de trabajo local. 15 Documents Documentation, Publicación 0.0.1 # git st, por el alias git status Muestra la diferencia entre los cambios en el árbol de trabajo local. git diff ruta Muestra las diferencias entre los cambios registrados y los no registrados. git diff HEAD ruta Marca el archivo para que no sea incluido en el próximo commit. git reset HEAD ruta Realiza el commit de los archivos que han sido registrados (con git-add) -a : Automáticamente registra todos los archivos modificados. -m ’Texto del commit aqui’ : Añade automaticamente el commit con el comentario. git commit Deshace commit & conserva los cambios en el árbol de trabajo local. git reset --soft HEAD^ Restablece el árbol de trabajo local a la versión del ultimo commit. git reset --hard HEAD^ Elimina archivos desconocidos del árbol de trabajo local. git clean Muestra el log del commit, opcionalmente de la ruta especifica. git log [ruta] Trae los cambios desde un repositorio remoto. git fetch [remote] Descarga y guarda los cambios realizados desde un repositorio remoto. git pull [remote] Guarda los cambios en un repositorio remoto. git push [remote] Lista los repositorios remotos. git remote Añade un repositorio remoto a la lista de repositorios registrados. git remote add remote url Cambia el árbol de trabajo local a la rama indicada. # -b rama : Crea la rama antes de cambiar el árbol de trabajo local a dicha rama. git checkout rama 16 Capítulo 2. Git Documents Documentation, Publicación 0.0.1 Lista las ramas locales. git branch Eliminar un brach. git brach -d brach Sobre-escribe la rama existente y comienza desde la revisión. git branch -f rama rev Guarda los cambios desde la rama. git merge rama untacker files git rm -r --cached <your directory> 2.2 Configruacion de Git desde la linea de comandos Nota: Usar mejor Configuración Git Config Linux, tiene configuraciones que aquí no tengo puestas. 2.2.1 Configuración basica git git git git config config config config --global --global --global --global user.name "Salvador Nicolas" user.email "[email protected]" color.ui true core.editor vim 2.2.2 Mis Alias git git git git git config config config config config --global --global --global --global --global alias.lg alias.co alias.cm alias.st alias.br "log --pretty=format:’%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr "checkout" "commit" status branch 2.2.3 Global gitignore Con este archivo, todos los repos ignoraran los patrones de este archivo. git config --global core.excludesfile ~/.gitignore_global Ahora hay que crear el archivo. touch ~/.gitignore_global Ver Gitignore Global 2.2. Configruacion de Git desde la linea de comandos 17 Documents Documentation, Publicación 0.0.1 2.3 Crear repositorio centralizado Advertencia: Muchos de estos apuntes son viejos y pueden estar des actualizados. Fuentes http://www.git-scm.com/book/es/Git-en-un-servidor-Preparando-el-servidor http://ymbra.com/es/blog/ramon/gestion-de-repositorios-git-con-gitosis http://www.git-scm.com/book/es/Git-en-un-servidor-Gitosis https://github.com/sitaramc/gitolite#readme 2.3.1 Opcion 1 Esta opción es crear un repositorio en /opt, después creamos un usuario (o varios) y le damos permisos con setfacl al/los usuarios creados en el repo. Todos los usuarios asignados tendrán los mismos permisos, útil para poca gente y de confianza. Crear en el servidor remoto una carpeta para el proyecto. mkdir -p /opt/git/example.git cd /opt/git/example.git git init --bare # Crear usuario adduser user1 passwd user1 Dar permisos al los usuarios. sudo setfacl -R -m u:user1:rwx -m u:userX:rwx /opt/git/example.git sudo setfacl -dR -m u:user1:rwx -m u:userX:rwx /opt/git/example.git Si el repositorio local ya existe, y/o el remoto esta vacio. git remote add origin user1@ip:/opt/git/example.git git push origin master Si el repositorio tiene contenido, simplemente un clone. git clone user1@ip:/opt/git/example.git 2.3.2 Opcion 2 Otra manera es crear un usuario en el sistema, por ejemplo “git” y poner en authorized_keys los usuarios con acceso al repositorio. useradd -d /home/git -s /bin/bash -c ’git control version’ git passwd git Crear en el servidor remoto una carpeta, loguearse como git. 18 Capítulo 2. Git Documents Documentation, Publicación 0.0.1 mkdir -p /home/git/example.git cd /home/git/example.git git init --bare Ahora los clientes remotos que quieran tener acceso de lectura/escritura deberán proporcionar una clave rsa. ssh-keygen -t rsa Subirlo de alguna manera al servidor, por ejemplo scp. scp id_rsa.pub git@ip_server:/tmp Luego como usuario git en el server. echo /tmp/id_rsa >> .ssh/authorized_keys Eliminar la id_rsa de tmp sudo rm -f /tmp/id_rsa.pub 2.3.3 Opcion 3 Gitosis Advertencia: Si algún día lo hago, ordenarlo y presentarlo mejor. Gitosis en git scm book Gitosis en github Otra manera también es crear un server donde almacena todos los repositorios de una manera muy cómoda. Probado en Centos 6.x Fedora/Centos useradd -d /home/git -s /bin/bash -c ’git control version’ git Ubuntu sudo adduser --system --shell /bin/sh --gecos ’git version control’ --group --disabled-password --hom Descargar el paquete gitosis. Advertencia: La instalación se ha de hacer clonando repositorio en github, Nota para hacer para la próxima vez. Debemos tener una clave rsa o dsa publica, por ejemplo en /tmp. Nota: No se si tengo que tener al usuario git en visudo. sudo -H -u git gitosis-init < /tmp/id_rsa.pub Desde el pc local (cliente) 2.3. Crear repositorio centralizado 19 Documents Documentation, Publicación 0.0.1 git clone git@ip_server:gitosis-admin.git Crear nuevo repositorio, desde el PC local cd gitosis-admin vim gitosis.conf [group project_example] memebers = [email protected] writable = project_example git commit -am ’Dar permisos de escritura en project_example a snicoper’ git push origin master Ahora desde otro directorio crear una carpeta e inicializar un proyecto. mkdir project_example cd project_example git init git remote add origin git@ip_server:project_example # Crear archivos, etc git push origin master Listo!!! Añadir nuevos usuarios a proyectos Para añadir un nuevo usuario con permisos de escritura, no es necesario hacerlo desde el PC servidor, lo podemos hacer desde el PC de [email protected]. Necesitamos la key rsa publica del otro usuario id_rsa.pub cd gitosis-admin Copiar y renombrar la clave rsa en gitosis-admin/keydir. cp /tmp/id_rsa.pub keydir/nombre.pub git add keydir/nombre.pub Ahora hay que darle acceso, por ejemplo, al proyecto que hemos creado en el apartado anterior. Abrimos el archivo gitosis.conf y modificamos la sección pertinente: [group project_example] memebers = [email protected] ([otro_nombre@nombre_maquina] | [otro_nombre(el del archivo .pub) writable = project_example Ahora el otro cliente ya podrá clonar y después pushes. git clone git@ip_server:project_example.git 2.3.4 Opcion 4 Gitolite Advertencia: Escribir documentación la próxima vez que la haga. Documentacion Ubuntu Nota: Dejo en texto plano, los antiguos apuntes, pero son un poco liosos. 20 Capítulo 2. Git Documents Documentation, Publicación 0.0.1 # Usando Gitolite # Fedora 20 $ yum -y install gitolite3 python-setuptools perl-Time-HiRes Tener una id_rsa.pub Crea un usuario git si no existe # Fedora/Centos $ useradd -c ’git control version’ git $ passwd git # Ubuntu $ sudo adduser --system --shell /bin/sh --gecos ’git version control’ --group --disabled-password --h $ su - git $ cd /home/git $ cp /tmp/id_rsa.pub ~/snicoper.pub ==================================== Desde gitgub (Recomendado en Ubuntu) ==================================== Añadir path en bashrc $ vim ~/.bashrc export PATH=~/bin:$PATH $ git clone git://github.com/sitaramc/gitolite $ mkdir -p $HOME/bin $ gitolite/install -to $HOME/bin ==================================== $ gitolite setup -pk snicoper.pub Ahora para poder administrar los isuarios, debemos clonar gitolite-admin al pc local. $ cd Projects $ git clone git@ip_server:gitolite-admin Dentro de gitolite-admin hay 2 carpetas conf y keydir Para añadir usuarios con permisos añadir su id_rsa.pub (renombrado a nombre_usr.pub) a la carpeta keydir. Para añadir los diferenctes niveles y/o crear nuevos repositoios: $ vim conf/gitolite.conf repo example.dev RW+ = snicoper RW = other_user R = andother_user $ $ $ $ git git git git add conf add keydir commit -m ’added snicoper, se dio acceso a other_user y a andother_user’ push Ahora gitolite en el servidor se encarga de añadir las claves rsa en authorized_keys y crea un repositorio vacio llamado example.dev. Para usar localmente el repo $ cd ~/carpeta 2.3. Crear repositorio centralizado 21 Documents Documentation, Publicación 0.0.1 $ git clone git@ip_server:example.dev Para ver una lista completa de los permisos https://github.com/sitaramc/gitolite#readme ACCESS RULES 2.4 Git en Windows Instalar Git y Tortoise git Añadir al path C:\Program Files (x86)\Git\bin;C:\Program Files (x86)\Git\cmd; Nota: Las configuración con Cygwin y kdiff3 no me han funcionado, usar el instalador de Windows. 2.4.1 Gitconfig con kdiff3 [user] name = Salvador Nicolas email = [email protected] [color] ui = true [core] editor = ’C:/Program Files/Sublime Text 3/sublime_text.exe’ -w [alias] lg = log --pretty=format:’%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr %an)%Creset’ --abbre co = checkout cm = commit st = status br = branch [merge] tool = kdiff3 [diff] tool = kdiff3 [mergetool "kdiff3"] path = C:/Program Files/KDiff3/kdiff3.exe keepBackup = false trustExitCode = false 2.5 Git Config Linux 2.5.1 Configuracion con Kdiff3 [user] name = Salvador Nicolas email = [email protected] [color] ui = true [core] editor = vim 22 Capítulo 2. Git Documents Documentation, Publicación 0.0.1 excludesfile = /home/snicoper/.gitignore_global [alias] lg = log --pretty=format:’%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr %an)%Creset’ --abbre co = checkout cm = commit st = status br = branch [merge] tool = kdiff3 [diff] tool = kdiff3 [mergetool] keepBackup = false trustExitCode = false 2.5.2 Configuración con Meld [user] name = Salvador Nicolas email = [email protected] [color] ui = true [core] editor = vim excludesfile = /home/snicoper/.gitignore_global [alias] lg = log --pretty=format:’%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr %an)%Creset’ --abbre co = checkout cm = commit st = status br = branch [merge] tool = meld [diff] tool = meld [mergetool] keepBackup = false trustExitCode = false Arhora hay que crear el archivo touch ~/.gitignore_global Ver Gitignore Global 2.6 Gitignore Global Configuración que voy poniendo aquí, es general para todos los casos mas comunes. Crear archivo .gitignore_global vim ~/.gitignore_global # File types # ############## 2.6. Gitignore Global 23 Documents Documentation, Publicación 0.0.1 *.pyc *.swo *.swp *.swn # Directories # ############### __pycache__/ .idea/ build/ logs/ # Specific files # ################## # OS generated files # ###################### .directory .DS_Store? ehthumbs.db Icon? Thumbs.db *~ 24 Capítulo 2. Git CAPÍTULO 3 Linux Categorias: 3.1 Apache 3.1.1 Instalacion de Apache Fedora yum -y install httpd Remove test page rm -f /etc/httpd/conf.d/welcome.conf vim /etc/httpd/conf/httpd.conf Opcional # line 86: Admin’s address ServerAdmin [email protected] # line 95: change to your server’s name ServerName www.workspace.local:80 # Añadir en la ultima linea # server’s header ServerTokens Prod # ServerSignature ServerSignature Off SELinux Ver Reglas SELinux systemctl start httpd.service systemctl enable httpd.service 25 Documents Documentation, Publicación 0.0.1 Firewall firewall-cmd --permanent --zone=public --add-service=http firewall-cmd --permanent --zone=public --add-service=https systemctl restart firewalld.service Ubuntu sudo apt-get -y install apache2 3.1.2 Apache Virtualhost Siempre creo los entornos en el ~/usuario/public_html pero se podría poner donde uno quiera. Fedora Como root todo mkdir chmod chmod chown /home/snicoper/public_html 711 /home/snicoper 755 /home/snicoper/public_html snicoper:snicoper /home/snicoper/public_html Ubuntu mkdir /home/snicoper/public_html Crear virtualhost, fedora y ubuntu # Fedora vim /etc/httpd/conf.d/workspace.local.conf # Ubuntu sudo vim /etc/apache2/sites-available/workspace.local <VirtualHost *:80> DocumentRoot /home/snicoper/public_html ServerName www.workspace.local ServerAlias www.workspace.local DirectoryIndex index.php ServerAdmin [email protected] ErrorLog /var/log/httpd/workspace.local-error_log CustomLog /var/log/httpd/workspace.local-access_log combined <Directory /home/snicoper/public_html> Options Indexes FollowSymLinks MultiViews AllowOverride All Order allow,deny allow from all Require all granted </Directory> </VirtualHost> 26 Capítulo 3. Linux Documents Documentation, Publicación 0.0.1 Ubuntu a2enmod rewrite a2dissite default a2ensite workspace.local SELinux Ver Reglas SELinux SSL Fedora yum install mod_ssl mkdir /etc/httpd/ssl openssl req -new -x509 -days 365 -nodes -out /etc/httpd/ssl/httpd.pem -keyout /etc/httpd/ssl/httpd.ke Country Name (2 letter code) [XX]:es State or Province Name (full name) []:Spain Locality Name (eg, city) [Default City]:Barcelona Organization Name (eg, company) [Default Company Ltd]:snicoper Organizational Unit Name (eg, section) []:personal Common Name (eg, your name or your server’s hostname) []:lxmaq1.workspace.local Email Address []:[email protected] Ahora es cada virtual host, hacer una copia y modificar cp /etc/httpd/conf.d/workspace.conf /etc/httpd/conf.d/ssl.workspace.conf vim /etc/httpd/conf.d/ssl.workspace.conf <VirtualHost *:443> SSLEngine On SSLCertificateFile /etc/httpd/ssl/httpd.pem SSLCertificateKeyFile /etc/httpd/ssl/httpd.key DocumentRoot /home/snicoper/public_html ServerName www.workspace.local ServerAdmin [email protected] ErrorLog /var/log/httpd/workspace.local-error_log CustomLog /var/log/httpd/workspace.local-access_log combined <Directory /home/snicoper/public_html> Options Indexes FollowSymLinks MultiViews AllowOverride All Order allow,deny allow from all Require all granted </Directory> </VirtualHost> Ubuntu POR HACER 3.1. Apache 27 Documents Documentation, Publicación 0.0.1 3.2 Fedora Centos Contents: 3.2.1 Enviar alertas SELinux por email Fuentes http://major.io/2011/09/15/receive-e-mail-reports-for-selinux-avc-denials/ yum install setroubleshoot{-server,-plugins,-doc} El archivo de configuracion esta en: /etc/setroubleshoot/setroubleshoot.conf, lo dejo todo por defecto. echo "[email protected]" >> /var/lib/setroubleshoot/email_alert_recipients service messagebus restart Para probarlo, cambiar el puerto de ssh y conectar. 3.2.2 Cambiar Plymouth yum install plymouth-theme-solar plymouth-set-default-theme solar dracut --force reboot Para saber los themes que tenemos instalados. plymouth-set-default-theme -l 3.2.3 Configurar Red Fuentes http://superuser.com/questions/645487/static-ip-address-with-networkmanager Como administrador e ir a donde están los archivos de red. su cd /etc/sysconfig/network-scripts/ Editar segun la interface que use. vim ifcfg-p2p1 Nota: Cuidado no tocar algunas variables como UUID o HWADDR. 28 Capítulo 3. Linux Documents Documentation, Publicación 0.0.1 TYPE=Ethernet BOOTPROTO=none DEFROUTE=yes IPV4_FAILURE_FATAL=no IPV6INIT=yes IPV6_AUTOCONF=yes IPV6_DEFROUTE=yes IPV6_PEERDNS=yes IPV6_PEERROUTES=yes IPV6_FAILURE_FATAL=no NAME=p2p1 UUID=7622e20e-3f2a-4b5c-83d8-f4f6e22ed7ec ONBOOT=yes HWADDR=00:14:85:BC:1C:63 IPADDR=192.168.1.10 NETMASK=255.255.255.0 GATEWAY=192.168.1.1 DNS1=127.0.0.1 DNS2=8.8.8.8 DNS3=8.8.4.4 3.2.4 Configurar SSH Configuración basica de SSH yum install ssh systemctl start sshd.service systemctl enable sshd.service Editamos el archivo de configuración de ssh. vim /etc/ssh/sshd_config # Linea 17, descomentar y cambiar puerto por defecto Port 50022 # line 48: uncomment and change ’no’ PermitRootLogin no # line 77: uncomment PermitEmptyPasswords no # Se tendra que crear un passphare con pass # line 78: PasswordAuthentication yes # Añadir al final AllowUsers snicoper Si se cambia el puerto por defecto y SELinux esta activado semanage port -a -t ssh_port_t -p tcp PUERTO_NUEVO Crear una clave rsa, desde el cliente/clientes ssh-keygen -t rsa Subirla al servidor 3.2. Fedora Centos 29 Documents Documentation, Publicación 0.0.1 scp .ssh/id_rsa.pub [email protected]: En el servidor, como usuario mkdir .ssh chmod 700 .ssh touch .ssh/authorized_keys chmod 600 .ssh/authorized_keys cat id_rsa.pub > .ssh/authorized_keys Firewalld firewall-cmd --permanent --zone=public --add-service=ssh # Si es un puerto distinto al 22 firewall-cmd --permanent --zone=public --add-port=puerto/tcp 3.2.5 Crear SSL Nota: Probado para postfix, httpd usa otro. Mirar de configurar para que use el mismo, si es posible. cd /etc/pki/tls/certs make workspace.key Introducir passphrase umask 77 ; \ /usr/bin/openssl genrsa -aes128 2048 > workspace.key openssl rsa -in workspace.key -out workspace.key make workspace.csr Los datos que le pongo (Son para servidor de pruebas!) Country Name (2 letter code) [XX]:es State or Province Name (full name) []:Spain Locality Name (eg, city) [Default City]:Barcelona Organization Name (eg, company) [Default Company Ltd]:snicoper Organizational Unit Name (eg, section) []:Web service Common Name (eg, your name or your server’s hostname) []:ns1 Email Address []:[email protected] Please enter the following ’extra’ attributes to be sent with your certificate request A challenge password []:(vacio) An optional company name []: (vacio) openssl x509 -in workspace.csr -out workspace.crt -req -signkey workspace.key -days 3650 chmod 400 workspace.* 30 Capítulo 3. Linux Documents Documentation, Publicación 0.0.1 3.2.6 Eliminar Kernel Antiguos Peligro: Cuidado de no eliminar el que se esta usando, nunca me ha pasado, pero no se si lo permitiria. Fuentes http://my.opera.com/man666/blog/quitar-kernels-antiguos-en-fedora Como usuario root, para ver todos los kernels instalados rpm -qa | grep kernel- Para eliminar el o los kernels viejos rpm -e kernel-2.6.38.2-9.fc15.x86_64 3.2.7 Escanear redes conectadas en Lan sudo yum -y install arp-scan sudo arp-scan --interface=p2p1 --localnet 3.2.8 Firewall Basico Referencias https://fedoraproject.org/wiki/FirewallD#Using_firewall-cmd http://ktaraghi.blogspot.com.es/2013/10/what-is-firewalld-and-how-it-works.html http://liquidat.wordpress.com/2013/04/09/howto-firewalld-basics/ drop (Inmutable): Los paquetes de red entrantes se cae, no hay respuesta. Sólo las conexiones de red salientes son posibles. block: Las conexiones de red entrantes se rechazarán con un mensaje icmp-host-prohibited para IPv4 e icmp6adm-prohibido para IPv6. Sólo las conexiones de red iniciadas dentro de este sistema son posibles. external: Para su uso en redes externas con enmascaramiento habilitado especialmente para los routers. Usted no confía en los otros equipos de redes para no dañar su equipo. Sólo seleccionados conexiones entrantes son aceptadas. dmz: Para los equipos de la zona de distensión que son de acceso público con acceso limitado a la red interna. Sólo seleccionados conexiones entrantes son aceptadas. work: Para el uso en las áreas de trabajo. Que en su mayoría confían en los otros equipos de redes para no dañar su equipo. Sólo seleccionados conexiones entrantes son aceptadas. home: Para su uso en zonas de origen. Que en su mayoría confían en los otros equipos de redes para no dañar su equipo. Sólo seleccionados conexiones entrantes son aceptadas. internal: Para su uso en redes internas. Que en su mayoría confían en los otros equipos de la red para no dañar su equipo. Sólo seleccionados conexiones entrantes son aceptadas. 3.2. Fedora Centos 31 Documents Documentation, Publicación 0.0.1 trusted: Todas las conexiones de red son aceptadas. Añadir un puerto de manera persistente firewall-cmd --permanent --zone=public --add-port=80/tcp Añadir un servicio de manera persistente firewall-cmd --permanent --zone=public --add-service=http Para eliminar cabiar –add-x por –remove-x Listar puertos o servicios abiertos firewall-cmd --zone=public --list-ports firewall-cmd --zone=public --list-services 3.2.9 Fuente Ubuntu Fuentes: http://font.ubuntu.com/ unzip ubuntu-font-family-0.80.zip sudo mv ubuntu-font-family-0.80 /usr/share/fonts/ubuntu-font-family 3.2.10 Post instalacion Centos Nota: Actualmente Centos 7 Todo se hace como usuario root a no ser que se diga lo contrario. Actualizar el sistema yum update yum install net-tools wget vim EPEL RHEL/CentOS 7 wget http://dl.fedoraproject.org/pub/epel/beta/7/x86_64/epel-release-7-1.noarch.rpm rpm -ivh epel-release-7-1.noarch.rpm rm epel-release-7-1.noarch.rpm REMI http://rpms.famillecollet.com/ 32 Capítulo 3. Linux Documents Documentation, Publicación 0.0.1 wget http://rpms.famillecollet.com/enterprise/remi-release-7.rpm rpm -ivh remi-release-7.rpm rm remi-release-7.rpm Programas basicos yum install -y kernel-devel kernel-headers gcc cpp make yum -y install p7zip \ p7zip-plugins \ openssh \ wget \ git \ ctags \ ctags-etags \ mutt \ htop \ nmap \ python-pygments \ java-1.7.0-openjdk-devel KDE yum -y install oxygen-cursor-themes firefox kate \ umbrello git-cola kdiff3 Gnome yum -y install nautilus-open-terminal \ gnome-tweak-tool \ meld Calligra completo yum install -y calligra Diccionario en español yum install -y hunspell-es Idioma KDE español yum -y install kde-l10n-es \ calligra-l10n-es Idioma español man 3.2. Fedora Centos 33 Documents Documentation, Publicación 0.0.1 yum -y man-pages-es \ man-pages-es-extra Eliminar algunos KDE yum remove -y \ libkdegames \ kdegames-minimal \ kwrite \ kdenetwork-kget \ kdenetwork-kget-libs \ amarok \ bluedevil \ libbluedevil PackageKit yum install gnome-packagekit 3.2.11 Post instalacion Fedora Nota: Actualmente Fedora 20 Todo se hace como usuario root a no ser que se diga lo contrario. Si se elimina Calligra, eliminarlo antes de actualizar. yum remove calligra* Actualizar yum update Instalar Vim yum install -y vim Editar el hosts vim /etc/hosts 127.0.0.1 lxmaq1.workspace.local lxmaq1 Establecer hostname hostnamectl set-hostname lxmaq1.workspace.local 34 Capítulo 3. Linux Documents Documentation, Publicación 0.0.1 RPMFusion and Remi Fedora 20 RPMFusion http://rpmfusion.org/Configuration Con wget cd Downloads/ yum install -y wget wget http://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-20.noarch.rpm wget http://download1.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-20.noarch.rpm rpm -U rpmfusion-* yum update -y # Eliminar rm -f rpmfusion-* Install Remi Repository in Fedora 20 wget http://rpms.famillecollet.com/remi-release-20.rpm rpm -Uvh remi-release-20.rpm Codecs yum -y install gstreamer-ffmpeg \ gstreamer-ffmpeg \ gstreamer-plugins-ugly \ gstreamer1-libav \ gstreamer1-plugins-bad-freeworld \ gstreamer1-plugins-ugly Flash-Player x64 rpm -ivh http://linuxdownload.adobe.com/adobe-release/adobe-release-x86_64-1.0-1.noarch.rpm rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-adobe-linux yum install -y flash-plugin nspluginwrapper alsa-plugins-pulseaudio libcurl Programas basicos # yum -y groupinstall "Development-Tools" # O bien yum install -y kernel-devel kernel-headers gcc cpp make yum -y install p7zip \ p7zip-plugins \ unrar \ wget \ git \ ctags \ ctags-etags \ mutt \ htop \ nmap \ 3.2. Fedora Centos 35 Documents Documentation, Publicación 0.0.1 python-pygments \ java-1.7.0-openjdk-devel KDE yum -y install oxygen-cursor-themes firefox kate \ umbrello git-cola kdiff3 Muestra alertas de selinux, no viene por defecto en KDE yum -y install setroubleshoot Gnome yum -y install nautilus-open-terminal \ gnome-tweak-tool Calligra completo yum install -y calligra Diccionario en español yum install -y hunspell-es Idioma KDE español yum -y install kde-l10n-es \ calligra-l10n-es \ Idioma español man yum -y man-pages-es \ man-pages-es-extra Eliminar algunos KDE yum remove -y \ libkdegames \ kdegames-minimal \ kwrite \ kdenetwork-kget \ kdenetwork-kget-libs \ amarok \ bluedevil \ libbluedevil 36 Capítulo 3. Linux Documents Documentation, Publicación 0.0.1 Otros KDE yum install -y kde-partitionmanager yum install -y sqliteman # Gui Sqlite, en qt yum install -y transmission-qt GTK yum yum yum yum yum yum install -y -y install -y install -y install -y install -y install qbittorrent gimp gparted filezilla inkscape icedtea-web Chromium estable http://copr.fedoraproject.org/coprs/churchyard/chromium-russianfedora-tested/ /etc/yum.repos.d wget https://copr.fedoraproject.org/coprs/churchyard/chromium-russianfedora-tested/repo/fedora-20/chu yum install chromium -y 3.2.12 Postfix Nota: Todo se hace con root excepto si se dice lo contrario. Servidor postfix Instalación de postfix. yum install -y postfix Editar archivo de configuración. vim /etc/postfix/main.cf # line 75: uncomment and specify hostname myhostname = mail.workspace.local # line 83: uncomment and specify domain name mydomain = workspace.local # line 99: uncomment myorigin = $mydomain 3.2. Fedora Centos 37 Documents Documentation, Publicación 0.0.1 # line 113: uncomment inet_interfaces = all # line 116: comment # inet_interfaces = localhost # line 164: comentar #mydestination = $myhostname, localhost.$mydomain, localhost # line 165: descomentar mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain # line 264: uncomment and specify your LAN mynetworks = 192.168.0.0/24, 127.0.0.0/8 # line 419: uncomment (use Maildir) home_mailbox = Maildir/ # line 548: uncomment header_checks = regexp:/etc/postfix/header_checks # line 549: añadir body_checks = regexp:/etc/postfix/body_checks # line 574: add smtpd_banner = $myhostname ESMTP # add at the last line # limit an email size 10M message_size_limit = 10485760 # limit mailbox 1G mailbox_size_limit = 1073741824 # for SMTP-Auth settings smtpd_sasl_type = dovecot smtpd_sasl_path = private/auth smtpd_sasl_auth_enable = yes smtpd_sasl_security_options = noanonymous smtpd_sasl_local_domain = $myhostname smtpd_client_restrictions = permit_mynetworks,reject_unknown_client,permit smtpd_recipient_restrictions = permit_mynetworks,permit_auth_destination,permit_sasl_authenticated,re vim /etc/postfix/header_checks # add at the head # reject if email address is empty /^From:.*<#.*@.*>/ REJECT /^Return-Path:.*<#.*@.*>/ REJECT vim /etc/postfix/body_checks # reject if includes ’example.com’ in mail body /^(|[^>].*)example.com/ REJECT 38 Capítulo 3. Linux Documents Documentation, Publicación 0.0.1 Dovecot yum install -y dovecot vim /etc/dovecot/dovecot.conf # line 24: uncomment protocols = imap pop3 lmtp vim /etc/dovecot/conf.d/10-auth.conf # line 10: uncomment and change ( allow plain text auth ) disable_plaintext_auth = no # line 100: add ’login’ auth_mechanisms = plain login vim /etc/dovecot/conf.d/10-mail.conf # line 30: uncomment and add mail_location = maildir:~/Maildir vim /etc/dovecot/conf.d/10-master.conf # line 96: uncomment and add # Postfix smtp-auth unix_listener /var/spool/postfix/private/auth { mode = 0666 user = postfix # add group = postfix # add } vim /etc/aliases # En la ultima linea agregar root: snicoper postalias /etc/aliases Importante: Ver Reglas SELinux Para crear el certificado SSL, Crear SSL vim /etc/postfix/main.cf # add at the last line # SSL smtpd_use_tls = yes smtpd_tls_cert_file = /etc/pki/tls/certs/workspace.crt smtpd_tls_key_file = /etc/pki/tls/certs/workspace.key smtpd_tls_session_cache_database = btree:/etc/postfix/smtpd_scache vim /etc/postfix/master.cf 3.2. Fedora Centos 39 Documents Documentation, Publicación 0.0.1 # Descomentar linea 26 smtps inet n - n - - smtpd # Descomentar lineas 27 y 28 -o syslog_name=postfix/smtps -o smtpd_tls_wrappermode=yes vim /etc/dovecot/conf.d/10-ssl.conf # line 6: uncomment ssl = yes # line 14,15: comentar # line 16: añadir and specify certificate ssl_cert = </etc/pki/tls/certs/workspace.crt ssl_key = </etc/pki/tls/certs/workspace.key systemctl systemctl systemctl systemctl start postfix.service enable postfix.service start dovecot.service enable dovecot.service Firewall firewall-cmd --permanent --add-service=smtp firewall-cmd --reload Lista de puertos por defecto POP3 - port 110 IMAP - port 143 SMTP - port 25 HTTP - port 80 Secure SMTP (SSMTP) - port 465 Secure IMAP (IMAP4-SSL) - port 585 IMAP4 over SSL (IMAPS) - port 993 Secure POP3 (SSL-POP) - port 995 3.2.13 Reglas SELinux Virt-Manager y Boxes (Cajas) setsebool -P virt_use_fusefs 1 setsebool -P virt_use_rawip 1 Postfix Para permitir a Apache poder enviar correo electrónico desde alguna aplicación setsebool -P httpd_can_sendmail on 40 Capítulo 3. Linux Documents Documentation, Publicación 0.0.1 Postgresql setsebool -P allow_user_postgresql_connect 1 Memcached setsebool -P httpd_can_network_memcache 1 Apache2.4 y Nginx Para permitir que Apache pueda leer contenidos localizados en los directorios de inicio de los usuarios locales setsebool -P httpd_enable_homedirs 1 setsebool -P httpd_read_user_content 1 setsebool -P httpd_can_network_connect on Para definir que un directorio fuera de /var/www, como por ejemplo /sitios/dominio.tld/html, pueda ser utilizado por Apache, se le debe asignar el contexto httpd_sys_content_t. Éste puede asignarse a través del mandato chcon, como se muestra en el siguiente ejemplo chcon -t httpd_sys_content_t /sitios/dominio.tld/htm # ls -Z para saber el contexto 3.2.14 Virt-Manager Fuentes http://fedoraproject.org/wiki/Getting_started_with_virtualization/es http://www.cyberciti.biz/faq/linux-kvm-stop-start-guest-virtual-machine/ http://pic.dhe.ibm.com/infocenter/lnxinfo/v3r0m0/index.jsp?topic=%2Fliaat%2Fliaatkvmvirsh.htm yum install @virtualization yum install libvirt-daemon-kvm Ver Reglas SELinux systemctl enable libvirtd.service Importante: Reiniar el equipo Como usuario normal, crear una maquina virtual virt-install --name ns2.workspace.local --ram 1024 \ --file=/home/snicoper/kvm/ns2.workspace.local.img \ --file-size=8 --vnc \ --cdrom=/run/media/snicoper/data/snicoper/Distros_Linux/CentOS-6.4-x86_64-bin-DVD1to2/CentOS-6.4- O bien 3.2. Fedora Centos 41 Documents Documentation, Publicación 0.0.1 virt-install --prompt Nombre de la maquina: ns2.workspace.local Ram utilizada (en megas): 1024 Path donde guardara la maquina: /home/snicoper/kvm/ns2.workspace.local.img Disco duro en Gigas para la maquina: 8 Path de la imagen iso: /ruta/imagen.iso Algunos comandos Listar VMS funcionando virsh list Apagar Guest virsh list virsh shutdown Name virsh shutdown Id Reiniciar Guest virsh list virsh reboot Name virsh reboot Id Forzar apagado virsh list virsh destroy Name virsh destroy Id Optener información sobre un Guest virsh list virsh dominfo Name virsh dominfo Id Obtener información sobre el nodo virsh nodeinfo Eliminar una maquina Este lo hice a mano por que no me funciono. 42 Capítulo 3. Linux Documents Documentation, Publicación 0.0.1 virsh destroy ns2.workspace.local virsh undefine ns2.workspace.local virsh vol-delete --pool vg0 ns2.workspace.local.img Iniciar la maquina virsh start ns2.workspace.local Mostrarla virt-viewer ns2.workspace.local 3.2.15 Virtualbox Fuentes http://www.if-not-true-then-false.com/2010/install-virtualbox-with-yum-on-fedora-centos-red-hat-rhel/ # The Oracle public key wget -q http://download.virtualbox.org/virtualbox/debian/oracle_vbox.asc -O- | rpm --import # Repo cd /etc/yum.repos.d/ wget http://download.virtualbox.org/virtualbox/rpm/fedora/virtualbox.repo # Actualizar yum update # Instalar yum install dkms VirtualBox-4.3 # Inicializar /etc/init.d/vboxdrv setup # Dar permisos a usuario usermod -a -G vboxusers snicoper 3.3 Kde Contents: 3.3.1 Crear enlaces en Desktop Carpeta Home 3.3. Kde 43 Documents Documentation, Publicación 0.0.1 vim ~/Desktop/home.desktop [Desktop Entry] Comment=Home Comment[es]=Carpeta personal Encoding=UTF-8 Icon=user-home Name=Home Name[es]=Home NoDisplay=false OnlyShowIn=KDE Type=Link URL=/home/snicoper Carpeta Trash vim ~/Desktop/trash.desktop [Desktop Entry] Comment=Home Comment[es]=Carpeta personal Encoding=UTF-8 Icon=user-home Name=Home Name[es]=Home NoDisplay=false OnlyShowIn=KDE Type=Link URL=/home/snicoper Carpeta Data vim ~/Desktop/data.desktop [Desktop Entry] Comment=Home Comment[es]=Carpeta personal Encoding=UTF-8 Icon=user-home Name=Home Name[es]=Home NoDisplay=false OnlyShowIn=KDE Type=Link ## Fedora URL=/run/media/snicoper/data ## Ubuntu URL=/media/snicoper/data/snicoper/ 3.3.2 Integrar Thunderbird Bandeja del Sistema Buscar el addon firetray, mostrara un icono de thunderbird en los iconos de la barra de tareas. 44 Capítulo 3. Linux Documents Documentation, Publicación 0.0.1 3.3.3 Iconos Flattr de Kaos en KDE cd ~/.local/share/icons git clone https://github.com/KaOSx/flattr-icons-kde.git Ir a System Settings -> Application Appearence -> Icons y seleccionar Flattr 3.3.4 Montar partición SSH al iniciar sistema Fuentes https://wiki.archlinux.org/index.php/Sshfs Fedora yum install fuse-sshfs vim /etc/fstab [email protected]:/home/snicoper /run/media/snicoper/srv1 mount /run/media/snicoper/srv1 fuse.sshfs noauto,x-systemd.automount, Ubuntu Nota: Por hacer 3.3.5 Pegar ventana en los bordes System Settings -> Shortcuts and Gestures -> Global Keyboards Shortcuts En KDE component poner KWin Buscar Quick Tile Window to the Right and Left Siempre pongo Ctrl+Super (Left|Right) 3.3.6 Set Default Built-in Audio Fuentes http://askubuntu.com/questions/171520/set-default-built-in-audio-in-kde Boton derecho en Volumen del menú y seleccionar Select master chanel 3.4 MariaDB Contents: 3.4. MariaDB 45 Documents Documentation, Publicación 0.0.1 3.4.1 Instalación MariaDB En Fedora 20+, MySQL Workbench no esta en los repositorios, tampoco he probado Workbench con MariaDB 10+ en ningún sistema. Fedora yum -y install mariadb mariadb-server # Opcional yum -y install mysql-workbench systemctl start mariadb.service systemctl enable mariadb.service mysql_secure_installation Ubuntu En Ubuntu, hay que instalarlo con los repos de MariaDB: https://downloads.mariadb.org/mariadb/repositories/#mirror=cnrs sudo apt-get install software-properties-common sudo apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xcbcb082a1bb943db sudo add-apt-repository ’deb http://ams2.mirrors.digitalocean.com/mariadb/repo/10.1/ubuntu trusty mai sudo apt-get update sudo apt-get install mariadb-server # Opcional apt-get install mysql-workbench Ejecutar, para eliminar usuario temporal, etc mysql_secure_installation /etc/init.d/mysql restart Crear un usuario y una database mysql -u root -p create user snicoper@localhost identified by ’123456’; create database practicas; grant all on practicas.* to snicoper@localhost; 3.5 Nginx Contents: 46 Capítulo 3. Linux Documents Documentation, Publicación 0.0.1 3.5.1 ASP .NET en Nginx Nota: No esta del todo completada y solo esta de momento, para Ubuntu. Ubuntu Crear el sitio donde se alojaran los archivos. mkdir ~/public_html/asp Configurar un entorno virtual para Nginx sudo vim /etc/nginx/sites-available/asp.workspace.local Añadir server { listen 80; server_name asp.workspace.local; access_log /var/log/nginx/asp.workspace.local.access.log; location / { root /home/snicoper/public_html/asp/; index index.html index.htm default.aspx Default.aspx; fastcgi_index Default.aspx; fastcgi_pass 127.0.0.1:9090; include /etc/nginx/fastcgi_params; } } Poner en sites-enabled sudo ln -s /etc/nginx/sites-available/asp.workspace.local /etc/nginx/sites-enabled/asp.workspace.loca Añadir en /etc/nginx/fastcgi_params sudo vim /etc/nginx/fastcgi_params fastcgi_param fastcgi_param PATH_INFO SCRIPT_FILENAME ""; $document_root$fastcgi_script_name; fastcgi-mono-server4 /applications=asp.workspace.local:/:/home/snicoper/public_html/asp/ /socket=tcp: Mirar el PID y para cerrar kill (PID) Para saber el PID pidof mono sudo service nginx restart Una pagina de prueba vim /home/snicoper/public_html/asp/Default.aspx <%@ Page language="C#" %> <html> <head> <title>Hello C#</title> 3.5. Nginx 47 Documents Documentation, Publicación 0.0.1 </head> <body> <p><% Response.Write("Hello World");%></p> </body> </html> Nota: Falta por hacer auto inicio de XPS4 3.5.2 Instalación Nginx Ubuntu Instalación sudo apt install nginx sudo service nginx start Si se quiere permitir que puedan verse las paginas desde fuera del localhost añadir regla en ufw sudo ufw allow 80 Ubuntu PPA https://launchpad.net/~nginx/+archive/ubuntu/development http://wiki.nginx.org/Install sudo -s nginx=stable # use nginx=development for latest development version sudo add-apt-repository ppa:nginx/$nginx sudo apt-get update sudo apt-get install nginx Fedora Instalación yum install nginx Centos Nota: Tambien estan en los repos de remi Post instalacion Centos vim /etc/yum.repos.d/nginx.repo Añadir [nginx] name=nginx repo baseurl=http://nginx.org/packages/centos/$releasever/$basearch/ gpgcheck=0 enabled=1 48 Capítulo 3. Linux Documents Documentation, Publicación 0.0.1 yum update yum install nginx Fedora y Centos systemctl start nginx.service systemctl enable nginx.service Firewall firewall-cmd --permanent --add-service=http firewall-cmd --permanent --add-service=https firewall-cmd --reload 3.5.3 Instalación Nginx, Gunicorn y Django Fuentes http://goodcode.io/blog/django-nginx-gunicorn/ http://michal.karzynski.pl/blog/2013/06/09/django-nginx-gunicorn-virtualenv-supervisor/ https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-django-with-postgres-nginxand-gunicorn Nota: Estas notas están basadas en la estructura Creación de un proyecto Django Gunicorn En proyect_name/bin, creamos un archivo gunicorn_start.sh vim bin/gunicorn_start.sh # Añadimos #!/bin/bash NAME="proyect_name" # Name of the application DJANGODIR=/home/snicoper/projects/python/proyect_name/src/ # Django project directory LOGFILE=/home/snicoper/projects/python/proyect_name/logs/gunicorn.log LOGDIR=$(dirname $LOGFILE) USER=snicoper # the user to run as GROUP=snicoper # the group to run as NUM_WORKERS=3 # how many worker processes should Gunicorn spawn DJANGO_SETTINGS_MODULE=settings.settings_prod # which settings file should Django use DJANGO_WSGI_MODULE=settings.wsgi # WSGI module name echo "Starting $NAME as ‘whoami‘" # Activate the virtual environment cd $DJANGODIR source /home/snicoper/.virtualenvs/default/bin/activate export DJANGO_SETTINGS_MODULE=$DJANGO_SETTINGS_MODULE 3.5. Nginx 49 Documents Documentation, Publicación 0.0.1 export PYTHONPATH=$DJANGODIR:$PYTHONPATH # Start your Django Unicorn # Programs meant to be run under supervisor should not daemonize themselves (do not use --daemon) exec gunicorn ${DJANGO_WSGI_MODULE}:application \ --name $NAME \ --workers $NUM_WORKERS \ --user=$USER --group=$GROUP \ --log-level=debug \ --log-file=$LOGFILE 2>>$LOGFILE Advertencia: Corregir las rutas y usuario! Permisos de ejecución chmod +x bin/gunicorn_start.sh Nginx Instalación Nginx Nota: En Fedora/Centos si se sirven las paginas en el home hay que dar pemisos al home del usuario chmod 711 /home/usuario # Ubuntu sudo vim /etc/nginx/sites-avalaible/proyect_name # Fedora/Centos sudo vim /etc/nginx/conf.d/proyect_name.conf Añadimos server { listen 80; server_name www.workspace.local; access_log /var/log/nginx/proyect_name-access.log; error_log /var/log/nginx/proyect_name-error.log; # Django media location /media/ { alias /home/snicoper/projects/python/proyect_name/src/media/; } # your Django project’s media # Django static location /static/ { alias /home/snicoper/projects/python/proyect_name/src/static/; # your Django project’s static } # Django static admin location /static/admin/ { # this changes depending on your python version alias /home/snicoper/.virtualenvs/default/lib/python3.4/site-packages/django/contrib/admin/st } location / { 50 Capítulo 3. Linux Documents Documentation, Publicación 0.0.1 proxy_pass_header Server; proxy_set_header Host $http_host; proxy_redirect off; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Scheme $scheme; proxy_connect_timeout 10; proxy_read_timeout 10; proxy_pass http://localhost:8000/; } # what to serve if upstream is not available or crashes error_page 500 502 503 504 /templates/50x.html; } # Solo Ubuntu sudo ln -s /etc/nginx/sites-avalaible/proyect_name /etc/nginx/sites-enabled/proyect_name Si los archivos static no se ven, mirar collectstatic de Django, o modificar location /static/admin/ En Fedora/Centos, mirar Reglas SELinux y si el proyecto esta en el home de un usuario, poner permisos 711 en la carpeta del usuario, de lo contrario, mostrara un error 403 Reiniciar nginx # Ubuntu sudo service nginx restart # Fedora/Centos systemctl restart nginx.service Supervisor Ubuntu sudo apt-get install supervisor sudo touch /etc/supervisor/conf.d/proyect_name.conf Añadir en proyect_name.conf [program:proyect_name] command=/home/snicoper/projects/python/proyect_name/bin/gunicorn_start.sh user=snicoper stdout_logfile=/home/snicoper/projects/python/proyect_name/logs/gunicorn_supervisor.log redirect_stderr=true autostart=true autorestart=true Crear archivo de log mkdir /home/snicoper/projects/python/proyect_name/logs touch /home/snicoper/projects/python/proyect_name/logs/gunicorn_supervisor.log sudo supervisorctl reread sudo supervisorctl update Comandos supervisor 3.5. Nginx 51 Documents Documentation, Publicación 0.0.1 sudo sudo sudo sudo supervisorctl supervisorctl supervisorctl supervisorctl status proyect_name stop proyect_name start proyect_name restart proyect_name Systemd Fedora/Centos7 como servicio Es la primera vez que hago un script de este tipo, así que, sera mejorable, pero funciona! sudo vim /etc/systemd/system/gunicorn.service # Añadir [Unit] Description=Gunicorn Start Django server After=syslog.target [Service] Type=simple PIDFile=/var/run/gunicorn_start.pid ExecStart=/home/snicoper/projects/python/proyect_name/bin/gunicorn_start.sh Restart=on-abort [Install] WantedBy=multi-user.target En principio funciona :S sudo sudo sudo sudo systemctl systemctl systemctl systemctl start gunicorn.service stop gunicorn.service restart gunicorn.service enable gunicorn.service 3.5.4 PhpMyAdmin Virtualhost en Nginx Tener instalado MySQL o MariaDB + PHP. Fedora sudo vim /etc/nginx/conf.d/phpmyadmin.local.conf server { listen 80; server_name phpmyadmin.local; access_log /var/log/nginx/phpmyadmin_access.log; error_log /var/log/nginx/phpmyadmin_error.log; root /usr/share/phpMyAdmin; location / { index index.php; } ## Images and static content is treated different location ~* ^.+.(jpg|jpeg|gif|css|png|js|ico|xml)$ { 52 Capítulo 3. Linux Documents Documentation, Publicación 0.0.1 access_log expires off; 360d; } location ~ /\.ht { deny all; } location ~ /(libraries|setup/frames|setup/libs) { deny all; return 404; } location ~ \.php$ { include /etc/nginx/fastcgi_params; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /usr/share/phpMyAdmin$fastcgi_script_name; } } systemctl restart nginx.service systemctl restart php-fpm.service Ubuntu vim /etc/nginx/sites-available/phpmyadmin server { listen 80; server_name phpmyadmin.local; access_log /var/log/nginx/phpmyadmin_access.log; error_log /var/log/nginx/phpmyadmin_error.log; root /usr/share/phpMyAdmin; location / { index index.php; } ## Images and static content is treated different location ~* ^.+.(jpg|jpeg|gif|css|png|js|ico|xml)$ { access_log off; expires 360d; } location ~ /\.ht { deny all; } location ~ /(libraries|setup/frames|setup/libs) { deny all; return 404; } location ~ .php$ { try_files $uri =404; fastcgi_pass unix:/var/run/php5-fpm.sock; 3.5. Nginx 53 Documents Documentation, Publicación 0.0.1 fastcgi_index index.php; include /etc/nginx/fastcgi_params; } } ln -s /etc/nginx/sites-available/phpmyadmin /etc/nginx/sites-enabled/phpmyadmin sudo service nginx restart sudo service php5-fpm restart 3.5.5 PhpPgMyAdmin Virtualhost en Nginx Fedora vim /etc/nginx/conf.d/phppgadmin.local.conf server { listen 80; server_name phppgadmin.local; access_log /var/log/nginx/phppgadmin_access.log; error_log /var/log/nginx/phppgadmin_error.log; root /usr/share/phpPgAdmin/; location / { index index.php; } ## Images and static content is treated different location ~* ^.+.(jpg|jpeg|gif|css|png|js|ico|xml)$ { access_log off; expires 360d; } location ~ /\.ht { deny all; } location ~ /(libraries|setup/frames|setup/libs) { deny all; return 404; } location ~ \.php$ { include /etc/nginx/fastcgi_params; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /usr/share/phpPgAdmin$fastcgi_script_name; } } systemctl restart postgresql.service systemctl restart nginx.service systemctl restart php-fpm.service 54 Capítulo 3. Linux Documents Documentation, Publicación 0.0.1 Ubuntu vim /etc/nginx/sites-available/phppgadmin server { listen 80; server_name phppgadmin.local; access_log /var/log/nginx/phppgadmin_access.log; error_log /var/log/nginx/phppgadmin_error.log; root /usr/share/phpPgAdmin/; location / { index index.php; } ## Images and static content is treated different location ~* ^.+.(jpg|jpeg|gif|css|png|js|ico|xml)$ { access_log off; expires 360d; } location ~ /\.ht { deny all; } location ~ /(libraries|setup/frames|setup/libs) { deny all; return 404; } location ~ .php$ { try_files $uri =404; fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_index index.php; include /etc/nginx/fastcgi_params; } } ln -s /etc/nginx/sites-available/phppgadmin /etc/nginx/sites-enabled/phppgadmin service nginx restart service php5-fpm restart 3.5.6 Rewrite PHP location / { index index.html index.htm index.php; if (!-e $request_filename) { rewrite /(.*)$ /index.php?uri=$1 last; break; } } 3.5. Nginx 55 Documents Documentation, Publicación 0.0.1 3.5.7 Vhosts en Nginx Ubuntu Como usuario mkdir ~/public_html sudo vim /etc/nginx/sites-available/workspace.local server { listen 80; server_name lxmaq2.workspace.local; access_log /var/log/nginx/workspace-access.log; error_log /var/log/nginx/workspace-error.log; root /home/snicoper/public_html; location / { index index.html index.htm index.php; } location ~* \.(jpg|jpeg|gif|png|css|js|ico|xml)$ { access_log off; log_not_found off; expires 360d; } # Si quiero que se vean los archivos y directorios cambiar a on autoindex on; location ~ .php$ { try_files $uri =404; fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_index index.php; include /etc/nginx/fastcgi_params; } } Copiar el sitio creado a sites-enabled sudo ln -s /etc/nginx/sites-available/workspace.local /etc/nginx/sites-enabled/workspace.local Si instalo phpmyadmin En Ubuntu además, hago un enlace simbólico de phpmyadmin en la carpeta home, para acceder luego a phpmyadmin http://www.workspace.local/phpmyadmin y me ahorro tener que crear un nuevo vhost para phpmyadmin. sudo ln -s ln -s /usr/share/phpmyadmin/ public_html/ Reiniciar los servicios. sudo service nginx restart sudo service php5-fpm restart Fedora Todo como root 56 Capítulo 3. Linux Documents Documentation, Publicación 0.0.1 mkdir chmod chmod chown /home/snicoper/public_html 711 /home/snicoper 755 /home/snicoper/public_html snicoper:snicoper /home/snicoper/public_html vim /etc/nginx/conf.d/workspace.local.conf server { listen 80; server_name www.workspace.local; access_log /var/log/nginx/workspace-access.log; error_log /var/log/nginx/workspace-error.log; root /home/snicoper/public_html; location / { index index.html index.htm index.php; } location ~* \.(jpg|jpeg|gif|png|css|js|ico|xml)$ { access_log off; log_not_found off; expires 360d; } # Si quiero que se vean los archivos y directorios cambiar a on autoindex on; location ~ \.php$ { include /etc/nginx/fastcgi_params; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /home/snicoper/public_html$fastcgi_script_name; } } systemctl restart nginx.service systemctl restart php-fpm.service Ver Reglas SELinux 3.6 PHP Categorias: 3.6.1 PHP Composer curl -s https://getcomposer.org/installer | php sudo mv composer.phar /usr/local/bin/composer # Para actualizar composer composer self-update 3.6. PHP 57 Documents Documentation, Publicación 0.0.1 3.6.2 DokuWiki Apache Fedora Copiar el contenido por ejemplo en ~/public_html/wiki, después dar permisos. cd ~/public_html/wiki find ./wiki -type d -exec chmod 755 {} \; find ./wiki -type f -exec chmod 644 {} \; sudo setfacl -R -m u:snicoper:rwx -m u:apache:rwx wiki/conf/ wiki/data/ sudo setfacl -dR -m u:snicoper:rwx -m u:apache:rwx wiki/conf/ wiki/data/ Esto no es necesario si esta en ~/public_html/* # chcon -R -t httpd_sys_rw_content_t wiki/data # chcon -R -t httpd_sys_rw_content_t wiki/conf Crear el host virtual sudo vim /etc/httpd/conf.d/wiki.workspace.local.conf <VirtualHost *:80> DocumentRoot /home/snicoper/public_html/wiki ServerName cvowiki.workspace.local ServerAlias cvowiki.workspace.local DirectoryIndex index.php ServerAdmin [email protected] ErrorLog logs/cvo.workspace.local-error_log CustomLog logs/cvo.workspace.local-access_log combined <Directory /home/snicoper/Projects/cvo/wiki> Options Indexes FollowSymLinks MultiViews AllowOverride All Order allow,deny allow from all Require all granted </Directory> </VirtualHost> Reiniciar apache .. code-block:: bash systemctl restart httpd.service Ubuntu Advertencia: Por hacer 3.6.3 Instalación Laravel Fuentes http://laravel.com/docs/quick#installation 58 Capítulo 3. Linux Documents Documentation, Publicación 0.0.1 Fedora yum install -y php-curl Centos 7, si se ha instalado php 5.5 yum install --enablerepo=remi,remi-php55 php-curl Ubuntu sudo apt-get install php5-curl Composer o Archivo Phar Creo que composer lo tiene mas actualizado composer self-update, con archivo Phar, has de estar descargándolo a “mano” cada que se quiera actualizar. Composer PHP Composer composer create-project laravel/laravel your-project-name --prefer-dist Phar Como root wget http://laravel.com/laravel.phar chmod +x laravel.phar mv laravel.phar /usr/local/bin/laravel laravel --version 3.6.4 Instalación MariaDB Instalación MariaDB Ubuntu sudo apt-get install php5-mysqlnd sudo apt-get install phpmyadmin Fedora yum install php-mysqlnd yum install install phpmyadmin 3.6. PHP 59 Documents Documentation, Publicación 0.0.1 3.6.5 Instalación PHP Ubuntu Apache y Nginx sudo apt-get install -y php5 php5-cli php5-gd php5-xsl php5-json php5-mcrypt Nota: Si se instala Nginx, desactivar uno de los dos, ver carpeta de Ubuntu para desactivar servicios. Importante: Crear enlace cuando este creado el archivo de Ubuntu para desactivar servicios. Apache sudo apt-get install libapache2-mod-php5 Nginx sudo apt-get install php5-fpm sudo php5enmod mcrypt PHP.ini Apache sudo cp /usr/share/php5/php.ini-development /etc/php5/apache2/php.ini sudo vim /etc/php5/apache2/php.ini Nginx sudo cp /usr/share/php5/php.ini-development /etc/php5/fpm/php.ini sudo vim /etc/php5/fpm/php.ini Nginx y Apache Nota: Se puede omitir, es el cli sudo cp /usr/share/php5/php.ini-production.cli /etc/php5/cli/php.ini sudo vim /etc/php5/cli/php.ini Modificar php.ini y cli/php.ini expose_php = Off short_open_tag Off timezone Europe/Madrid 60 Capítulo 3. Linux Documents Documentation, Publicación 0.0.1 Configuracion php-opcache En la linea 1877 mas o menos: opcache.enable=1 opcache.enable_cli=1 opcache.memory_consumption=128 opcache.interned_strings_buffer=8 opcache.max_accelerated_files=4000 opcache.revalidate_freq=60 opcache.fast_shutdown=1 Apache sudo service apache2 restart Nginx sudo service nginx restart sudo service php5-fpm restart Fedora Centos Nota: Para php 5.5 en Centos usar: yum –enablerepo=remi,remi-php55, yo lo omito por que todo lo demás es igual en Fedora que en Centos. yum install -y php php-gd php-pdo php-xml php-mcrypt php-cli php-soap php-opcache Para ver lista de paquetes php-* yum search php- Fedora cp /usr/share/doc/php-common/php.ini-development /etc/php.ini Centos cp /usr/share/doc/php-common-5.5.14/php.ini-development /etc/php.ini Fedora y Centos yum install php-fpm -y systemctl start php-fpm.service systemctl enable php-fpm.service 3.6. PHP 61 Documents Documentation, Publicación 0.0.1 PHP.ini vim /etc/php.ini Buscar y editar timezone Europe/Madrid php_expose = off short_open_tags = off Configuracion de php-opcache En la linea 1872 (Fedora) 1836 (Centos), debajo de [opcache], añadir opcache.enable=1 opcache.enable_cli=1 opcache.memory_consumption=128 opcache.interned_strings_buffer=8 opcache.max_accelerated_files=4000 opcache.revalidate_freq=60 opcache.fast_shutdown=1 3.6.6 PHP Memcahed Instalación de Memcached Fedora yum -y install php-pecl-memcached Ubuntu sudo apt-get install php5-memcached 3.6.7 PHP MongoDB Instalación MongoDb Fedora yum install php-pecl-mongo Ubuntu 62 Capítulo 3. Linux Documents Documentation, Publicación 0.0.1 sudo apt-get install php5-mongo 3.6.8 Pear Fedora yum install -y php-pear Ubuntu sudo apt-get install php5-pear 3.6.9 PHP PostgreSQL Ubuntu sudo apt-get install -y php5-pgsql # Opcional sudo apt-get install -y phppgadmin Configurar phppgadmin sudo vim /usr/share/phppgadmin/conf/config.inc.php Buscar $conf[’extra_login_security’] y poner el valor a false $conf[’extra_login_security’] = false; Fedora yum install -y php-pgsql # Opcional yum install -y phpPgAdmin Centos Para PHP 5.5 yum install -y php-pgsql --enablerepo=remi,remi-php55 # Opcional yum install -y phpPgAdmin --enablerepo=remi,remi-php55 Configuracon phpPgAdmin, Fedora y Centos 3.6. PHP 63 Documents Documentation, Publicación 0.0.1 cp /usr/share/phpPgAdmin/conf/config.inc.php-dist /usr/share/phpPgAdmin/conf/config.inc.php vim /usr/share/phpPgAdmin/conf/config.inc.php Buscar $conf[’extra_login_security’] y poner el valor a false $conf[’extra_login_security’] = false; 3.6.10 PHPDocumentor 2 PHAR Como root wget http://phpdoc.org/phpDocumentor.phar chmod +x phpDocumentor.phar mv phpDocumentor.phar /usr/local/bin/phpdoc phpdoc --version PEAR Instalar Pear pear channel-discover pear.phpdoc.org pear install phpdoc/phpDocumentor Composer Instalar PHP Composer composer require --dev phpdocumentor/phpdocumentor dev-master Después se podrá ejecutar phpDocumentor directamente desde el directorio vendor: 3.6.11 PHPUnit Como root wget https://phar.phpunit.de/phpunit.phar chmod +x phpunit.phar sudo mv phpunit.phar /usr/local/bin/phpunit phpunit --version 3.6.12 XDebug Ver Instalación PHP Ubuntu sudo apt-get install php5-xdebug sudo vim /etc/php5/mods-available/xdebug.ini 64 Capítulo 3. Linux Documents Documentation, Publicación 0.0.1 zend_extension=/usr/lib/php5/20100525/xdebug.so xdebug.remote_enable=on xdebug.remote_handler=dbgp xdebug.remote_host=localhost xdebug.remote_port=9000 xdebug.output_buffering=off Fedora yum install php-pecl-xdebug -y Centos PHP 5 yum install --enablerepo=remi,remi-php55 php-pecl-xdebug Fedora y Centos PHP 5 vim /etc/php.d/xdebug.ini ; Enable xdebug extension module zend_extension=/usr/lib64/php/modules/xdebug.so xdebug.remote_enable=on xdebug.remote_handler=dbgp xdebug.remote_host=localhost xdebug.remote_port=9000 xdebug.output_buffering=off 3.7 PostgreSQL Categorias: 3.7.1 Instalación de PostgreSQL Fuentes https://help.ubuntu.com/community/PostgreSQL Ubuntu Instalación sudo apt-get install -y postgresql postgresql-client postgresql-contrib # Opcional sudo apt-get install -y pgAdmin3 3.7. PostgreSQL 65 Documents Documentation, Publicación 0.0.1 Si se quiere instalar psycopg2 con Python pip sudo apt-get -y install libpq-dev Establecer contraseña del usuario postgres sudo -u postgres psql postgres \password postgres Crear usuario snicoper y database practicas CREATE user snicoper WITH PASSWORD ’123456’ NOCREATEDB NOCREATEUSER; CREATE DATABASE practicas WITH OWNER snicoper; \q Configuración PostgreSQL sudo vim /etc/postgresql/9.3/main/postgresql.conf # Descomentar, linea 59 listen_addresses = ’localhost’ # Descomentar, linea 89 password_encryption = on sudo service postgresql restart Fedora y Centos Advertencia: En Centos 7 no lo he probado, pero debe ser la misma que en Fedora 19, 20 Instalación yum install -y postgresql postgresql-server # Opcional yum install -y pgadmin3 Si se quiere instalar psycopg2 con python pip yum install -y postgresql-devel postgresql-setup initdb systemctl enable postgresql.service systemctl start postgresql.service Establecer contraseña de postgres passwd postgres su - postgres psql CREATE USER snicoper WITH PASSWORD ’123456’ NOCREATEDB NOCREATEUSER; CREATE DATABASE practicas WITH OWNER snicoper; \q exit Configuración 66 Capítulo 3. Linux Documents Documentation, Publicación 0.0.1 vim /var/lib/pgsql/data/postgresql.conf # linea 59 listen_addresses = ’localhost’ # linea 63 descomentar port = 5432 vim /var/lib/pgsql/data/pg_hba.conf Remplazar toda la parte siguiente al final del archivo # TYPE DATABASE USER ADDRESS # "local" is for Unix domain socket connections only local all all # IPv4 local connections: host all all 127.0.0.1/32 # IPv6 local connections: host all all ::1/128 METHOD md5 md5 md5 systemctl restart postgresql.service Ver Reglas SELinux 3.8 Python Categorias: 3.8.1 Apuntes PIP Algunos apuntes de paquetes que estan en pip Usar una version especifica con pip pip3 install django==1.5.5 Django pip3 install django Flask pip3 install flask psycopg2 3.8. Python 67 Documents Documentation, Publicación 0.0.1 # Ubuntu apt install libpq-dev # Fedora yum install postgresql-devel pip3 insyall psycopg2 sqlalchemy, ORM database para python pip3 install sqlalchemy Python y MySQL Advertencia: Por hacer Ver Conector 1 Ver Conector 2 lxml, Manejo de archivos XML Nota: Pillow is the ‘friendly’ PIL fork by Alex Clark and Contributors. PIL is the Python Imaging Library by Fredrik Lundh and Contributors. Fuente http://pillow.readthedocs.org/en/latest/installation.html Pillow Ubuntu sudo apt-get install libtiff4-dev libjpeg8-dev zlib1g-dev \ libfreetype6-dev liblcms2-dev libwebp-dev tcl8.5-dev tk8.5-dev python3-tk \ libjpeg-dev libpng12-0 libpng12-dev Fedora Por hacer Instalar Pillow pip install Pillow 68 Capítulo 3. Linux Documents Documentation, Publicación 0.0.1 3.8.2 Compilar Python 3.4.1 en Centos 7 Compilación sudo yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-de vim /etc/ld.so.conf # Añadir /usr/local/lib wget https://www.python.org/ftp/python/3.4.1/Python-3.4.1.tgz tar -zxvf Python-3.4.1.tgz cd Python-3.4.1 ./configure --prefix=/usr/local --enable-shared LDFLAGS="-Wl,-rpath /usr/local/lib" make sudo make altinstall Usar pip con pip3.4 Virtualenv y Virtualenvwrapper su pip3.4 install virtualenv virtualenvwrapper exit Como usuario: mkdir ~/.virtualenvs Añadir a ~/.bashrc vim ~/.bashrc export VIRTUALENVWRAPPER_PYTHON=/usr/local/bin/python3.4 export WORKON_HOME=$HOME/.virtualenvs source /usr/local/bin/virtualenvwrapper.sh # Guardar y salir source ~/.bashrc Comandos mkvirtualenv // Crea un nuevo virtualenv rmvirtualenv // Elimina un virtualenv existente workon // Cambia el actual virtualenv deactivate // Desactivar virtualenv lsvirtualenv // Listar virtualenvs Para crear un nuevo virtualenv, ejecutar mkvirtualenv nombre_venv Para usarlo 3.8. Python 69 Documents Documentation, Publicación 0.0.1 workon nombre_venv 3.8.3 Instalacion Python en Fedora Python2 sudo yum install -y python-setuptools python-devel sudo yum install -y python-pip Python3 sudo yum install -y python3 python3-setuptools python3-devel # Fedora 20, en 21 ya esta instalado sudo yum install -y python3-pip Use Pip # en python 2 pip install nombre_paquete # en python 3 fedora 20 pip-python3 install nombre_paquete # en python 3 fedora 21 pip3 install nombre_paquete Virtualenv y Virtualenvwrapper su pip-python3 install virtualenv virtualenvwrapper exit mkdir ~/.virtualenvs Editar .bashrc vim ~/.bashrc # Añadir export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3 export WORKON_HOME=$HOME/.virtualenvs source /usr/bin/virtualenvwrapper.sh # Guardar y salir source ~/.bashrc Comandos mkvirtualenv // Crea un nuevo virtualenv rmvirtualenv // Elimina un virtualenv existente workon // Cambia el actual virtualenv 70 Capítulo 3. Linux Documents Documentation, Publicación 0.0.1 deactivate // Desactivar virtualenv lsvirtualenv // Listar virtualenvs Para crear un nuevo virtualenv, ejecutar mkvirtualenv nombre_venv Para usarlo workon nombre_venv 3.8.4 Instalacion Python en Ubuntu Python2 sudo apt install -y python-dev python-setuptools sudo apt install -y python-pip Python3 sudo apt install -y python3 python3-dev python3-setuptools sudo apt install -y python3-pip Use Pip # en python 2 pip install nombre_paquete # en python 3 pip3 install nombre_paquete Virtualenv y Virtualenvwrapper su pip3 install virtualenv virtualenvwrapper exit mkdir ~/.virtualenvs Editar .bashrc vim ~/.bashrc Añadir export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3 export WORKON_HOME=$HOME/.virtualenvs source /usr/local/bin/virtualenvwrapper.sh Comandos mkvirtualenv // Crea un nuevo virtualenv rmvirtualenv // Elimina un virtualenv existente workon // Cambia el actual virtualenv 3.8. Python 71 Documents Documentation, Publicación 0.0.1 deactivate // Desactivar virtualenv lsvirtualenv // Listar virtualenvs Para crear un nuevo virtualenv, ejecutar mkvirtualenv nombre_venv Para usarlo workon nombre_venv 3.8.5 Actualizar todos los paquetes de Pip pip freeze --local | grep -v ’^\-e’ | cut -d = -f 1 | xargs pip install -U 3.8.6 PYTHONPATH Editar vimrc vim ~/.vimrc Añadir PYTHONPATH="/home/snicoper/.virtualenvs/py3venv/lib/python3.4/site-packages/":"${PYTHONPATH}" export PYTHONPATH Donde /home/snicoper/.virtualenvs/py3venv/lib/python3.4/site-packages/ sustituirlo por un directorio. 3.9 Redis Categorias: 3.9.1 Instalar Redis Fuentes http://redis.io/ sudo apt-get install redis-server Backup del archivo de configuración cp /etc/redis/redis.conf /etc/redis/redis.conf.default 3.10 Ruby Categorias: 72 Capítulo 3. Linux Documents Documentation, Publicación 0.0.1 3.10.1 Instalación y Primeros Pasos Instalación Ubuntu Dependencias para Ruby, si se omiten, cuando se instale Ruby desde rvm, pedirá instalarlas. Prerrequisitos sudo apt-get install gawk libreadline6-dev libyaml-dev libsqlite3-dev sqlite3 \ autoconf libgdbm-dev libncurses5-dev automake libtool bison libffi-dev sudo apt-get install nodejs rvm Es algo así, como Virtualenv? \curl -sSL https://get.rvm.io | bash -s stable Advertencia: Esta parte, no se si lo hago bien del todo, buscar mas info de instalación. Editar .vimrc vim ~/.bashrc Añadir al final # Load RVM into a shell session *as a function* [[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm" export PATH="$PATH:$HOME/.rvm/gems/ruby-2.1.1/bin" # Add RVM to PATH for scripting export PATH="$PATH:$HOME/.rvm/bin" Releer ~/.bashrc source ~/.bashrc Instalar Ruby Tarda su tiempo!! rvm install ruby-2.1.2 rvm use ruby-2.1.2 --default Instalar Rails gem install rails rails -v Fedora Consejo: Supongo que sera igual que en Ubuntu, lo único son los Prerrequisitos, ponerlos si alguna vez lo hago. 3.10. Ruby 73 Documents Documentation, Publicación 0.0.1 3.11 Scala Categorias: 3.11.1 Instalar Scala Fuentes: http://www.scala-lang.org/ Advertencia: Sustituir 2.11.1 por la version descargada Descomprimir y mover a opt sudo mv scala-2.11.1 /opt/scala-2.11.1 Añadir al path vim ~/.bashrc PATH="$PATH:/opt/scala-2.11.1/bin" 3.11.2 Instalar Play Framework Fuentes http://www.playframework.com/ Descomprimir y mover a /opt sudo chmod a+x /opt/activator-1.2.0/activator Editar .bashrc para añadir el path vim ~/.bashrc PATH=$PATH:/opt/activator-1.2.0/activator 3.12 Ubuntu Categorias: 3.12.1 Crear certificado SSL Pongo el nombre de lxmaq1 para el servidor principal, cambiar si es otro servidor 74 Capítulo 3. Linux Documents Documentation, Publicación 0.0.1 sudo -s cd /etc/ssl/private openssl genrsa -des3 -out lxmaq1.key 2048 openssl req -new -days 3650 -key lxmaq1.key -out lxmaq1.csr Country Name (2 letter code) [XX]:es State or Province Name (full name) []:Spain Locality Name (eg, city) [Default City]:Barcelona Organization Name (eg, company) [Default Company Ltd]:snicoper Organizational Unit Name (eg, section) []:nombre_org Common Name (eg, your name or your server’s hostname) []:lxmaq1.workspace.local Email Address []:[email protected] A challenge password []: (Intro) An optional company name []: (Intro) openssl x509 -in lxmaq1.csr -out lxmaq1.crt -req -signkey lxmaq1.key -days 3650 chmod 400 lxmaq1.* 3.12.2 How To Apt Instalar un paquete apt-get install <paquete> Desinstalar un paquete apt-get remove <paquete> Eliminar un paquete incluidos sus ficheros de configuración apt-get purge <paquete> Eliminar de forma automática aquellos paquetes que no se estén utilizando apt-get autoremove Actualizar un paquete a la última versión disponible en el repositorio apt-get update <paquete> Actualizar el sistema. Actualizará todos los paquetes que dispongan de una versión superior dentro de la rama instalada de la distribución apt-get upgrade Actualizar la distribución completa. Actualizará nuestro sistema a la siguiente versión disponible de la distribución apt-get dist-upgrade Descargar únicamente las fuentes de un paquete para manipularlas de forma manual apt-get source <paquete> Limpiar cachés, paquetes descargados, etc 3.12. Ubuntu 75 Documents Documentation, Publicación 0.0.1 apt-get clean apt-get autoclean Verificar que no tenemos ninguna dependencia incumplida apt-get check Buscar un paquete en los repositorios, se puede especificar un patrón, expresión regular, el nombre exacto del paquete, etc apt-cache search <paquete> Mostrar información sobre un paquete específico (nombre del paquete, versión, dependencias. . . ) apt-cache showpkg <paquete> Mostrar información del paquete incluyendo la descripción, información del paquete como su sitio web, página de bugs. . . apt-cache show <paquete> Mostrar dependencias de un paquete apt-cache depends <paquete> Mostrar los nombres de todos los paquetes instalados en el sistema apt-cache pkgnames 3.12.3 Post instalacion Ubuntu Si se usa calligra, eliminar libreoffice antes de actualizar. sudo apt-get remove --purge libreoffice* Actualizar. sudo apt-get update && apt-get dist-upgrade Si es una instalación de VirtualBox. sudo apt-get install virtualbox-guest-dkms Instalar Vim. sudo apt-get -y install vim Cambiar editor. sudo update-alternatives --config editor Programas basicos. sudo apt-get install -y \ build-essential \ git \ git-cola \ exuberant-ctags \ curl \ wget \ 76 Capítulo 3. Linux Documents Documentation, Publicación 0.0.1 ssh \ unrar \ htop \ nmap \ tree \ python-pygments # JDK y JRE sudo apt-get install -y \ openjdk-7-jre \ openjdk-7-jdk Diccionario español. sudo apt-get install aspell-es myspell-es -y KDE Si se configura Akonadi con SQLite o PostgreSQL. Cambiar en Menú > buscar Akonadi Server Configuration. sudo apt-get install akonadi-backend-sqlite sudo apt-get install akonadi-backend-postgresql Muon. sudo apt-get -y install muon Calligra. sudo apt-get install calligra -y kdiff3. sudo apt-get install kdiff3-qt -y Utilidades KDE. sudo apt-get install kgpg kleopatra kcolorchooser -y Para visualizar las miniaturas en Dolphin de los .pdf. sudo apt-get install kdegraphics-thumbnailers -y Eliminar. sudo apt-get remove --purge kget amarok -y Opcionales. sudo apt-get install kdeplasma-addons -y Transmision. sudo apt-get install transmission-qt -y qBittorent. 3.12. Ubuntu 77 Documents Documentation, Publicación 0.0.1 sudo apt-get install qbittorrent -y GNOME Eliminar en Ubuntu Unity Amazon. sudo apt-get remove --purge unity-webapps-common Synaptic. sudo apt-get install synaptic Open terminal here. sudo apt-get install nautilus-open-terminal Meld. sudo apt-get install meld -y gpick. sudo apt-get install gpick -y libreoffice. sudo apt-get install libreoffice RabbitVCS. sudo add-apt-repository ppa:rabbitvcs/ppa sudo apt-get update sudo apt-get install rabbitvcs-nautilus3 rabbitvcs-cli KDE/GNOME Umbrello. sudo apt-get install -y umbrello Gui SQLite. sudo apt-get install -y sqliteman Thunderbird. sudo apt-get install thunderbird Chromium. sudo apt-get install chromium-browser -y Vlc. 78 Capítulo 3. Linux Documents Documentation, Publicación 0.0.1 sudo apt-get install vlc Inskape y gimp. sudo apt-get install gimp inkscape Filezilla. sudo apt-get install filezilla Kdevelop. sudo apt-get install kdevelop cmake kdevelop python. sudo apt-get install kdev-python pep8 qtcreator. sudo apt-get -y install qtcreator No mostrar la opción de cuenta de invitado al hacer login. sudo sh -c ’printf "[SeatDefaults]\nallow-guest=false\n" >/usr/share/lightdm/lightdm.conf.d/50-no-gue 3.12.4 Postfix Instalación sudo apt-get install postfix sasl2-bin dovecot-common dovecot-pop3d dovecot-imapd Postfix Durante la instalación cuando pregunte por el certificado SSL, decir que no. Después darle a <ok> Por ultimo, No configuration sudo cp /usr/lib/postfix/main.cf /etc/postfix/main.cf sudo vim /etc/postfix/main.cf # line 59: uncomment mail_owner = postfix # line 76: uncomment and specify hostname myhostname = mail.workspace.local # line 83: uncomment and specify domain name mydomain = workspace.local # line 104: uncomment myorigin = $mydomain # line 118: uncomment 3.12. Ubuntu 79 Documents Documentation, Publicación 0.0.1 inet_interfaces = all # line 166: uncomment mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain # line 209: uncomment local_recipient_maps = unix:passwd.byname $alias_maps # line 268: uncomment and specify your LAN mynetworks = 192.168.0.0/24, 127.0.0.0/16 # line 388: uncomment alias_maps = hash:/etc/aliases # line 399: uncomment alias_database = hash:/etc/aliases # line 421: uncomment (use Maildir) home_mailbox = Maildir/ # line 531: uncomment header_checks = regexp:/etc/postfix/header_checks # add: mail body checking body_checks = regexp:/etc/postfix/body_checks # line 557: make it comment and add below # smtpd_banner = $myhostname ESMTP $mail_name (@@DISTRO@@) smtpd_banner = $myhostname ESMTP # line 631: add sendmail_path = /usr/sbin/postfix # line 636: add newaliases_path = /usr/bin/newaliases # line 641: add mailq_path = /usr/bin/mail # line 647: add setgid_group = postdrop # line 651: make it comment # html_directory = # line 655: make it comment # manpage_directory = # line 660: make it comment # sample_directory # line 664: make it comment # readme_directory = # add at the lasdt line: # limit an email size 10M message_size_limit = 10485760 80 Capítulo 3. Linux Documents Documentation, Publicación 0.0.1 # limit mailbox 1G mailbox_size_limit = 1073741824 # for SMTP-Auth settings smtpd_sasl_type = dovecot smtpd_sasl_path = private/auth smtpd_sasl_auth_enable = yes smtpd_sasl_security_options = noanonymous smtpd_sasl_local_domain = $myhostname smtpd_client_restrictions = permit_mynetworks,reject_unknown_client,permit smtpd_recipient_restrictions = permit_mynetworks,permit_auth_destination,permit_sasl_authenticated,re sudo vim /etc/postfix/header_checks # add at the head ( reject if email address is empty ) /^From:.*<#.*@.*>/ REJECT /^Return-Path:.*<#.*@.*>/ REJECT sudo vim /etc/postfix/body_checks # reject if includes ’example.com’ in mail body /^(|[^>].*)example.com/ REJECT sudo vim /etc/aliases # Añadir root: [email protected] sudo newaliases sudo service postfix restart Dovecot sudo vim /etc/dovecot/conf.d/10-auth.conf # line 10: uncomment and change ( allow plain text auth ) disable_plaintext_auth = no # line 100: add auth_mechanisms = plain login sudo vim /etc/dovecot/conf.d/10-mail.conf # line 30: uncomment and add mail_location = maildir:~/Maildir sudo vim /etc/dovecot/conf.d/10-master.conf # line 95: uncomment and add # Postfix smtp-auth unix_listener /var/spool/postfix/private/auth { mode = 0666 user = postfix # add group = postfix # add } 3.12. Ubuntu 81 Documents Documentation, Publicación 0.0.1 sudo service dovecot restart SSL Ver Crear certificado SSL sudo vim /etc/postfix/main.cf Nota: Usar lxmaq1.crt y lxmaq1.key con los mismos nombres que se hayan creado en Crear certificado SSL # add at the last line # SSL smtpd_use_tls = yes smtpd_tls_cert_file = /etc/ssl/private/lxmaq1.crt smtpd_tls_key_file = /etc/ssl/private/lxmaq1.key smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache sudo vim /etc/postfix/master.cf # line 28-30: uncomment smtps inet n -o syslog_name=postfix/smtps -o smtpd_tls_wrappermode=yes - - - smtpd sudo vim /etc/dovecot/conf.d/10-ssl.conf # line 6: uncomment ssl = yes # line 12,13: uncomment and specify certificate ssl_cert = </etc/ssl/private/lxmaq1.crt ssl_key = </etc/ssl/private/lxmaq1.key sudo service postfix restart sudo service dovecot restart 3.12.5 Servicios Detener o arrancar un servicio sudo update-rc.d apache2 disable sudo update-rc.d nginx enable 3.12.6 ufw Fuentes https://help.ubuntu.com/14.04/serverguide/firewall.html Estos son comandos muy básicos, para mas info en Fuentes Habiliar 82 Capítulo 3. Linux Documents Documentation, Publicación 0.0.1 sudo ufw enable Para ver las reglas actuales sudo ufw status numbered Para abrir un puerto sudo ufw allow 22 Cerrar un puerto sudo ufw deny 22 Para eliminar una regla sudo ufw delete deny 22 sudo ufw delete allow 22 sudo ufw delete allow proto tcp from 192.168.1.0/24 to any port 22 Es insertar lo mismo pero con delete después de ‘sudo ufw delete (comando que se añadió)’ sudo ufw allow proto tcp from 192.168.1.2 to any port 22 sudo ufw allow proto tcp from 192.168.1.0/24 to any port 22 Abrir todo el trafico la red local sudo ufw allow from 192.168.1.0/24 Contents: 3.13 Añadir carpetas al PATH Editar ~/.bashrc vim ~/.bashrc Añadir al final PATH="$PATH:/data/myscripts" export PATH 3.14 Añadir programas al menu Nota: Todos los pongo en opt 3.14.1 Sublime 3 Descomprimir como usuario su mv sublime_text_3 /opt/sublime_text_3 touch /usr/local/bin/sublime chmod 755 /usr/local/bin/sublime 3.13. Añadir carpetas al PATH 83 Documents Documentation, Publicación 0.0.1 vim /usr/local/bin/sublime #!/bin/sh export SUBLIME_HOME="/opt/sublime_text_3" $SUBLIME_HOME/sublime_text $* vim /usr/share/applications/sublime.desktop [Desktop Entry] Encoding=UTF-8 Name=Sublime Text 3 Comment=Sublime Text Editor Exec=sublime %U Icon=/opt/sublime_text_3/Icon/48x48/sublime-text.png Terminal=false Type=Application Categories=GNOME;Application;Development; StartupNotify=true 3.14.2 Eclipse su tar -xvzf nombre_eclipse.tar.gz -C /opt chmod -R +r /opt/eclipse touch /usr/local/bin/eclipse chmod 755 /usr/local/bin/eclipse vim /usr/local/bin/eclipse #!/bin/sh export ECLIPSE_HOME="/opt/eclipse" $ECLIPSE_HOME/eclipse $* vim /usr/share/applications/eclipse.desktop [Desktop Entry] Encoding=UTF-8 Name=Eclipse Comment=Eclipse Exec=eclipse Icon=/opt/eclipse/icon.xpm Terminal=false Type=Application Categories=GNOME;Application;Development; StartupNotify=true 3.14.3 Aptana touch /usr/local/bin/aptana chmod 755 /usr/local/bin/aptana vim /usr/local/bin/aptana 84 Capítulo 3. Linux Documents Documentation, Publicación 0.0.1 export APTANA_HOME="/opt/aptana" $APTANA_HOME/AptanaStudio3 $* vim /usr/share/applications/aptana.desktop [Desktop Entry] Encoding=UTF-8 Name=Aptana Studio 3 Comment=IDE Web Exec=aptana %U Icon=/opt/aptana/icon.xpm Terminal=false Type=Application Categories=GNOME;Application;Development; StartupNotify=true 3.14.4 DBeaver mv dbeaver /opt/ touch /usr/local/bin/dbeaver chmod 755 /usr/local/bin/dbeaver vim /usr/local/bin/dbeaver #!/bin/sh export DBEAVER_HOME="/opt/dbeaver" $DBEAVER_HOME/dbeaver $* vim /usr/share/applications/dbeaver.desktop [Desktop Entry] Encoding=UTF-8 Name=DBeaver Comment=DB Manager Exec=dbeaver Icon=/opt/dbeaver/icon.xpm Terminal=false Type=Application Categories=GNOME;Application;Development; StartupNotify=true 3.14.5 Netbeans unzip netbeans-7.3.1-201306052037-php mv netbeans /opt/netbeans touch /usr/local/bin/netbeans chmod 755 /usr/local/bin/netbeans vim /usr/local/bin/netbeans #!/bin/sh export NETBEANS_HOME="/opt/netbeans/bin" $NETBEANS_HOME/netbeans $* 3.14. Añadir programas al menu 85 Documents Documentation, Publicación 0.0.1 vim /usr/share/applications/netbeans.desktop [Desktop Entry] Encoding=UTF-8 Name=netbeans Comment=IDE PHP Exec=netbeans Icon=/opt/netbeans/harness/nbi/stub/ext/components/products/helloworld/data/icon48.png Terminal=false Type=Application Categories=GNOME;Application;Development; StartupNotify=true 3.14.6 PhpStorm Nota: Los productos de Jetbrains los pongo dentro de /opt/jetbrains/, si no existe, la creo. # Si no existe mkdir /opt/jetbrains gzip -d PhpStorm-7.0.tar.gz tar -xvf PhpStorm-7.0.tar mv PhpStorm-131.374 /opt/jetbrains/PhpStorm chmod +x /opt/jetbrains/PhpStorm/bin/phpstorm.sh touch /usr/local/bin/pstorm chmod 755 /usr/local/bin/pstorm vim /usr/local/bin/pstorm #!/bin/sh export PHP_STORM="/opt/jetbrains/PhpStorm/bin" $PHP_STORM/phpstorm.sh $* vim /usr/share/applications/phpstorm.desktop [Desktop Entry] Encoding=UTF-8 Name=PhpStorm Comment=IDE for PHP Exec=pstorm Icon=/opt/jetbrains/PhpStorm/bin/webide.png Terminal=false Type=Application Categories=GNOME;Application;Development; StartupNotify=true 3.14.7 Intellij idea # Si no existe mkdir /opt/jetbrains cp -r idea-IU-123.169/ /usr/local/jetbrains/intellij-idea chmod +x /opt/jetbrains/intellij-idea/bin/idea.sh touch /usr/local/bin/intellij-idea chmod 755 /usr/local/bin/intellij-idea 86 Capítulo 3. Linux Documents Documentation, Publicación 0.0.1 vim /usr/local/bin/intellij-idea #!/bin/sh export INTELLIJ_IDEA="/opt/jetbrains/intellij-idea/bin" $INTELLIJ_IDEA/idea.sh $* vim /usr/share/applications/intellij-idea.desktop [Desktop Entry] Encoding=UTF-8 Name=Intellij Idea Comment=IDE for JAVA Exec=intellij-idea %U Icon=/opt/jetbrains/intellij-idea/bin/idea.png Terminal=false Type=Application Categories=GNOME;Application;Development; 3.14.8 PyCharm # Si no existe mkdir /opt/jetbrains gzip -d pycharm-professional-3.1.3.tar.gz tar -xvf pycharm-professional-3.1.3.tar mv pycharm-3.1.3/ /opt/jetbrains/pycharm chmod +x /opt/jetbrains/pycharm/bin/pycharm.sh touch /usr/local/bin/pycharm chmod 755 /usr/local/bin/pycharm vim /usr/local/bin/pycharm #!/bin/sh export PYCHARM="/opt/jetbrains/pycharm/bin" $PYCHARM/pycharm.sh $* vim /usr/share/applications/pycharm.desktop [Desktop Entry] Encoding=UTF-8 Name=PyCharm Comment=IDE for Python Exec=pycharm %U Icon=/opt/jetbrains/pycharm/bin/pycharm.png Terminal=false Type=Application Categories=GNOME;Application;Development; StartupNotify=true 3.15 Bind 3.15.1 Fuentes http://blog.ca.edu.ni/cleal/2012/11/28/servidor-dns-en-ubuntu-12-04/ 3.15. Bind 87 Documents Documentation, Publicación 0.0.1 http://www.belinuxmyfriend.com/2007/07/ip-estatica-en-ubuntu-manualmente.html http://www.server-world.info/en/note?os=Ubuntu_13.04&p=dns&f=1 http://lani78.com/2012/07/22/setting-up-a-dns-for-the-local-network-on-the-ubuntu-12-04-precise-pangolinserver/ http://docs.fedoraproject.org/en-US/Fedora/20/html/Networking_Guide/index.html 3.15.2 Instalacion Ubuntu sudo apt-get install bind9 bind9utils Fedora yum install bind bind-utils bind-chroot systemctl enable named-chroot systemctl start named-chroot 3.15.3 Configuración Red Ubuntu sudo vim /etc/network/interfaces auto eth0 iface eth0 inet static address 192.168.1.10 netmask 255.255.255.0 gateway 192.168.1.1 network 192.168.1.0 broadcast 192.168.1.255 dns-nameservers 127.0.0.1 8.8.4.4 8.8.8.8 dns-search ns1.workspace.local dns-domain workspace.local Fedora Configurar Red 3.15.4 Configuracion Bind Ubuntu sudo vim /etc/bind/named.conf.local 88 Capítulo 3. Linux Documents Documentation, Publicación 0.0.1 zone "workspace.local" IN { type master; file "/etc/bind/db.workspace"; }; zone "1.168.192.in-addr.arpa" IN { type master; file "/etc/bind/db.1.168.192"; }; Fedora vim /etc/named.conf Cambiar al principio: options { listen-on port 53 { 127.0.0.1; 192.168.1.100; }; listen-on-v6 port 53 { ::1; }; directory "/var/named"; dump-file "/var/named/data/cache_dump.db"; statistics-file "/var/named/data/named_stats.txt"; memstatistics-file "/var/named/data/named_mem_stats.txt"; allow-query { localhost; any; }; Insertar entre logging {... y zone "." IN {... zone "workspace.local" IN { type master; file "/var/named/db.workspace"; }; zone "1.168.192.in-addr.arpa" IN { type master; file "/var/named/db.1.168.192"; }; 3.15.5 Ubuntu y Fedora # Ubuntu sudo vim /etc/bind/db.workspace # Fedora vim /var/named/db.workspace ; ; BIND data file for local loopback interface ; $TTL 604800 @ IN SOA workspace.local. root.workspace.local. ( 2 ; Serial 604800 ; Refresh 86400 ; Retry 2419200 ; Expire 604800 ) ; Negative Cache TTL ; 3.15. Bind 89 Documents Documentation, Publicación 0.0.1 ns1 mail www IN IN NS A ns1.workspace.local. 192.168.1.100 IN MX 10 mail.workspace.local. IN IN IN A A A 192.168.1.100 192.168.1.100 192.168.1.100 ; Otras maquinas wsmaq1 IN A 192.168.1.3 # Ubuntu sudo vim /etc/bind/db.1.168.192 # Fedora vim /var/named/db.1.168.192 ; ; BIND reverse data file for local loopback interface ; $TTL 604800 @ IN SOA workspace.local. root.workspace.local. ( 1 ; Serial 604800 ; Refresh 86400 ; Retry 2419200 ; Expire 604800 ) ; Negative Cache TTL ; 100 3 IN NS ns1.workspace.local. IN PTR workspace.local. IN IN PTR PTR ns1.workspace.local. wsmaq1.workspace.local. 3.15.6 Ubuntu chmod -R 755 /etc/bind chown -R bind:bind /etc/bind service bind9 restart 3.15.7 Fedora Firewall systemctl restart named-chroot.service systemctl enable named-chroot.service firewall-cmd --permanent --add-service=dns firewall-cmd --reload 90 Capítulo 3. Linux Documents Documentation, Publicación 0.0.1 3.16 Comando Cat con texto coloreado Desde los repositorios # Fedora/Centos yum install python-pygments # Ubuntu apt-get install python-pygments Con Pip ver Instalacion Python en Ubuntu # Python 2 pip install Pygments # Python 3 pip3 install Pygments Editar ~/.bashrc y añadir alias alias ccat=’pygmentize -g’ 3.17 Comando dd Grabar de una .iso a un cd/pen sudo dd if=Fedora-14-x86_64-Live-KDE.iso of=/dev/sdb Para crear una .iso de un cd/dvd dd if=/dev/lectora of=/home/usuario/Escritorio/dvd.iso 3.18 Comando find find ./ -name ’*.php’ -type f -exec chmod 777 {} \; Con esto busca en el árbol ./ los archivos que contienen .php tipo file y ejecuta chmod 777 a todos los archivos, omitir -name ‘*.php’ para que sean todos los archivos Eliminar recursivamente carpetas con X nombre rm -rf ‘find ./ -type d -name .svn‘ 3.19 Comando setfacl Para poder compartir permisos con 2 usuarios distintos, usar setfacl Por ejemplo, en la carpeta /home/snicoper/public_html/example.com/uploads sudo setfacl -R -m u:snicoper:rwx -m u:apache:rwx ~/public_html/example.com/uploads sudo setfacl -dR -m u:snicoper:rwx -m u:apache:rwx ~/public_html/example.com/uploads De esta manera, tanto apache como snicoper, tendrán permisos rwx 3.16. Comando Cat con texto coloreado 91 Documents Documentation, Publicación 0.0.1 3.20 Comprimir descomprimir desde consola Ficheros tar # Empaquetar: tar -cvf archivo.tar /dir/a/comprimir/ # Desempaquetar: tar -xvf archivo.tar # Ver contenido: tar -tf archivo.tar Ficheros gz #Comprimir: gzip -9 fichero # Descomprimir: gzip -d fichero.gz Ficheros bz2 # Comprimir: bzip fichero # Descomprimir: bzip2 -d fichero.bz2 gzip ó bzip2 sólo comprimen ficheros [no directorios, para eso existe tar]. Para comprimir y archivar al mismo tiempo hay que combinar el tar y el gzip o el bzip2 de la siguiente manera: Ficheros tar.gz # Comprimir: tar -czfv archivo.tar.gz ficheros # Descomprimir: tar -xzvf archivo.tar.gz # Ver contenido: tar -tzf archivo.tar.gz Ficheros tar.bz2 # Comprimir: tar -c ficheros | bzip2 > archivo.tar.bz2 # Descomprimir: bzip2 -dc archivo.tar.bz2 | tar -xv # Ver contenido: bzip2 -dc archivo.tar.bz2 | tar -t Ficheros zip # Comprimir: zip archivo.zip ficheros # Descomprimir: 92 Capítulo 3. Linux Documents Documentation, Publicación 0.0.1 unzip archivo.zip # Ver contenido: unzip -v archivo.zip Ficheros lha # Comprimir: lha -a archivo.lha ficheros # Descomprimir: lha -x archivo.lha # Ver contenido: lha -v archivo.lha # Ver contenido: lha -l archivo.lha Ficheros arj # Comprimir: arj a archivo.arj ficheros # Descomprimir: unarj archivo.arj # Descomprimir: arj -x archivo.arj # Ver contenido: arj -v archivo.arj # Ver contenido: arj -l archivo.arj Ficheros zoo # Comprimir: zoo a archivo.zoo ficheros # Descomprimir: zoo -x archivo.zoo # Ver contenido: zoo -L archivo.zoo # Ver contenido: zoo -v archivo.zoo Ficheros rar # Comprimir: rar -a archivo.rar ficheros # Descomprimir: rar -x archivo.rar # Ver contenido: rar -l archivo.rar # Ver contenido: rar -v archivo.rar 3.20. Comprimir descomprimir desde consola 93 Documents Documentation, Publicación 0.0.1 3.21 Configurar mutt Fuentes http://www.elho.net/mutt/maildir/ # Fedora sudo vim /etc/Muttrc # Linea 1066 set folder="~/Maildir" # Linea 1991 set mask="!^\\.[^.]" # Linea 2003 set mbox="~/Maildir" # Linea 2016 set mbox_type=Maildir # Linea 3017 set postponed="+.Drafts" # Linea 3256 set record="+.Sent" # Linea 4176 set spoolfile="~/Maildir" Para entrar al correo, simplemente mutt 3.22 Comandos Utiles 3.22.1 Fuentes http://www.infognu.com.ar/2013/05/400-comandos-para-gnulinux-que-deberias_3118.html 3.22.2 Información del sistema arch → mostrar la arquitectura de la máquina (1). uname -m → mostrar la arquitectura de la máquina (2). uname -r → mostrar la versión del kernel usado. uname -a → mostrar la información completa. cat /etc/issue → mostrar el nombre de la distribución dmidecode -q → mostrar los componentes (hardware) del sistema. hdparm -i /dev/hda → mostrar las características de un disco duro. hdparm -tT /dev/sda → realizar prueba de lectura en un disco duro. cat /proc/cpuinfo → mostrar información de la CPU. cat /proc/interrupts → mostrar las interrupciones. cat /proc/meminfo → verificar el uso de memoria. cat /proc/swaps → mostrar ficheros swap. 94 Capítulo 3. Linux Documents Documentation, Publicación 0.0.1 cat /proc/version → mostrar la versión del kernel. cat /proc/net/dev → mostrar adaptadores de red y estadísticas. cat /proc/mounts → mostrar el sistema de ficheros montado. lspci -tv → mostrar los dispositivos PCI. lsusb -tv → mostrar los dispositivos USB. lshw → listar el hardware. discover → listar el hardware. date → mostrar la fecha del sistema. cal 2011 → mostrar el almanaque de 2011. cal 07 2011 → mostrar el almanaque para el mes julio de 2011. date 041217002011.00 → colocar (declarar, ajustar) fecha y hora. clock -w → guardar los cambios de fecha en la BIOS. blkid → mostrar información (nombre, etiqueta, UUID, tipo de partición) sobre los dispositivos de bl 3.22.3 Apagar, reiniciar o cerrar sesión shutdown -h now → apagar el sistema (1). init 0 → apagar el sistema (2). telinit 0 → apagar el sistema (3). halt → apagar el sistema (4). shutdown -h hours:minutes & → apagado planificado del sistema. shutdown -c → cancelar un apagado planificado del sistema. shutdown -r now → reiniciar (1). reboot → reiniciar (2). logout → cerrar sesión. skill nombre_de_usuario → cerrar sesión (2) [Es preciso ejecutarlo con privilegios de root] exit → salir del intérprete de comandos (si solo hay uno, equivale a cerrar sesión). 3.22.4 Gestionar archivos y directorios cd → ir al directorio personal. cd /home → cambiar al directorio “/home”. cd .. → retroceder un nivel. cd ../.. → retroceder 2 niveles. cd ~user1 → ir al directorio user1. cd - → ir (regresar) al directorio anterior. pwd → mostrar el camino del directorio actual. ls → listar el contenido de un directorio. ls -F → listar el contenido de un directorio (distinguiendo los directorios con una barra) ls -l → listar el contenido de un directorio, mostrando los detalles. ls -lh → listar el contenido de un directorio, mostrando los detalles (y el tamaño en un formato “hu ls -a → listar el contenido de un directorio, incluendo los ficheros ocultos. ls *[0-9] → listar los ficheros y carpetas que contienen números. ls -laR | less → listar recursivamente el contenido del directorio actual y todos los subdirectorios tree → mostrar los ficheros y carpetas en forma de árbol comenzando por la raíz.(1) lstree → mostrar los ficheros y carpetas en forma de árbol comenzando por la raíz.(2) mkdir dir1 → crear un directorio de nombre ‘dir1. mkdir dir1 dir2 → crear dos directorios a la vez (en la ubicación actual). mkdir -p /tmp/dir1/dir2 → crear una estructura de directorios, si no existe. rm file1 → eliminar el archivo ‘file1. rm -f file1 → eliminar el archivo ‘file1 en modo forzado. rmdir dir1 → borrar el directorio ‘dir1. rm -rf dir1 → eliminar recursivamente y en modo forzado el directorio ‘dir1 con todo lo que contenga rm -rf dir1 dir2 → borrar dos directorios con su contenido de forma recursiva. mv dir1 new_dir → renombrar o mover un fichero o carpeta (directorio). 3.22. Comandos Utiles 95 Documents Documentation, Publicación 0.0.1 cp file1 destino/ → copiar un fichero al destino elegido. cp file1 file2 destino/ → copiar a la vez dos ficheros a un mismo directorio. cp file1 file2 → copiar file1 en file2. cp dir /* . → copiar todos los ficheros de un directorio dentro del directorio de trabajo actual. cp -a /tmp/dir1 . → copiar un directorio dentro del directorio actual de trabajo. cp -a dir1 → copiar un directorio. cp -a dir1 dir2 → copiar dos directorio al unísono. ln -s file1 lnk1 → crear un enlace simbólico al fichero o directorio. ln file1 lnk1 → crear un enlace físico al fichero o directorio. touch file1 → actualizar la fecha de modificación de file1, o crearlo si no existe. touch -t 0712250000 file1 → modificar el tiempo real (tiempo de creación) de un fichero o directorio file file1 → salida (volcado en pantalla) del tipo mime de un fichero texto. iconv -l → listas de cifrados conocidos. iconv -f fromEncoding -t toEncoding inputFile > outputFile → crea una nueva forma del fichero de ent 3.22.5 Encontrar archivos find / -name file1 → buscar fichero y directorio a partir de la raíz del sistema. find / -user user1 → buscar ficheros y directorios pertenecientes al usuario ‘user1. find /home/user1 -name \*.bin → buscar ficheros con extensión ‘. bin’ dentro del directorio ‘/ home/ find /usr/bin -type f -atime +100 → buscar ficheros binarios no usados en los últimos 100 días. find /usr/bin -type f -mtime -10 → buscar ficheros creados o cambiados dentro de los últimos 10 días find / -name \*.rpm -exec chmod 755 ’{}’ \; → buscar ficheros con extensión ‘.rpm’ y modificar permi find . -type f -print0 | xargs -0 chmod 644 → modificar recursivamente los permisos a todos los fich find / -xdev -name \*.rpm → Buscar ficheros con extensión ‘.rpm’ ignorando los dispositivos removibl find . -maxdepth 1 -name *.jpg -print -exec convert ”{}” -resize 80×60 “thumbs/{}” \; → agrupar fich find /tmp/dir1 -depth -regextype posix-extended -regex ’.*(\s+|:+|\\+|>+|<+|”+|\*+|\?+|\|+).*’ -execd locate \*.ps → encuentra ficheros con extensión ‘.ps’ ejecutados primeramente con el command ‘update whereis halt → mostrar la ubicación de un fichero binario, de ayuda o fuente. En este caso pregunta which comando → mostrar la ruta completa a un comando. 3.22.6 Montando un sistema de ficheros mount /dev/hda2 /mnt/hda2 → montar un disco llamado hda2. Verifique primero la existencia del direct umount /dev/hda2 → desmontar un disco llamado hda2. (Antes es necesario salir del punto ‘/mnt/hda2. fuser -km /mnt/hda2 → forzar el desmontaje cuando el dispositivo está ocupado. umount -n /mnt/hda2 → correr el desmontaje sin leer el fichero /etc/mtab. Útil cuando el fichero es mount /dev/fd0 /mnt/floppy → montar un disco flexible (floppy). mount /dev/cdrom /mnt/cdrom → montar un cdrom / dvdrom. mount /dev/hdc /mnt/cdrecorder → montar un cd regrabable o un dvdrom. mount /dev/hdb /mnt/cdrecorder → montar un cd regrabable / dvdrom (un dvd). mount -t udf,iso9660 -o loop file.iso /mnt/cdrom → montar un fichero de imagen de un medio óptico (c mount -t vfat /dev/hda5 /mnt/hda5 → montar un sistema de ficheros FAT32. mount -t ntfs-3g /dev/hda5 /mnt/hda5 → montar un sistema de ficheros NTFS. mount /dev/sda1 /mnt/usbdisk → montar un usb pen-drive o una memoria (sin especificar el tipo de sis 3.22.7 Espacio en disco df ls du du du 96 -h → mostrar una lista de las particiones montadas. -lSr | more → mostrar el tamaño de los ficheros y directorios ordenados por tamaño. -sh dir1 → Estimar el espacio usado por el directorio ‘dir1. -h --max-depth=1 | sort -nr → mostrar en orden descendente el tamaño de todos los subdirectorios -sk * | sort -rn → mostrar el tamaño de los ficheros y directorios ordenados por tamaño. Capítulo 3. Linux Documents Documentation, Publicación 0.0.1 rpm -q -a --qf ’%10{SIZE}t%{NAME}n’ | sort -k1,1n → mostrar el espacio usado por los paquetes rpm in dpkg-query -W -f=’${Package}\t${Installed-Size}\n’ | sort -k 2 -nr | grep -v deinstall | head -n 25 | 3.22.8 Usuarios y grupos groupadd nombre_del_grupo → crear un nuevo grupo. groupdel nombre_del_grupo → borrar un grupo. groupmod -n nuevo_nombre_del_grupo viejo_nombre_del_grupo → renombrar un grupo. useradd -c “Name Surname ” -g admin -d /home/user1 -s /bin/bash user1 → Crear un nuevo usuario perte useradd user1 → crear un nuevo usuario. userdel -r user1 → borrar un usuario (‘-r’ elimina el directorio Home). usermod -c “User FTP” -g system -d /ftp/user1 -s /bin/nologin user1 → cambiar los atributos del usua usermod -aG sudoers,plugdev user1 → agregar el usuario user1 a dos grupos existentes, para increment passwd → cambiar contraseña. passwd user1 → cambiar la contraseña de un usuario (solamente por root). chage -E 2011-12-31 user1 → colocar un plazo para la contraseña del usuario. En este caso dice que l pwck → chequear la sintaxis correcta el formato de fichero de ‘/etc/passwd’ y la existencia de usuar grpck → chequear la sintaxis correcta y el formato del fichero ‘/etc/group’ y la existencia de grupo newgrp group_name → registra a un nuevo grupo para cambiar el grupo predeterminado de los ficheros c 3.22.9 Permisos en ficheros (usar “+” para colocar permisos y “-” para eliminar) ls -lh → Mostrar permisos. ls /tmp | pr -T5 -W$COLUMNS → dividir la terminal en 5 columnas. chmod ugo+rwx directory1 → colocar permisos de lectura ®, escritura (w) y ejecución(x) al propietari chmod go-rwx directory1 → quitar permiso de lectura ®, escritura (w) y (x) ejecución al grupo (g) y chown user1 file1 → cambiar el dueño de un fichero. chown -R user1 directory1 → cambiar el propietario de un directorio y de todos los ficheros y direct chgrp group1 file1 → cambiar grupo de ficheros. chown user1:group1 file1 → cambiar usuario y el grupo propietario de un fichero. find / -perm -u+s → visualizar todos los ficheros del sistema con SUID configurado. chmod u+s /bin/file1 → colocar el bit SUID en un fichero binario. El usuario que corriendo ese fiche chmod u-s /bin/file1 → deshabilitar el bit SUID en un fichero binario. chmod g+s /home/public → colocar un bit SGID en un directorio -similar al SUID pero por directorio. chmod g-s /home/public → desabilitar un bit SGID en un directorio. chmod o+t /home/public → colocar un bit STIKY en un directorio. Permite el borrado de ficheros solam chmod o-t /home/public → desabilitar un bit STIKY en un directorio. 3.22.10 Atributos especiales en ficheros (usar “+” para colocar permisos y “-” para eliminar) chattr chattr chattr chattr chattr chattr chattr lsattr +a +c +d +i +s +S +u → file1 → permite escribir abriendo un fichero solamente modo append. file1 → permite que un fichero sea comprimido / descomprimido automaticamente. file1 → asegura que el programa ignore borrar los ficheros durante la copia de seguridad. file1 → convierte el fichero en inmutable o invariable, por lo que no puede ser eliminado, file1 → permite que un fichero sea borrado de forma segura. file1 → asegura que un fichero sea modificado, los cambios son escritos en modo synchronou file1 → te permite recuperar el contenido de un fichero aún si este está cancelado. mostrar atributos especiales. 3.22. Comandos Utiles 97 Documents Documentation, Publicación 0.0.1 3.22.11 Archivos y ficheros comprimidos 7za a -mx=9 -ms=on -mhe=on -p archivocomprimido directorio1 archivo1 archivo2 → comprimir un directo 7za x archivocomprimido.7z → extraer un archivo comprimido en 7zip (7zip también permite descomprimi bunzip2 file1.bz2 → descomprime in fichero llamado ‘file1.bz2. bzip2 file1 → comprime un fichero llamado ‘file1. gunzip file1.gz → descomprime un fichero llamado ‘file1.gz’. gzip file1 → comprime un fichero llamado ‘file1. gzip -9 file1 → comprime con compresión máxima. rar a file1.rar test_file → crear un fichero rar llamado ‘file1.rar’. rar a file1.rar file1 file2 dir1 → comprimir ‘file1, ‘file2 y ‘dir1 simultáneamente. rar x file1.rar → descomprimir archivo rar. unrar x file1.rar → descomprimir archivo rar. tar -cvf archive.tar file1 → crear un tarball descomprimido. tar -cvf archive.tar file1 file2 dir1 → crear un archivo conteniendo ‘file1, ‘file2 y’dir1. tar -tf archive.tar → mostrar los contenidos de un archivo. tar -xvf archive.tar → extraer un tarball (si el archivo además está comprimido con gzip, bzip2 o xz tar -xvf archive.tar -C /tmp → extraer un tarball en /tmp. tar -cjvf archive.tar.bz2 dir1 → crear un tarball comprimido en bzip2. tar -xjvf archive.tar.bz2 → descomprimir un archivo tar comprimido en bzip2 tar -cJvf archive.tar.xz dir1 → crear un tarball comprimido en xz. XZ_OPT=-9e tar -cJvf archive.tar.xz dir1 → crear un tarball comprimido en xz (con máxima compresión) tar -xJvf archive.tar.xz → descomprimir un archivo tar comprimido en xz. tar -czvf archive.tar.gz dir1 → crear un tarball comprimido en gzip. GZIP=-9 tar -czvf archive.tar.gz dir1 → crear un tarball comprimido en gzip (con máxima compresión). tar -xzvf archive.tar.gz → descomprimir un archive tar comprimido en gzip. zip file1.zip file1 → crear un archivo comprimido en zip. zip -r file1.zip file1 file2 dir1 → comprimir, en zip, varios archivos y directorios de forma simult unzip file1.zip → descomprimir un archivo zip. 3.22.12 Paquetes rpm (Red Hat, Fedora y similares) rpm -ivh package.rpm → instalar un paquete rpm. rpm -ivh --nodeeps package.rpm → instalar un paquete rpm ignorando las peticiones de dependencias. rpm -U package.rpm → actualizar un paquete rpm sin cambiar la configuración de los ficheros. rpm -F package.rpm → actualizar un paquete rpm solamente si este está instalado. rpm -e package_name.rpm → eliminar un paquete rpm. rpm -qa → mostrar todos los paquetes rpm instalados en el sistema. rpm -qa | grep httpd → mostrar todos los paquetes rpm con el nombre “httpd”. rpm -qi package_name → obtener información en un paquete específico instalado. rpm -qg “System Environment/Daemons” → mostar los paquetes rpm de un grupo software. rpm -ql package_name → mostrar lista de ficheros dados por un paquete rpm instalado. rpm -qc package_name → mostrar lista de configuración de ficheros dados por un paquete rpm instalado rpm -q package_name --whatrequires → mostrar lista de dependencias solicitada para un paquete rpm. rpm -q package_name --whatprovides → mostar la capacidad dada por un paquete rpm. rpm -q package_name --scripts → mostrar los scripts comenzados durante la instalación /eliminación. rpm -q package_name --changelog → mostar el historial de revisions de un paquete rpm. rpm -qf /etc/httpd/conf/httpd.conf → verificar cuál paquete rpm pertenece a un fichero dado. rpm -qp package.rpm -l → mostrar lista de ficheros dados por un paquete rpm que aún no ha sido insta rpm --import /media/cdrom/RPM-GPG-KEY → importar la firma digital de la llave pública. rpm --checksig package.rpm → verificar la integridad de un paquete rpm. rpm -qa gpg-pubkey → verificar la integridad de todos los paquetes rpm instalados. rpm -V package_name → chequear el tamaño del fichero, licencias, tipos, dueño, grupo, chequeo de res rpm -Va → chequear todos los paquetes rpm instalados en el sistema. Usar con cuidado. rpm -Vp package.rpm → verificar un paquete rpm no instalado todavía. rpm2cpio package.rpm | cpio --extract --make-directories *bin → extraer fichero ejecutable desde un 98 Capítulo 3. Linux Documents Documentation, Publicación 0.0.1 rpm -ivh /usr/src/redhat/RPMS/‘arch‘/package.rpm → instalar un paquete construido desde una fuente r rpmbuild --rebuild package_name.src.rpm → construir un paquete rpm desde una fuente rpm. 3.22.13 Actualizador de paquetes yum (Fedora, Redhat y otros) yum yum yum yum yum yum yum yum yum yum install package_name → descargar e instalar un paquete rpm. localinstall package_name.rpm → este instalará un RPM y tratará de resolver todas las dependenci update package_name.rpm → actualizar todos los paquetes rpm instalados en el sistema. update package_name → modernizar / actualizar un paquete rpm. remove package_name → eliminar un paquete rpm. list → listar todos los paquetes instalados en el sistema. search package_name → Encontrar un paquete en repositorio rpm. clean packages → limpiar un caché rpm borrando los paquetes descargados. clean headers → eliminar todos los ficheros de encabezamiento que el sistema usa para resolver l clean all → eliminar desde los paquetes caché y ficheros de encabezado. 3.22.14 Paquetes deb (Debian, Ubuntu y otros) dpkg dpkg dpkg dpkg dpkg dpkg dpkg dpkg -i package.deb → instalar / actualizar un paquete deb. -r package_name → eliminar un paquete deb del sistema. -l → mostrar todos los paquetes deb instalados en el sistema. -l | grep httpd → mostrar todos los paquetes deb con el nombre “httpd” -s package_name → obtener información en un paquete específico instalado en el sistema. -L package_name → mostar lista de ficheros dados por un paquete instalado en el sistema. --contents package.deb → mostrar lista de ficheros dados por un paquete no instalado todavía. -S /bin/ping → verificar cuál paquete pertenece a un fichero dado. 3.22.15 Actualizador de paquetes apt (Debian, Ubuntu y otros) apt-get install package_name → instalar / actualizar un paquete deb. apt-cdrom install package_name → instalar / actualizar un paquete deb desde un cdrom. apt-get update → actualizar la lista de paquetes. apt-get upgrade → actualizar todos los paquetes instalados. apt-get remove package_name → eliminar un paquete deb del sistema. apt-get check → verificar la correcta resolución de las dependencias. apt-get clean → limpiar cache desde los paquetes descargados. apt-cache search searched-package → retorna lista de paquetes que corresponde a la serie «paquetes b 3.22.16 Ver el contenido de un fichero cat file1 → ver los contenidos de un fichero comenzando desde la primera hilera. tac file1 → ver los contenidos de un fichero comenzando desde la última línea. more file1 → ver el contenido a lo largo de un fichero. less file1 → parecido al commando ‘more’ pero permite salvar el movimiento en el fichero así como el head -2 file1 → ver las dos primeras líneas de un fichero. tail -2 file1 → ver las dos últimas líneas de un fichero. tail -f /var/log/messages → ver en tiempo real qué ha sido añadido al fichero. 3.22. Comandos Utiles 99 Documents Documentation, Publicación 0.0.1 3.22.17 Manipulación de texto cat file1 file2 ... | command <> file1_in.txt_or_file1_out.txt → sintaxis general para la manipulaci cat file1 | command( sed, grep, awk, grep, etc...) > result.txt → sintaxis general para manipular un cat file1 | command( sed, grep, awk, grep, etc...) » result.txt → sintaxis general para manipular un grep Aug /var/log/messages → buscar palabras “Aug” en el fichero ‘/var/log/messages’. grep ^Aug /var/log/messages → buscar palabras que comienzan con “Aug” en fichero ‘/var/log/messages’ grep [0-9] /var/log/messages → seleccionar todas las líneas del fichero ‘/var/log/messages’ que cont grep Aug -R /var/log/ → buscar la cadena “Aug” en el directorio ‘/var/log’ y debajo. sed ’s/string1/string2/g’ ejemplo.txt → reemplazar en ejemplo.txt todas las ocurrencias de “string1” sed ’/^$/d’ ejemplo.txt → eliminar todas las líneas en blanco desde el ejemplo.txt sed ’/ *#/d; /^$/d’ ejemplo.txt → eliminar comentarios y líneas en blanco de ejemplo.txt echo ’ejemplo’ | tr ’[:lower:]’ ’[:upper:]‘ → convertir “ejemplo” de minúsculas a mayúsculas. sed -e ’1d’ ejemplo.txt → elimina la primera línea del fichero ejemplo.txt sed -n ’/string1/p‘ → visualizar solamente las líneas que contienen la palabra “string1”. 3.22.18 Establecer caracter y conversión de ficheros dos2unix filedos.txt fileunix.txt → convertir un formato de fichero texto desde MSDOS a UNIX. unix2dos fileunix.txt filedos.txt → convertir un formato de fichero de texto desde UNIX a MSDOS. recode ..HTML < page.txt > page.html → convertir un fichero de texto en html. recode -l | more → mostrar todas las conversiones de formato disponibles. 3.22.19 Análisis del sistema de ficheros badblocks -v /dev/hda1 → Chequear los bloques defectuosos en el disco hda1. fsck /dev/hda1 → reparar / chequear la integridad del fichero del sistema Linux en el disco hda1. fsck.ext2 /dev/hda1 → reparar / chequear la integridad del fichero del sistema ext 2 en el disco hda e2fsck /dev/hda1 → reparar / chequear la integridad del fichero del sistema ext 2 en el disco hda1. e2fsck -j /dev/hda1 → reparar / chequear la integridad del fichero del sistema ext 3 en el disco hda fsck.ext3 /dev/hda1 → reparar / chequear la integridad del fichero del sistema ext 3 en el disco hda fsck.vfat /dev/hda1 → reparar / chequear la integridad del fichero sistema fat en el disco hda1. fsck.msdos /dev/hda1 → reparar / chequear la integridad de un fichero del sistema dos en el disco hd dosfsck /dev/hda1 → reparar / chequear la integridad de un fichero del sistema dos en el disco hda1. 3.22.20 Formatear un sistema de ficheros mkfs /dev/hda1 → crear un fichero de sistema tipo Linux en la partición hda1. mke2fs /dev/hda1 → crear un fichero de sistema tipo Linux ext 2 en hda1. mke2fs -j /dev/hda1 → crear un fichero de sistema tipo Linux ext3 (periódico) en la partición hda1. mkfs -t vfat 32 -F /dev/hda1 → crear un fichero de sistema FAT32 en hda1. fdformat -n /dev/fd0 → formatear un disco flooply. mkswap /dev/hda3 → crear un fichero de sistema swap. 3.22.21 Partición de sistema swap mkswap /dev/hda3 → crear fichero de sistema swap. swapon /dev/hda3 → activando una nueva partición swap. swapon /dev/hda2 /dev/hdb3 → activar dos particiones swap. 100 Capítulo 3. Linux Documents Documentation, Publicación 0.0.1 3.22.22 Salvas dump -0aj -f /tmp/home0.bak /home → hacer una salva completa del directorio ‘/home’. dump -1aj -f /tmp/home0.bak /home → hacer una salva incremental del directorio ‘/home’. restore -if /tmp/home0.bak → restaurando una salva interactivamente. rsync -rogpav --delete /home /tmp → sincronización entre directorios. rsync -rogpav -e ssh --delete /home ip_address:/tmp → rsync a través del túnelSSH. rsync -az -e ssh --delete ip_addr:/home/public /home/local → sincronizar un directorio local con un rsync -az -e ssh --delete /home/local ip_addr:/home/public → sincronizar un directorio remoto con un dd bs=1M if=/dev/hda | gzip | ssh user@ip_addr ’dd of=hda.gz‘ → hacer una salva de un disco duro en dd if=/dev/sda of=/tmp/file1 → salvar el contenido de un disco duro a un fichero. (En este caso el d tar -Puf backup.tar /home/user → hacer una salva incremental del directorio ‘/home/user’. tar -czv --exclude=/root/dir1/* -f /var/salvas/cfg_$(date +%F_%H%M).tgz /etc /root → salvar los dire ( cd /tmp/local/ && tar c . ) | ssh -C user@ip_addr ’cd /home/share/ && tar x -p‘ → copiar el conten ( tar c /home ) | ssh -C user@ip_addr ’cd /home/backup-home && tar x -p‘ → copiar un directorio loca tar cf - . | (cd /tmp/backup ; tar xf - ) → copia local conservando las licencias y enlaces desde un find /home/user1 -name ’*.txt’ | xargs cp -av --target-directory=/home/backup/ --parents → encontrar find /var/log -name ’*.log’ | tar cv --files-from=- | bzip2 > log.tar.bz2→ encontrar todos los fiche dd if=/dev/hda of=/dev/fd0 bs=512 count=1 → hacer una copia del MRB (Master Boot Record) a un disco dd if=/dev/fd0 of=/dev/hda bs=512 count=1 → restaurar la copia del MBR (Master Boot Record) salvada 3.22.23 CDROM cdrecord -v gracetime=2 dev=/dev/cdrom -eject blank=fast -force → limpiar o borrar un cd regrabable. mkisofs /dev/cdrom > cd.iso → crear una imagen iso de cdrom en disco. mkisofs /dev/cdrom | gzip > cd_iso.gz → crear una imagen comprimida iso de cdrom en disco. mkisofs -J -allow-leading-dots -R -V “Label CD” -iso-level 4 -o ./cd.iso data_cd → crear una imagen cdrecord -v dev=/dev/cdrom cd.iso → quemar una imagen iso. gzip -dc cd_iso.gz | cdrecord dev=/dev/cdrom - → quemar una imagen iso comprimida. mount -t udf,iso9660 -o loop cd.iso /mnt/iso → montar una imagen iso. cd-paranoia -B → llevar canciones de un cd a ficheros wav. cd-paranoia -- ”-3” → llevar las 3 primeras canciones de un cd a ficheros wav. cdrecord --scanbus → escanear bus para identificar el canal scsi. dd if=/dev/hdc | md5sum → hacer funcionar un md5sum en un dispositivo, como un CD. eject -v → expulsar un medio o disco extraíble, ofreciendo información adicional. 3.22.24 Trabajo con la red (LAN Y WIFI) ifconfig eth0 → mostrar la configuración de una tarjeta de red Ethernet. ifup eth0 → activar una interface ‘eth0. ifdown eth0 → deshabilitar una interface ‘eth0. ifconfig eth0 192.168.1.1 netmask 255.255.255.0 → configurar una dirección IP. ifconfig eth0 promisc → configurar ‘eth0en modo común para obtener los paquetes (sniffing). dhclient eth0 → activar la interface ‘eth0 en modo dhcp. route -n → mostrar mesa de recorrido. route add -net 0/0 gw IP_Gateway → configurar entrada predeterminada. route add -net 192.168.0.0 netmask 255.255.0.0 gw 192.168.1.1 → configurar ruta estática para buscar route del 0/0 gw IP_gateway → eliminar la ruta estática. echo “1” > /proc/sys/net/ipv4/ip_forward → activar el recorrido ip. hostname → mostrar el nombre del host del sistema. host www.example.com → buscar el nombre del host para resolver el nombre a una dirección ip(1). nslookup www.example.com → buscar el nombre del host para resolver el nombre a una direccióm ip y vi ip link show → mostar el estado de enlace de todas las interfaces. mii-tool eth0 → mostar el estado de enlace de ‘eth0. ethtool eth0 → mostrar las estadísticas de tarjeta de red ‘eth0. 3.22. Comandos Utiles 101 Documents Documentation, Publicación 0.0.1 netstat -tup → mostrar todas las conexiones de red activas y sus PID. netstat -tupl → mostrar todos los servicios de escucha de red en el sistema y sus PID. netstat -punta → mostrar todas las conexiones activas por dirección IP y puerto. tcpdump tcp port 80 → mostrar todo el tráfico HTTP. iwlist scan → mostrar las redes inalámbricas. iwconfig eth1 → mostrar la configuración de una tarjeta de red inalámbrica. whois www.example.com → buscar en base de datos Whois. iftop -nNP -i eth0 → mostrar en tiempo real las conexiones abiertas en eth0 y su tasa de transferenc sockstat → mostrar información sobre las conexiones abiertas. arp-scan -l → descubrir en la red las direcciones IP y MAC. 3.22.25 Redes de Microsoft Windows (Samba) nbtscan ip_addr → resolución de nombre de red bios. nmblookup -A ip_addr → resolución de nombre de red bios. smbclient -L ip_addr/hostname → mostrar acciones remotas de un host en windows. 3.22.26 Cortafuegos (iptables) iptables -t filter -L → mostrar todas las cadenas de la tabla de filtro. iptables -t nat -L → mostrar todas las cadenas de la tabla nat. iptables -t filter -F → limpiar todas las reglas de la tabla de filtro. iptables -t nat -F → limpiar todas las reglas de la tabla nat. iptables -t filter -X → borrar cualquier cadena creada por el usuario. iptables -t filter -A INPUT -p tcp --dport telnet -j ACCEPT → permitir las conexiones telnet para en iptables -t filter -A OUTPUT -p tcp --dport http -j DROP → bloquear las conexiones HTTP para salir. iptables -t filter -A FORWARD -p tcp --dport pop3 -j ACCEPT → permitir las conexiones POP a una cade iptables -t filter -A INPUT -p tcp -m multiport --dports 80,443,8080 -m state --state NEW -m limit -iptables -t filter -A INPUT -p tcp -m multiport --dports 80,443,8080 -m state --state ESTABLISHED,REL iptables -t filter -A INPUT -j LOG --log-prefix “DROP INPUT” → registrando una cadena de entrada. iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE → configurar un PAT (Puerto de traducción de di iptables -t nat -A POSTROUTING -s 192.168.0.127 -o eth0 -j SNAT --to-source 169.158.158.169 → enruta iptables -t nat -A PREROUTING -d 192.168.0.1 -p tcp -m tcp --dport 22 -j DNAT --to-destination 10.0.0 iptables -t nat -S → Listar todas las reglas activas en la tabla nat. iptables-save -c > archivo → Salvar las reglas en un archivo (incluyendo los contadores de paquetes iptables-restore -c < archivo → Restaurar las reglas desde un archivo (incluyendo los contadores de 3.22.27 Monitoreando y depurando top → mostrar las tareas de linux usando la mayoría cpu. htop → mostrar y gestionar las tareas con una interfaz amistosa. ps -eafw → muestra las tareas Linux. ps -e -o pid,args --forest → muestra las tareas Linux en un modo jerárquico. ps aux | grep -i wget → listar todas las tareas activas que incluyen el comando wget (sintaxis BSD). pstree → mostrar un árbol sistema de procesos. kill -9 ID_Processo → forzar el cierre de un proceso y terminarlo. kill -1 ID_Processo → forzar un proceso para recargar la configuración. killall Nombre_Proceso → terminar un proceso por el nombre del comando y no por el ID. lsof -p $$ → mostrar una lista de ficheros abiertos por procesos. lsof /home/user1 → muestra una lista de ficheros abiertos en un camino dado del sistema. strace -c ls >/dev/null → mostrar las llamadas del sistema hechas y recibidas por un proceso. strace -f -e open ls >/dev/null → mostrar las llamadas a la biblioteca. watch -n1 ’cat /proc/interrupts‘ → mostrar interrupciones en tiempo real. 102 Capítulo 3. Linux Documents Documentation, Publicación 0.0.1 last reboot → mostrar historial de reinicio. lsmod → mostrar el kernel cargado. free -m → muestra el estado de la RAM en megabytes. smartctl -A /dev/hda → monitorear la fiabilidad de un disco duro a través de SMART. smartctl -i /dev/hda → chequear si SMART está activado en un disco duro. tail /var/log/dmesg → mostrar eventos inherentes al proceso de carga del kernel. tail /var/log/messages → mostrar los eventos del sistema. multitail --follow-all /var/log/dmesg /var/log/messages → mostrar dos registros de eventos en una mi 3.22.28 Otros comandos útiles apropos palabraclave → mostrar una lista de comandos que pertenecen a las palabras claves de un prog man ping → mostrar las páginas del manual on-line; por ejemplo, en un comando ping, usar la opción ‘ man -t ping | ps2pdf - ping.pdf → convertir las páginas del manual del comando ping en un archivo pd mkbootdisk --device /dev/fd0 ‘uname -r‘ → crear un floppy boteable. gpg -c file1 → codificar un fichero con guardia de seguridad GNU. gpg file1.gpg → decodificar un fichero con Guardia de seguridad GNU. wget -r www.example.com → descargar un sitio web completo. wget -c www.example.com/file.iso → descargar un fichero con la posibilidad de parar la descargar y r echo ’wget -c www.example.com/files.iso’ | at 09:00 → Comenzar una descarga a cualquier hora. En est ldd /usr/bin/ssh → mostrar las bibliotecas compartidas requeridas por el programa ssh. alias hh=’history‘ → colocar un alias para un commando -hh= Historial. chsh → cambiar el comando Shell. chsh --list-shells → es un comando adecuado para saber si tienes que hacer remoto en otra terminal. who -a → mostrar quien está registrado, e imprimir hora del último sistema de importación, procesos echo “128*1024*1024” | bc → calcular desde la consola el tamaño en bytes de 128MiB. sudo !! → ejecutar como superusuario el último comando tecleado. clear → limpiar la pantalla. uncomando > archivodesalida.txt 2>&1 → ejecuta un comando y redirige la salida a un archivo, combina uncomando | tee archivodesalida.txt → ejecuta un comando, muestra la salida en la pantalla y simultá 3.23 Contar lineas de un proyecto 3.23.1 sloccount yum install sloccount cd project/root/ sloccount . 3.23.2 cloc yum install cloc 3.24 Crear grupos y añadir usuarios a grupos Crear un grupo 3.23. Contar lineas de un proyecto 103 Documents Documentation, Publicación 0.0.1 goupadd nombre_grupo Crear un usuario que pertenezca a un grupo, entre () es un ejemplo. adduser -c "Comentario (Git users)" -g nombre_grupo (git) nombre_usuario passwd nombre_usuario Otra manera de añadir a un usuario seria adduser nombre_usuario passwd nombre_usuario usermod -a -G nombre_grupo nombre_usuario 3.25 Diferencias entre adduser y useradd No es lo mismo “adduser” que “useradd”, ambos dan de alta usuarios pero el primero es para generar estructura y el otro no. adduser es para usuarios humanos. useradd es para usuarios de sistema. 3.26 Instalar Dropbox 3.26.1 GNOME Advertencia: Posiblemente des-actualizado su yum install -y wget Addition yum repo file from Dropbox wget http://dl.dropbox.com/u/30876345/repo/dropbox.repo mv dropbox.repo /etc/yum.repos.d Install Dropbox yum install -y nautilus-dropbox 3.26.2 KDE cd ~ && wget -O - "https://www.dropbox.com/download?plat=lnx.x86_64" | tar xzf - Autoarranque al iniciar en el sistema ln -s .dropbox-dist/dropboxd .kde/Autostart/dropboxd Iniciar por primera vez 104 Capítulo 3. Linux Documents Documentation, Publicación 0.0.1 ~/.dropbox-dist/dropboxd & Nota: No recuerdo si había que ponerlo en inicio de sesión o no 3.27 Formatear discos con mkfs Prudencia: Cuidado con estos comando que pueden ser peligrosos, asegurarse de poner bien las particiones con las que se quiere operar. Desmontar la partición umount /dev/sdb? 3.27.1 FAT mkfs.vfat /dev/sdb1 # Lo deja en fat-16? mkfs.vfat -n pen4 -F 32 /dev/sdb1 # -n para label 3.27.2 Ext2, 3, 4 mkfs -t ext? /dev/sdb? 3.27.3 Swap mkswap /dev/sdb? btrfs mkfs.btrfs -f /dev/sdb? Poner label en una partición e2label /dev/sda5 nombre_label 3.28 Generar clave para SSH ssh-keygen -t rsa La carpeta ~/.ssh debe tener permisos 700 y los archivos de dentro de ~/.ssh han de ser de 600 chmod 700 ~/.ssh chmod 600 ~/.ssh/* 3.27. Formatear discos con mkfs 105 Documents Documentation, Publicación 0.0.1 3.29 Instalación de Memcached 3.29.1 Fedora yum -y install memcached systemctl enable memcached.service systemctl start memcached.service Para editar la configuración vim /etc/sysconfig/memcached 3.29.2 Ubuntu sudo apt-get install memcached libmemcached-tools Para editar la configuración sudo vim /etc/memcached.conf 3.30 Instalación MongoDb 3.30.1 Fedora yum install mongodb mongodb-server 3.30.2 Ubuntu sudo apt-get install mongodb mongodb-server 3.31 Instalación NodeJS 3.31.1 Instalación Fedora sudo yum install nodejs npm Ubuntu sudo apt-get install nodejs npm nodejs-legacy 106 Capítulo 3. Linux Documents Documentation, Publicación 0.0.1 3.31.2 Algunos programas less sudo npm install less -g para usar: lessc archivo.less > archivo.css typescript sudo npm install typescript -g para transformar: tsc helloworld.ts yuicompressor sudo npm install yuicompressor -g 3.32 Mi bashrc 3.32.1 Usuario vim ~/.bashrc alias alias alias alias alias ll=’ls -lF’ la=’ls -a’ lla=’ll -a’ statc=’stat -c %a’ ccat=’pygmentize -g’ # Git function git_branch { git branch --no-color 2> /dev/null | sed -e ’/^[^*]/d’ -e ’s/* \(.*\)/(\1) /’ } PS1=’\[\e[0;32m\]\u@\[\e[m\]\[\e[0;32m\]\h\[\e[m\] \[\e[1;34m\]\w\[\e[m\] \[\e[1;32m\]\n\[\033[0;32m\ 3.32.2 root sudo vim /root/.bashrc alias alias alias alias alias ll=’ls -lF’ la=’ls -a’ lla=’ll -a’ statc=’stat -c %a’ ccat=’pygmentize -g’ # Git function git_branch { git branch --no-color 2> /dev/null | sed -e ’/^[^*]/d’ -e ’s/* \(.*\)/(\1) /’ } 3.32. Mi bashrc 107 Documents Documentation, Publicación 0.0.1 PS1=’\[\e[0;31m\]\u@\[\e[m\]\[\e[0;31m\]\h\[\e[m\] \[\e[1;34m\]\w\[\e[m\] \[\e[0;31m\]\n\[\033[0;32m\ 3.33 Mostrar Imagenes BIN, ISO, CUE, etc. 3.33.1 Fuente: http://bronch.wordpress.com/2006/05/24/como-montar-archivos-iso-bin-mdf-y-nrg-en-linux/ Nota: [ Créditos: este “howto” está basado en parte en las instrucciones que da Rodrigo Perez en este post aunque no he incluido algunos de sus métodos porque no los he probado personalmente. Además se ha utilizado información encontrada en los foros de Ubuntu-es.org así como en la Guia-Ubuntu -versión Breezy-. Para los archivos IMG se ha usado la información encontrada en este foro. Las instrucciones para convertir imágenes DAA las encontré en esta guía que además incluye otras instrucciones para manipular archivos DAA.) Linux tiene la posibilidad de montar las imágenes de cd/dvd sin tener que grabarlas. Asumiremos que usas una distribución que usa “apt” para instalar y actualizar paquetes, este es el caso de debian, ubuntu, suse,etc. Asumiremos también que sabes como crear directorios y que sabes qué es “montar” un sistema de ficheros. Vamos al grano. Con unos cuantos comandos de consola podremos montar distintos tipos de imágenes de CD/DVD fácilmente: 3.33.2 Lo más básico, montar una imagen ISO: sudo mount -t iso9660 -o loop archivo.iso /directorio/de/montaje 3.33.3 Montando imágenes BIN y CUE: Para poder montar estos archivos necesitas convertirlos antes a imagen ISO, esto lo puedes hacer con el programa bchunk. (Si no tienes instalado bchunk) sudo apt-get install bchunk Nota: si así no puedes instalarlo puede encontrar el programa aqui : bchunk y cuando se haya instalado procederemos a convertir la imagen bin con su archivo cue correspondiente a un solo archivo iso: bchunk archivo.bin archivo.cue nuevonombre.iso Ahora ya tendrás un nuevo archivo iso que podrás montar como se explica más arriba. 3.33.4 Montar imágenes NRG (imágenes de Nero Burning Rom): Las imagenes NRG pueden ser montadas directamente sin necesidad de convertirlas: mount -t iso9660 -o loop,offset=307200 imagen.nrg /directorio/de/montaje Si tienes algún problema con ese método o deseas convertir la imagen NRG a ISO deberás usar el programa nrg2iso, para instalarlo haremos: 108 Capítulo 3. Linux Documents Documentation, Publicación 0.0.1 sudo apt-get install nrg2iso si así no puedes instalarlo puede encontrar el programa aquí: Nrg2Iso y cuando ya esté instalado, para convertir la imagen nrg2iso archivo.nrg nuevoarchivo.iso y para montar la imagen ISO simplemente debes seguir las instrucciones detalladas más arriba 3.33.5 Montar imágenes MDF y MDS De nuevo utilizaremos un programa para convertir antes la imagen mdf a iso. El programa tiene el original nombre de mdf2iso. Para instalarlo: sudo apt-get install mdf2iso si así no puedes instalarlo puede encontrar el programa aquí: Mdf2Iso) y una vez instalado convertiremos el archivo MDF a ISO mdf2iso archivo.mdf nuevaimagen.iso 3.33.6 Montar imágenes IMG Usaremos el programa CCD2ISO. Este programa no lo he podido descargar desde los repositorios oficiales de Ubuntu pero de todos modos no estaría de más que intentases instalarlo por apt-get así: sudo apt-get install ccd2iso Si de este modo no puedes instalarlo puedes seguir las instrucciones de esta página para bajar el paquete deb de ccd2iso e instalarlo facilmente. Si por cualquier motivo no pudieses conseguir el programa por esos dos métodos siempre puedes descargarlo desde su página: ir a Ccd2Iso (ojo, tendrás que compilarlo) Para instalarlo de este último modo descargamos el archivo que sera algo así como “ccd2iso-0.2.tar.gz” (puede variar la versión) y primero lo descomprimimos así: tar -xzvf ccd2iso-0.2.tar.gz Ahora que tendremos una carpeta llamada “ccd2iso”, hacemos lo siguiente: cd ccd2iso ./configure make make install Con esto ya tendremos instalado el programa ccd2iso. Finalmente para convertir la imagen ccd a iso hacemos: ccd2iso imagen.img imagen.iso Y montaremos la imagen iso recien creada como se explica más arriba en esta misma guía. 3.33. Mostrar Imagenes BIN, ISO, CUE, etc. 109 Documents Documentation, Publicación 0.0.1 3.33.7 Montar imágenes DAA El formato DAA es un formato que utiliza el programa Poweriso. Durante algún tiempo este formato resultaba muy dificil de utilizar en Linux (no había versión de Poweriso para linux y la emulación con wine no funcionaba). Finalmente los creadores del programa sacaron una versión gratuita de su programa para Linux que además nos sirve para convertir otros formatos. Pero vamos al grano, para convertir una imagen DAA a ISO primero necesitaremos la versión linux de poweriso que podemos bajar desde esta página (parte de abajo) o bien de esta forma : wget http://poweriso.com/poweriso.tar.gz Descomprimimos tar -zxvf poweriso.tar.gz Y convertimos a ISO: ./poweriso convert imagen.daa -o nuevaimagen.iso (Instrucciones para montar la imagen iso, al principio de esta guía) 3.34 Montar particiones al iniciar sistema Nota: Ver las particiones que se quiere montar con fdisk -l o df Nota: La única diferencia entre Fedora y Ubuntu es donde montan las carpetas. Fedora lo hace en /run/media/nombre_usuario/ y Ubuntu lo hace en /media/nombre_usuario 3.34.1 Fedora ntfs Desmontar partición (si esta montada) y crear carpeta data su umount /run/media/snicoper/data mkdir -p /run/media/snicoper/data vim /etc/fstab Insertar al final ### data /dev/sda6 /run/media/snicoper/data ntfs defaults,rw,users,auto,iocharset=utf8,umask=0 Montar particiones mount -a 3.34.2 Ubuntu ntfs sudo umount /media/snicoper/data mkdir -p /media/snicoper/data 110 Capítulo 3. Linux Documents Documentation, Publicación 0.0.1 vim /etc/fstab /dev/sda5 /media/snicoper/data ntfs defaults,rw,users,auto,iocharset=utf8,umask=0 mount -a 3.34.3 Fedora ext4 mkdir -p /run/media/snicoper/data vim /etc/fstab /dev/sda5 /run/media/snicoper/data ext4 defaults,user,auto 0 2 Si es la primera vez que se crea la partición, crear una carpeta mkdir /run/media/snicoper/data/snicoper chown snicoper:snicoper /run/media/snicoper/data/snicoper 3.34.4 Fedora btrfs /dev/sdaX /run/media/snicoper/data btrfs defaults,user,auto 0 2 3.35 Redimensionar una imagen Cambiar el tamaño de una imagen en % convert imagen.png -resize 50% carpeta/imagen.png Cambiar el tañano de una imagen en pixeles convert imagen.png -resize 60x60 carpeta/imagen.png 3.36 Saber donde esta un “ejecutable” which php 3.37 Saber temperatura del PC Fuentes http://blog.desdelinux.net/sensors-conoce-todas-las-temperaturas-de-tu-ordenador/ sudo apt-get install lm-sensors La terminal te puede mostrar la temperatura en tiempo real con tan solo poner: 3.35. Redimensionar una imagen 111 Documents Documentation, Publicación 0.0.1 watch -n 01 sensors 3.38 Source Code Pro Fuentes http://sourceforge.net/projects/sourcecodepro.adobe/files/ https://github.com/adobe-fonts/source-code-pro Descargar de sourceforge SourceCodePro_FontsOnly-(version).zip. cd SourceCodePro_FontsOnly-(version)/ mkdir source-code-pro mv OTF/* source-code-pro mv TTF/* source-code-pro sudo mv source-code-pro /usr/share/fonts/ sudo fc-cache 3.39 Tunel SSH ssh [email protected] -L 3307:localhost:3306 -N 3307: Es el puerto que asigno a la maquina cliente 3306: El puerto del host Ahora desde el cliente mysql -h 127.0.0.1 -u root -p -P 3307 3.40 Ver permisos en octal de los archivos stat -c %a filename 3.41 Virtualbox, problema con Alt Gr Si en la maquina virtual al pultar AltGr + 2 (@), no sale la (@), usar esta combinación: Pulsar AltGr (Mantener pulsada), pulsar Ctrl (solo pulsar y soltar) + tecla a escribir. 112 Capítulo 3. Linux CAPÍTULO 4 Mono - Monodevelop Categorias: 4.1 Compilar Mono y Monodevelop Advertencia: Falta Monodevelop Nota: En ubuntu tiene un ppa muy actualizado Repos de Mono y Monodevelop 4.1.1 Fuentes Fuentes http://www.bgsoftfactory.net/run-asp-net-mvc-4-with-mysql-on-linux/ http://www.lovesmesomecode.com/post/20130719-compiling-mono-3-in-ubuntu/ https://www.youtube.com/watch?v=5Ag7qTRXSQA Herramientas de compilación # Ubuntu sudo apt-get install build-essential git autoconf libtool automake Crear carpeta para las fuentes. mkdir -p ~/gitrepos/monobuild cd ~/gitrepos/monobuild 4.1.2 libgdiplus # Ubuntu sudo apt-get install libglib2.0-dev libjpeg-dev libtiff4-dev \ libpng12-dev libgif-dev libexif-dev libx11-dev \ libxrender-dev libfreetype6-dev libfontconfig1-dev \ libcairo2-dev gettext 113 Documents Documentation, Publicación 0.0.1 git clone git://github.com/mono/libgdiplus.git cd libgdiplus ./autogen.sh --prefix=/usr/local make sudo make install cd.. 4.1.3 Mono git clone https://github.com/mono/mono.git cd mono ./autogen.sh --prefix=/usr/local make get-monolite-latest make EXTERNAL_MCS=${PWD}/mcs/class/lib/monolite/gmcs.exe # Instalar sudo make install mono --version cd .. 4.1.4 XSP git clone https://github.com/mono/xsp.git cd xsp ./autogen.sh --prefix=/usr/local make sudo make install xsp4 --version 4.2 Creacion de un proyecto ASP.NET MVC 5 4.2.1 Fuentes http://curtis.schlak.com/2014/02/04/setup-asp-net-mvc-4-on-monodevelop-4.2.html http://joelennon.com/asp-net-mvc-on-mac-os-x/ Nota: A partir de Monodevelop 5.2 o 5.3 este problema ya no lo da. Crear un proyecto MVC con Razor Editar opciones del proyecto. Options > Build > General > Target Framework: Mono/.NET 4.5 Pinchar encima del nombre del proyecto: Add -> Add Packages. instlar Microsoft ASP.NET MVC Editar Web.config Sustituir: 114 Capítulo 4. Mono - Monodevelop Documents Documentation, Publicación 0.0.1 <add key="webpages:Version" value="1.0.0.0" /> # Por <add key="webpages:Version" value="3.0.0.0" /> Editar Views/Web.config # Sustituir System.Web.WebPages.Razor, Version=1.0.0.0 # Por System.Web.WebPages.Razor, Version=3.0.0.0 # Sustituir System.Web.Mvc, Version=3.0.0.0 # Por System.Web.Mvc, Version=5.1.0.0 En linux, editar permisos. Las rutas varian segun como se ha instalado mono, pero lo que se ha de tener en cuenta es que en el directorio mono ha de tener un directorio registry y dentro de este, otro llamado LocalMachine sudo sudo sudo sudo mkdir mkdir chmod chmod /opt/mono/etc/mono/registry /opt/mono/etc/mono/registry/LocalMachine g+rwx /opt/mono/etc/mono/registry g+rwx /opt/mono/etc/mono/registry/LocalMachine 4.3 Repos de Mono y Monodevelop Nota: Para Ubuntu, si se quiere tener los últimos mono y monodevelop, ver los PPA’s abajo. 4.3.1 Fuentes http://software.opensuse.org/download/package?project=home:tpokorra:mono&package=mono-opt https://launchpad.net/~ermshiperete/+archive/ubuntu/monodevelop 4.3.2 Instalar Mono Monodevelop y XSP desde los repos de OpenSUSE Ubuntu wget http://download.opensuse.org/repositories/home:tpokorra:mono/xUbuntu_14.04/Release.key sudo apt-key add - < Release.key rm -f Release.key sudo sh -c "echo ’deb http://download.opensuse.org/repositories/home:/tpokorra:/mono/xUbuntu_14.04/ / sudo apt-get update sudo apt-get install mono-opt monodevelop-opt mono-xsp-opt -y 4.3. Repos de Mono y Monodevelop 115 Documents Documentation, Publicación 0.0.1 Fedora cd /etc/yum.repos.d/ wget http://download.opensuse.org/repositories/home:tpokorra:mono/Fedora_20/home:tpokorra:mono.repo yum install mono-opt monodevelop-opt mono-xsp-opt Fedora Ubuntu Editar ~/.bashrc PATH="$PATH:/opt/mono/bin" export PATH sudo sudo sudo sudo mkdir mkdir chmod chmod /opt/mono/etc/mono/registry /opt/mono/etc/mono/registry/LocalMachine g+rwx /opt/mono/etc/mono/registry g+rwx /opt/mono/etc/mono/registry/LocalMachine 4.3.3 Ubuntu ultimo Mono y MonoDevelop PPA https://launchpad.net/~ermshiperete/+archive/ubuntu/monodevelop?field.series_filter=trusty sudo apt-add-repository ppa:ermshiperete/monodevelop sudo apt-get update sudo apt-get install monodevelop mono-xsp4 Otro ppa https://launchpad.net/~inizan-yannick/+archive/ubuntu/mono?field.series_filter=trusty sudo apt-add-repository ppa:inizan-yannick/mono sudo apt-get update sudo apt-get install monodevelop mono-xsp4 En los dos casos con los ppa hay que crear la carpeta registry/LocalMachine y darle permisos de escritura y ejecución. sudo mkdir -p /etc/mono/registry/LocalMachine sudo chmod g+rwx /etc/mono/registry sudo chmod g+rwx /etc/mono/registry/LocalMachine 4.4 Mono 3.4.1 Windows http://www.dynamicdevices.co.uk/downloads/ 116 Capítulo 4. Mono - Monodevelop CAPÍTULO 5 Programacion Categorias: 5.1 Apuntes sin clasificar Categorias: 5.1.1 Calcular porcentaje Fuentes http://primaria.aulafacil.com/matematicas-sexto-primaria/Curso/Lecc-16.htm Incrementar un % Incrementar un % a una cantidad. Cantidad inicial -> 200 % a incrementar -> 1.10 200 * 1.10 = 220 Por el ejemplo, si el porcentaje que se quiere averiguar es 8 %, 8 es un integer y para poderlo pasar a %, se debe hacer la conversión. Obtener que % se ha aplicado a una cantidad. Para averiguarlo, debemos saber 2 datos: Cantidad total -> 160 Cantidad incrementada del % -> 30 100 * (cantidad_porcentaje / total) 100 * (30 / 160) = 18,75 % 117 Documents Documentation, Publicación 0.0.1 5.1.2 Permisos de archivos básico Nota: Aunque lo apunte de un libro de php, en realidad es parte del sistema de Linux. Dependiendo de los permisos, lo que repercute en archivos y directorios. Permisos read write Lo que permite en un directorio Ver su contenido (ls) Crear o eliminar archivos en el directorio. Lo que permite en un archivo Ver, Copiar, Imprimir, etc Modificar, renombrar o eliminarlo. Valores numéricos para permisos de archivos para clases de usuarios Orden Lectura Escritura Ejecución Propietario 400 200 100 Grupo 040 020 010 Otros 004 002 001 Es decir un archivo con permisos 700 seria que al propietario puede leer, escribir y ejecutar, pero el resto no podrían hacer ninguna de las cosas (-rwx——). Se suman los valores en cada columna y se obtiene los permisos, 777 es el máximo Para mas información leer el libro PHP y MySQL Practico para diseñadores y programadores web pagina 469 En Beginning PHP 5.3 da mas datos sobre los permisos y pone todos los números (pag 352) 1 No se puede leer, escribir o ejecutar el archivo 2 Sólo puede ejecutar el archivo 3 Sólo se pueden escribir en el fichero 4 Se puede escribir y ejecutar el archivo 5 Pueden leer y ejecutar el archivo 6 Puede leer y escribir en el fichero 7 Puede leer, escribir y ejecutar el archivo Para dar permisos con chmod() se ha de hacer de la siguiente manera: bool chmod(‘nombre_archivo.dat’, 0644); 5.1.3 Plantilla Atorm <?xml version=’1.0’ encoding=’utf-8’?> <feed xmlns=’http://www.w3.org/2005/Atom’ xml:lang=’en’> <title>dive into mark</title> <subtitle>currently between addictions</subtitle> <id>tag:diveintomark.org,2001-07-29:/</id> <updated>2009-03-27T21:56:07Z</updated> <link rel=’alternate’ type=’text/html’ href=’http://diveintomark.org/’/> <entry> <author> <name>Mark</name> <uri>http://diveintomark.org/</uri> </author> <title>Dive into history, 2009 edition</title> <link rel=’alternate’ type=’text/html’ href=’http://diveintomark.org/archives/2009/03/27/dive-into-history-2009-edition’/> 118 Capítulo 5. Programacion Documents Documentation, Publicación 0.0.1 <id>tag:diveintomark.org,2009-03-27:/archives/20090327172042</id> <updated>2009-03-27T21:56:07Z</updated> <published>2009-03-27T17:20:42Z</published> <category scheme=’http://diveintomark.org’ term=’diveintopython’/> <category scheme=’http://diveintomark.org’ term=’docbook’/> <category scheme=’http://diveintomark.org’ term=’html’/> <summary type=’html’>Putting an entire chapter on one page sounds bloated, but consider this &mdash; my longest chapter so far would be 75 printed pages, and it loads in under 5 seconds&hellip; On dialup.</summary> </entry> <entry> <author> <name>Mark</name> <uri>http://diveintomark.org/</uri> </author> <title>Accessibility is a harsh mistress</title> <link rel=’alternate’ type=’text/html’ href=’http://diveintomark.org/archives/2009/03/21/accessibility-is-a-harsh-mistress’/> <id>tag:diveintomark.org,2009-03-21:/archives/20090321200928</id> <updated>2009-03-22T01:05:37Z</updated> <published>2009-03-21T20:09:28Z</published> <category scheme=’http://diveintomark.org’ term=’accessibility’/> <summary type=’html’>The accessibility orthodoxy does not permit people to question the value of features that are rarely useful and rarely used.</summary> </entry> <entry> <author> <name>Mark</name> </author> <title>A gentle introduction to video encoding, part 1: container formats</title> <link rel=’alternate’ type=’text/html’ href=’http://diveintomark.org/archives/2008/12/18/give-part-1-container-formats’/> <id>tag:diveintomark.org,2008-12-18:/archives/20081218155422</id> <updated>2009-01-11T19:39:22Z</updated> <published>2008-12-18T15:54:22Z</published> <category scheme=’http://diveintomark.org’ term=’asf’/> <category scheme=’http://diveintomark.org’ term=’avi’/> <category scheme=’http://diveintomark.org’ term=’encoding’/> <category scheme=’http://diveintomark.org’ term=’flv’/> <category scheme=’http://diveintomark.org’ term=’GIVE’/> <category scheme=’http://diveintomark.org’ term=’mp4’/> <category scheme=’http://diveintomark.org’ term=’ogg’/> <category scheme=’http://diveintomark.org’ term=’video’/> <summary type=’html’>These notes will eventually become part of a tech talk on video encoding.</summary> </entry> </feed> 5.1.4 Plantilla RSS2 <?xml version="1.0" ?> <rss version="2.0"> <channel> <title>Ajax and XUL</title> <link>http://www.xul.fr/en/</link> <description>XML graphical interface etc...</description> 5.1. Apuntes sin clasificar 119 Documents Documentation, Publicación 0.0.1 <image> <url>http://www.xul.fr/xul-icon.gif</url> <link>http://www.xul.fr/en/index.php</link> </image> <item> <title>News of today</title> <link>http://www.xul.fr/en-xml-rss.html</link> <description>All you need to know about RSS</description> </item> <item> <title>News of tomorrows</title> <link>http://www.xul.fr/en-xml-rdf.html</link> <description>And now, all about RDF</description> </item> </channel> </rss> 5.1.5 Saber si un año es bisiesto if ((($year % 4 == 0) && ($year % 100 != 0)) || ($year % 400 == 0)) { $bisiesto = true; } 5.2 C# y ASP.NET MVC Categorias 5.2.1 ASP.NET MVC Categorias: 120 Capítulo 5. Programacion Documents Documentation, Publicación 0.0.1 ActionResult Action Result ViewResult PartialViewResult RedirectResult RedirectToRouteResult ContentResult JsonResult Helper Method Descripcion View Renderiza una Vista como pagina Web. PartialView Renderiza una vista parcial, que define una sección de una vista que se puede representar dentro de otro vista. Redirect Redirecciona a otro método de acción utilizando su URL. RedirectToAction o RedirectToRoute Redirecciona a otro metodo de acción. Content JavaScriptResult HttpStatusCodeResult HttpUnauthorizedResult HttpNotFoundResult FileResult JavaScript Representa un tipo de contenido definido por el usuario que es el resultado de un método de acción. Representa una clase que se usa para enviar contenido con formato JSON a la respuesta. Envía el contenido de JavaScript a la respuesta FileContentResult Controller.File(Byte[], String) or Controller.File(Byte[], String, String) Controller.File(String, String) or Controller.File(String, String, String) Controller.File(Stream, String) or Controller.File(Stream, String, String) (None) FilePathResult FileStreamResult EmptyResult Json (None) (None) Proporciona un modo para devolver un resultado de la acción con un código de estado de respuesta HTTP y una descripción específicos. Representa el resultado de una solicitud HTTP no autorizada. HttpNotFound Define un objeto que se usa para indicar que no se encontró el recurso solicitado. File Representa una clase base que se usa para enviar contenido de archivo binario a la respuesta. Envía el contenido de un archivo binario a la respuesta. Envía el contenido de un archivo a la respuesta. Envía el contenido binario a la respuesta mediante una instancia de Stream. Representa un resultado que no hace nada, tal como un método de acción de controlador que no devuelve nada. Apuntes Varios para recordar Html.EditorForModel() Devuelve un elemento input HTML para cada propiedad del modelo, mediante los datos de vista adicionales. Problemas Con Globalizacion Idiomas Para permitir la validación de jQuery para las configuraciones regionales distintos del inglés que utilizan una coma (”,”) para el punto decimal, y los for- 5.2. C# y ASP.NET MVC 121 Documents Documentation, Publicación 0.0.1 matos de fecha no non-English, debe incluir globalize.js y su archivo específico cultures/globalize.cultures.jss (desde https://github.com/jquery/globalize ) y el JavaScript para visualizar Globalize.parseFloat. Usted puede obtener el jQuery non-English validación de NuGet. (No instale Globalize si está utilizando una configuración regional Inglés.) Ver Cerrar DbContext en los Controllers Cuando se usa en los controladores una propiedad tipo: public class StudentController : Controller { private SchoolContext db = new SchoolContext(); [...] Hay que asegurarse de que quedan cerradas al finalizar las tareas. Para asegurarse de que se cierra, en el controlador se escribe un método override Dispose, para asegurarnos de que siempre quedara cerrada la conexión de la base de datos. protected override void Dispose(bool disposing) { if (disposing) { db.Dispose(); } base.Dispose(disposing); } Definición modelo Fuentes Beginning ASP.NET MVC 4 Pagina 69 El término modelo se refiere a un conjunto de objetos que implementa una pieza de funcionalidad. Un modelo en el patrón MVC pueden ser clasificados ya sea como un modelo de datos, un modelo de negocio, o un modelo de vista. Cada uno de los diferentes tipos de modelo tiene un propósito específico, tal como se describe en la Tabla 6-1. En su conjunto, los modelos de datos y de negocios que se conoce como el modelo de dominio. Modelo de vista no son parte del modelo de dominio, ya que su propósito es sólo para pasar los datos desde el controlador a las vistas y viceversa. [Modelo de dominio] Data model (Modelo de datos) Los objetos en el modelo de datos representan clases que interactúan con una base de datos. Normalmente, se puede pensar en el modelo de datos como el conjunto de las clases creadas por herramientas como Entity Framework (EF). Estas clases pueden comenzar ya sea en forma de tablas existentes en la base de datos que hay que leer para generar clases (enfoque database-first) o empezar como clases que se utilizarán para generar tablas de la base de datos (enfoque code-first). Además, puede crear manualmente estas clases utilizando ADO.NET para implementar la base de datos de interacción particular que necesita su aplicación. 122 Capítulo 5. Programacion Documents Documentation, Publicación 0.0.1 [Modelo de dominio] Business Model (Modelo de negocio) Las clases en el modelo de negocio normalmente implementa la funcionalidad que representa las reglas de negocio o de procesamiento (por ejemplo, el cálculo de un coste de envío particular para un elemento carrito de compras basado en el peso del artículo que se compra). Como parte de la transformación, las clases del modelo de negocio pueden interactuar con las clases del modelo de datos para leer o guardar datos en la base de datos. View model (Modelo de vista) Las clases del modelo de vista proporcionan información transmitida desde los controladores a las vistas, por lo que las vistas saben qué hacer en el navegador del usuario. Por ejemplo, una clase de modelo de vista puede contener información sobre el producto que es utilizado por el fin de mostrar el nombre del producto, el precio, y las imágenes. La función de una clase de modelo de vista no es procesar cualquier cosa, más bien, su única función es la de contener los datos y metadatos opcional para el fin de rendir adecuadamente. Un modelo de vista también se utiliza cuando un usuario realiza una solicitud desde una vista previamente prestados (por ejemplo, cuando se envía un formulario de contacto). 5.2. C# y ASP.NET MVC 123 Documents Documentation, Publicación 0.0.1 124 Capítulo 5. Programacion Documents Documentation, Publicación 0.0.1 Descrption Arbol en un Proyecto FolDescripcion der or file /App_Data Esta carpeta es donde pones los datos privados, como los archivos XML o bases de datos si está utilizando SQL Server Express, SQLite u otros repositorios filebased. /App_Start Esta carpeta contiene algunas opciones de configuración básicas para su proyecto, incluyendo la definición de las rutas y los filtros y los paquetes de contenido. /Areas Áreas son una manera de dividir una aplicación grande en pedazos más pequeños /bin El ensamblado compilado para su aplicación MVC se coloca aquí, junto con los ensamblados de referencia que no están en la GAC. /Content Aquí es donde se pone el contenido estático, como archivos CSS e imágenes. /Controllers Aquí es donde usted pone sus clases de controlador. /Models Aquí es donde usted pone su modelo de vista y las clases del modelo de dominio, a pesar de todo, pero las aplicaciones más sencillas se benefician de la definición del modelo de dominio en un proyecto dedicado, como demostré para SportsStore. /Scripts Este directorio está diseñado para mantener las bibliotecas de JavaScript para su aplicación. /Views Este directorio contiene las vistas y las vistas parciales, generalmente agrupadas en carpetas con el nombre después de que el controlador con el que están asociados. /Views/Shared Este directorio contiene presentaciones y vistas que no son específicos de un solo controlador. /Views/Web.Config Este no es el archivo de configuración de la aplicación. Contiene la configuración necesaria para realizar visitas de trabajo con ASP.NET y evita que vistas de ser servido por IIS y los espacios de nombres importados en vistas de forma predeterminada. /Glo- Esta es la clase de aplicación ASP.NET global. Su bal.asax clase de código subyacente (Global.asax.cs) es el lugar para registrar la configuración de enrutamiento, así como la creación de cualquier código para ejecutarse en la aplicación de inicialización o apagado, o cuando se producen 5.2. C# yexcepciones ASP.NET MVC no controladas. Notas IIS no va a servir el contenido de esta carpeta. Usted no verá el directorio bin en la ventana Explorador de soluciones a menos que usted haga clic en el botón Mostrar todos los archivos. Dado que estos son archivos binarios generados en la compilación, que normalmente no debe almacenarlos en control de código fuente. Esta es una convención, pero no es necesario. Usted puede poner su contenido estático en cualquier lugar que más le convenga. Esta es una convención. Usted puede poner sus clases de controlador en cualquier lugar que te gusta, porque todos se compilan en el mismo ensamblado. Esta es una convención. Se pueden definir las clases del modelo en cualquier parte en el proyecto o en un proyecto independiente. Esta es una convención. Usted puede poner los archivos de script en cualquier lugar, ya que son más que otro tipo de contenido estático. The archivo /Views/web.config impide IIS de servir el contenido de estos directorios. Vistas deben ser prestados a través de un método de acción. 125 Documents Documentation, Publicación 0.0.1 Redireccionar dentro de un controlador Hay dos maneras para hacerlo, las dos el metodo debe devolver un RedirectToRouteResult, y dentro del método debe usar RedirectToRoute o RedirectToAction. Ambos tienen el mismo efecto y coinciden en sus argumentos. Ejemplo básico de RedirectToRoute public RedirectToRouteResult Accion() { return RedirectToRoute( new { controller = "Customer", action = "ChangePassword", user = "snicoper", password = "123456" }); } Ejemplo básico de RedirectToAction, user y password son parámetros para la acción. public RedirectToRouteResult Accion() { return RedirectToAction( "ChangePassword", "Customer", new { user = "snicoper", password = "123456" }); } Varian un poco en como pasar los argumentos, pero tienen exactamente el mismo efecto. Otra manera es con una propiedad de la clase base Controller, la propiedad es Response public void ProduceRedirect() { Response.Redirect("/Url/Aqui"): } O tambien devolviendo un RedirectResult public RedirectResult ProduceRedirect() { return Redirect("/Url/Aqui"): // Cambio permanente return RedirectPermanent("/Url/Aqui"); } Nota: Es mejor los dos primeros enfoques, ver Pro ASP.NET MVC 5 pagina 443. El problema con el uso de direcciones URL literales para la redirección es que cualquier cambio en el esquema de enrutamiento significa que hay que ir a través del código y actualizar las direcciones URL. En cambio con Redirect, si el router cambia, se tendrá que buscar/modificar las rutas. Usar solo Razor para las Vistas Fuentes http://geeks.ms/blogs/lruiz/archive/2014/06/20/asp-net-mvc-usa-s-243-lo-el-motor-de-vistas-que-necesites-entu-aplicaci-243-n.aspx 126 Capítulo 5. Programacion Documents Documentation, Publicación 0.0.1 Cuando renderizamos de una action a una vista ‘return View()’, el orden de búsqueda (o las búsquedas), en un action public ActionResult Prueba() {}: The view ’Prueba’ or its master was not found or no view engine supports the searched locations. The ~/Views/Home/Prueba.aspx ~/Views/Home/Prueba.ascx ~/Views/Shared/Prueba.aspx ~/Views/Shared/Prueba.ascx ~/Views/Home/Prueba.cshtml ~/Views/Home/Prueba.vbhtml ~/Views/Shared/Prueba.cshtml ~/Views/Shared/Prueba.vbhtml Es decir, busca en~/Views/Home/ y ~/Views/Shared/ un archivo de vista con el mismo nombre del action con varias extensiones. .ascx que seria el motor para windows form y vs|cs(html) que seria para el motor de razor. Para omitir este comportamiento y solo activar el motor de vistas Razor, en el archivo ~/Global.asax se puede añadir lo siguiente: public class MvcApplication : System.Web.HttpApplication { protected void Application_Start() { AreaRegistration.RegisterAllAreas(); RouteConfig.RegisterRoutes(RouteTable.Routes); // Limpiar los actuales motores de vista y añadir solo razor ViewEngines.Engines.Clear(); ViewEngines.Engines.Add(new RazorViewEngine()); } } Ahora el resultado es el siguiente: The view ’Prueba’ or its master was not found or no view engine supports the searched locations. The ~/Views/Home/Prueba.cshtml ~/Views/Home/Prueba.vbhtml ~/Views/Shared/Prueba.cshtml ~/Views/Shared/Prueba.vbhtml Otra manera de hacerlo Personalizando el motor de razor para las búsquedas de archivo cshtml Crear carpeta Infrastructure en la raíz Crear clae CustomLocationViewEngine.cs using System.Web.Mvc; namespace WorkingWithRazor.Infrastructure { public class CustomLocationViewEngine : RazorViewEngine { public CustomLocationViewEngine() { ViewLocationFormats = new string[] 5.2. C# y ASP.NET MVC 127 Documents Documentation, Publicación 0.0.1 { "~/Views/{1}/{0}.cshtml", "~/Views/Shared/{0}.cshtml" }; } } } Modificar Método Application_Start en Global.asax.cs using System.Web.Mvc; using System.Web.Routing; using WorkingWithRazor.Infrastructure; namespace WorkingWithRazor { public class MvcApplication : System.Web.HttpApplication { protected void Application_Start() { AreaRegistration.RegisterAllAreas(); RouteConfig.RegisterRoutes(RouteTable.Routes); ViewEngines.Engines.Clear(); ViewEngines.Engines.Add(new CustomLocationViewEngine()); } } } Ahora el resultado es ~/Views/Home/Prueba.cshtml ~/Views/Shared/Prueba.cshtml 5.2.2 EntityFramework Categorias: connectionString Fuentes https://www.connectionstrings.com/sql-server-2012/ PostgreSQL Desde Package Manager Console, instalar los siguientes: Install-Package EntityFramework Install-Package Npgsql Install-Package Npgsql.EntityFramework 128 Capítulo 5. Programacion Documents Documentation, Publicación 0.0.1 Nota: Instalando solo Install-Package Npgsql.EntityFramework ya se encarga de instalar las dependendias EntityFramework y Npgsql.EntityFramework Editar web.config de la reaiz del proyecto ASP.NET MVC <connectionStrings> <add name="BloggingContext" connectionString="server=localhost;user id=snicoper;password=123456;database=practicas" providerName="Npgsql" /> </connectionStrings> <system.data> <DbProviderFactories> <add name="Npgsql Data Provider" invariant="Npgsql" description="Data Provider for PostgreSQL" type="Npgsql.NpgsqlFactory, Npgsql" /> </DbProviderFactories> </system.data> <entityFramework> <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFrame <providers> <provider invariantName="Npgsql" type="Npgsql.NpgsqlServices, Npgsql.EntityFramework" /> </providers> </entityFramework> SQL Server Express Editar web.config de la raíz del proyecto ASP.NET MVC <connectionStrings> <add name="ConnStringDbContext" providerName="System.Data.SqlClient" connectionString="Data Source=.\SQLEXPRESS; Initial Catalog=Practicas; Integrated Security=False; User ID=snicoper;Password=123456; MultipleActiveResultSets=True" /> </connectionStrings> <entityFramework> <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFra <providers> <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderS </providers> </entityFramework> MVC5 EF6 Identity Postgresql Advertencia: Es necesario Npgsql 2.2.0+ y las todas las tablas las crea tipo text. Npgsql 2.2.0 esta en estado beta Npgsql 2.2.0 ya soporta migraciones y supongo que por eso ahora puedo usar identity con postgres. Supongo que antes debería crear las tablas en la base de datos a mano. 5.2. C# y ASP.NET MVC 129 Documents Documentation, Publicación 0.0.1 De momento, genera las tablas en la db y puedo usarlas. El proyecto se crea una aplicacion ASP.NET Web Applicacion > MVC Ahora en Package Console Manager, instalar Npgsql y Npgsql.EntityFramework # Ya instalara tambien Npgsql Install-Package Npgsql.EntityFramework -Pre Editar Models > EntityModels.cs y añadir protected override void OnModelCreating(System.Data.Entity.DbModelBuilder modelBuilder) { modelBuilder.HasDefaultSchema("public"); base.OnModelCreating(modelBuilder); } Ahora ver Migraciones con EF6 para que cree las tablas Migraciones con EF6 Advertencia: Requiere Npgsql 2.2+ para Npgsql Inicializar migraciones enable-migrations Nota: Esta parte debo de aprender mas. Eso crea un archivo ~/Migrations/Configuration.cs donde podemos poblar datos (Seed) Crear el primer archivo de migracion add-migration InitialCreate Update database update-database Recuperar datos de otras tablas relacionales Fuentes Libro: Getting Started with Entity Framework 6 Code First using MVC 5: Pag 161 130 Capítulo 5. Programacion Documents Documentation, Publicación 0.0.1 Aunque esta bastante incompleto, pero me dejo una pequeña referencia para saber como se llaman las formas de hacer las cosas y la pagina donde lo leí. Imaginando que tenemos 2 modelos class Usuario { public int UsuarioID { get; set; } public string Nombre { get; set; } public virtual ICollection<Post> Posts { get; set; } } class Post { public int PostID { get; set; } public string Titulo { get; set; } public virtual ICollection<Usuario> Usuarios { get; set; } } // El Contexto class PracticasContext : DbContext { public DbSet<Usuario> Usuarios { get; set; } public DbSet<Post> Posts { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Entity<Usuario>().HasMany(u => u.Posts).WithMany(p => p.Usuarios); } } La base de datos, son 3 tablas Usuarios, Posts y UsuarioPosts. Con postgres la tabla UsuarioPosts hay que crearla a mano y aun no se como hacer las relación en EF. Lazy loading (Carga diferida) // Mostrara todos los titulos de Posts, ya que no hay filtros en Usuario List<Usuario> usuarios = db.Usuarios.ToList(); foreach (Usuario usuario in usuarios) { foreach (Post post in usuario.Posts) { Console.WriteLine(post.Titulo); } } 5.2. C# y ASP.NET MVC 131 Documents Documentation, Publicación 0.0.1 Eager loading (Carga diligente/Carga rapida) // Mostrara todos los titulos de Posts, ya que no hay filtros en Usuario // IEnumerable<Usuario> usuarios = db.Usuarios.Include(x => x.Post); // Usando filtro, para ver los posts de un usuario con x ID IEnumerable<Usuario> usuarios = db.Usuarios.Where(u => u.UsuarioID == 1).Include(x => x.Post); foreach (Usuario usuario in usuarios) { foreach (Post post in usuario.Posts) { Console.WriteLine(post.Titulo); } } Explicit loading (Carga explicita) // Mostrara todos los titulos de Posts, ya que no hay filtros en Usuario List<Usuario> usuarios = db.Usuarios.ToList(); foreach (Usuario usuario in usuarios) { db.Entry(usuario).Collection(x => x.Posts).Load(); foreach (Post post in usuario.Posts) { Console.WriteLine(post.Titulo); } } Nota del libro Si usted sabe que necesita los datos relacionados para cada entidad recuperada, eager loading a menudo ofrece el mejor rendimiento, ya que una sola consulta enviada a la base de datos suele ser más eficiente que las consultas separadas para cada entidad recuperada. Por ejemplo, en los ejemplos anteriores, suponer que cada departamento tiene diez cursos relacionados. En el ejemplo de eager loading se traduciría en una sola (unión) de consulta y un solo de ida y vuelta a la base de datos. La lazy loading y ejemplos de Explicit loading haría tanto resultado en once consultas y once de ida y vuelta a la base de datos. Las idas y vueltas adicionales a la base de datos son especialmente perjudiciales para el rendimiento cuando la latencia es alta. Por otra parte, en algunos escenarios de lazy loading es más eficiente. Eager loading podría causar una muy compleja unen a generarse, que SQL Server no puede procesar de manera eficiente. O si usted necesita para acceder a las propiedades de navegación de una entidad sólo para un subconjunto de un conjunto de las entidades que estés procesamiento, lazy loading podría funcionar mejor, porque eager loading podría recuperar más datos de los que necesita. Si el rendimiento es crítico, lo mejor es probar el rendimiento en ambos sentidos con el fin de tomar la mejor decisión 5.2.3 Identity Categorias: 132 Capítulo 5. Programacion Documents Documentation, Publicación 0.0.1 Primeros pasos con Identity Fuentes http://benfoster.io/blog/aspnet-identity-stripped-bare-mvc-part-1 http://benfoster.io/blog/aspnet-identity-stripped-bare-mvc-part-2 Advertencia: Por hacer C# Lenguaje 5.2.4 Array Básico Arrays una dimensión Declarar e inicializar un array: // Crear un array con 10 elementos sin rellenarlos string[] myArray = new string[10]; // Para asignar valores usar indices en los [] myArray[0] = "elemento"; // Crear array e insertarle valores int[] myArray = {1, 2, 3, 4, 5}; // Es equivalente a: int[] myArray = new int[5] {1, 2, 3, 4, 5}; // o int[] myArray = new int[5]; myArray[0] = 1; myArray[1] = 2; myArray[2] = 3; myArray[3] = 4; myArray[4] = 5; Multidimensional Arrays Son arrays de dos dimensiones, se puede pensar en ellas (siendo de 2 dimensiones) como filas y columnas en una tabla. Para declarar una se usa la siguiente sintaxis: int[,] matrix = new int[4, 2]; Esto crea una “tabla mas o menos así” x x x x x x x x 5.2. C# y ASP.NET MVC 133 Documents Documentation, Publicación 0.0.1 Una manera rápida seria: int[,] matrix = { {1, 1}, {2, 2}, {3, 5}, {4, 5} }; Donde: 1 2 3 4 1 2 5 5 matrix[0, 2]; // 3 matrix[1, 2]; // 5 Arrays de Arrays También llamadas arrays escalonada, ya que cada fila puede tener un numero x de elementos. Un ejemplo rapido: int[][] matrix = new int[3][]; matrix[0] = new int[5]; matrix[1] = new int[4]; matrix[2] = new int[2]; matrix[0][3] = 4; matrix[1][1] = 8; matrix[2][0] = 5; 0 0 0 4 0 0 8 0 0 5 0 Los elementos que no se hayan inicializado, su valor sera null, independientemente del tipo al que pertenezca el elemento. string[] nombres = new string[10]; int[] numeros = new int[10]; nombres[1]; // null numeros[1]; // null 5.2.5 Boxing y Unbonxing Fuentes http://msdn.microsoft.com/es-es/library/yz2be5wk.aspx Boxing se refiere a la conversión de un tipo valor a un tipo object ajustable. Unboxing es lo contrario, un tipo objeto a un tipo valor (siempre que sea posible), además se debe hacer de manera explícita. 134 Capítulo 5. Programacion Documents Documentation, Publicación 0.0.1 Boxing int i = 1; object o = i; Unbonxing int e = (int)o; La utilidad viene mas cuando se usan por ejemplo, listas using System.Collections; [......] ArrayList array = new ArrayList(); array.Add(12); array.Add(3); array.Add(123); Si ahora queremos obtener los valores y asignarlos a variables, como ArrayList no sabe los tipos de sus valores, debemos hacer Unboxing de manera explicita: int num = (int)array[1]; Nota: Aun asi, si necesitamos listas de un tipo concreto, usar System.Collections.Generic 5.2.6 DirectorySeparator Path.DirectorySeparatorChar (Campo) 5.2.7 Character Commands Fuentes http://msdn.microsoft.com/en-us/library/system.char.aspx Muy útiles para comprobar un carácter dado. char.IsDigit(ch) char.IsLetter(ch) char.IsLetterOrDigit(ch) char.IsLower(ch) char.IsUpper(ch) char.IsPunctuation(ch) char.IsWhiteSpace(ch) returns true if the character is a digit (0 to 9) returns true if the character is a letter (a to z or A to Z) returns true if the character is a letter or a digit returns true if the character is a lower case letter returns true if the character is an upper case letter returns true if the character is a punctuation character returns true if the character is a space, tab or newline 5.2.8 Checked Unchecked Sirve para comprobar el desbordamiento, con checked lo comprueba, unchecked no lo hace. Por ejemplo 5.2. C# y ASP.NET MVC 135 Documents Documentation, Publicación 0.0.1 byte a = 55; byte b = 210; byte result = (byte)(a + b); El comportamiento por defecto, depende de la configuración de compilación, pero creo que es unchecked. unchecked { byte a = 55; byte b = 210; byte result = (byte)(a + b); } El ejemplo anterior, dará como resultado 9, ya que un byte solo puede contener un entero entre 0 y 255. La suma es de 210 + 55 = 265 (supera en 10 al máximo), por lo que que cuando llega a 255 el siguiente numero es 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 que son los 10 extras. Con checked checked { byte a = 55; byte b = 210; byte result = (byte)(a + b); } Lanzara una System.OverflowException Conclusión, si es importante que no sobrepase el máximo de un tipo, usar checked 136 Capítulo 5. Programacion Documents Documentation, Publicación 0.0.1 5.2.9 Conversiones Implicitas Numericas 5.2.10 Creacion de un metodo con un param lambda Fuentes OrtizOL - Experiencias Construcción Software (xCSw) Me dejo un ejemplo para recordar. using System; using System.Collections.Generic; namespace ConsolePracticas { class Program { static void Main(string[] args) { List<Person> persons = new List<Person> { 5.2. C# y ASP.NET MVC 137 Documents Documentation, Publicación 0.0.1 new Person { Id = 1, Nombre = "snicoper" }, new Person { Id = 2, Nombre = "perico" }, new Person { Id = 3, Nombre = "palote" }, }; IEnumerable<Person> query = persons.MyWhere(p => p.Id > 1); foreach (Person ele in query) { Console.Write("{0}, ", ele.Nombre); // perico, palote, } Console.ReadLine(); } } public static class MyExtensions { public static IEnumerable<T> MyWhere<T>(this IEnumerable<T> lista, Func<T, bool> predicate) { foreach (T element in lista) { if (predicate(element)) { yield return element; } } } } public class Person { public int Id { get; set; } public string Nombre { get; set; } } } 5.2.11 Descripcion Accesibilidad Accessibility public protected internal assemblies protected private Description No restrictions on access. Can be accessed in the declaring class or derived classes. Can be accessed by all types in the same assembly of the declaring class and other specifically named using the InternalsVisibleTo attribute. internal Any access granted by protected or internal. Only accessed by the declaring class. 5.2.12 Diferencia entre Class y Struct Fuentes http://geekswithblogs.net/BlackRabbitCoder/archive/2010/07/29/c-fundamentals-the-differences-betweenstruct-and-class.aspx 138 Capítulo 5. Programacion Documents Documentation, Publicación 0.0.1 La primera gran diferencia es que las clases son tipo referencia mientras que las structs son tipo valor. Algunas diferencias Nota: En geekswithblogs.net hay un articulo mucho mas completo. Feature Is a reference type? Is a value type? Can have nested Types (enum, class, struct)? Can have constants? Can have fields? Can have properties? Can have indexers Can have methods Can have Events Can have static members (constructors, fields, methods, properties, etc.)? Can inherit? Can implement interfaces? Can overload constructor? Can define default constructor? Can overload operators? Can be generic? Can be partial? Can be sealed? Can be referenced in instance members using this keyword? Needs new operator to create instance? StructClassNotes No Yes Yes No Yes Yes Yes Yes Yes Yes Campos de instancia estructura no se pueden inicializar, se inicializará automáticamente al valor por defecto. Yes Yes Yes Yes Yes Yes Yes Yes Las estructuras, al igual que las clases, pueden tener eventos, pero se debe tener cuidado de que no se suscribe a una copia de una estructura en lugar de la estructura que pretende. Yes Yes No Yes Las clases pueden heredar de otras clases (o de objeto por defecto). Las estructuras siempre heredan de System.ValueType y se sellan de manera implícita Yes Yes No Yes Sobrecarga de estructura del constructor no oculta constructor predeterminado No Yes El constructor predeterminado inicializa struct todos los campos de instancia a los valores por defecto y no se puede cambiar. Yes Yes Yes Yes Yes Yes Al- Yes Las estructuras siempre están sellados y no se pueden tener structs ways derivadas. Yes Yes No Yes Clases de C # deben instanciar usando new. Sin embargo, las estructuras no requieren esto. Mientras que New se puede utilizar en una estructura que llamar a un constructor, puede optar por no utilizar new e init los campos a ti mismo, pero hay que init todos los campos y los campos debe ser público! 5.2.13 Campos y Propiedades Un campo es el equivalente de una propiedad en PHP. private string nombre; Una propiedad es un setters/getter con posible lógica sobre un campo. public string Nombre { set 5.2. C# y ASP.NET MVC 139 Documents Documentation, Publicación 0.0.1 { if (value.Length < 5) { // hacer algo } else { nombre = value; } } get { return nombre; } } A groso modo, se puede decir que un campo(field) son como las propiedades en PHP y las propiedades son los métodos accesores en PHP. Internamente cuando lo convierte a ¿CIL?, crea métodos accesores como en PHP, es un atajo para el desarrollador. 5.2.14 IEnumerator Pequeño ejemplo que implementa IEnumerator con genéricos. class IntList<T> : IEnumerable<T> { private int count = 0; private T[] values; public int Count { get { return count; } } public IntList(int capacity) { values = new T[capacity]; } public void Add(T value) { values[count] = value; count++; } public T this[int index] { get { return values[index]; } set { values[index] = value; } } public IEnumerator<T> GetEnumerator() { for (int i = 0; i < count; i++) { yield return values[i]; } } IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); 140 Capítulo 5. Programacion Documents Documentation, Publicación 0.0.1 } } 5.2.15 Métodos de Extensión C# Fuentes http://msdn.microsoft.com/es-es/library/bb383977.aspx Cita de MSDN Ejemplo simple Los métodos de extensión deben estar en una clase static y el método también ha de ser static. public static clss StringExtension { public static string UcFirst(this string str) { if (str.Length == 0) { return string.Empty; } return string.Format("{0}{1}", str[0].ToUpper(), str.SubString(1)); } } El primer parámetro UcFirst(this string str) con this le decimos a que hace referencia, en este caso es un tipo string, pero podría ser cualquier tipo. Después del primer parámetro, se pueden poner tantos como se quiera, lo que al llamar al método, el “primer” argumento se omite. string nombre = "salvador"; Console.WriteLine(nombre.UcFirst()); // Salvador Al ser una extensión de string al nombre.MyExtension() es como si el método fuera parte del string. 5.2.16 new and override basico Fuentes http://msdn.microsoft.com/es-es/library/ms173153.aspx Cuando usar new y cuando usar virtual/override. Supongamos que tenemos 2 clases 5.2. C# y ASP.NET MVC 141 Documents Documentation, Publicación 0.0.1 class A { public void MethodA() { Console.WriteLine("Metodo en clase A"); } // Es lo mismo que: // public virtual void MethodA() // { // Console.WriteLine("Metodo en clase A"); // } } class B : A { public new void MethodA() { Console.WriteLine("Metodo en clase B"); } } class Test { public static void Main() { A a = new A(); B b = new B(); A ab = new B(); a.MethodA(); // Metodo en clase A b.MethodA(); // Metodo en clase B ab.MethodA(); // Metodo en clase A } } Ahora, si declaramos el método MethodA de la clase A como virtual y el MethodA de la clase B como override, el resultado es el siguiente: class A { public virtual void MethodA() { Console.WriteLine("Metodo en clase A"); } } class B : A { public override void MethodA() { Console.WriteLine("Metodo en clase B"); } } class Test { public static void Main() 142 Capítulo 5. Programacion Documents Documentation, Publicación 0.0.1 { A a = new A(); B b = new B(); A ab = new B(); a.MethodA(); // Metodo en clase A b.MethodA(); // Metodo en clase B ab.MethodA(); // Metodo en clase B } } Con new, si una clase es downgradeada, mostrara el resultado del método base, en cambio con override, lo sobrescribe siempre y muestra el valor de la clase derivada. 5.2.17 Operadores sobrecargables Fuentes http://msdn.microsoft.com/es-es/library/8edha89s%28v=vs.80%29.aspx http://ortizol.blogspot.com.es/2014/04/receta-no-1-21-en-c-sobrecargar-un.html Ejemplo public struct Complex { public int real; public int imaginary; // Constructor. public Complex(int real, int imaginary) { this.real = real; this.imaginary = imaginary; } // Specify which operator to overload (+), // the types that can be added (two Complex objects), // and the return type (Complex). public static Complex operator +(Complex c1, Complex c2) { return new Complex(c1.real + c2.real, c1.imaginary + c2.imaginary); } // Override the ToString() method to display a complex number // in the traditional format: public override string ToString() { return (System.String.Format("{0} + {1}i", real, imaginary)); } } class TestComplex { 5.2. C# y ASP.NET MVC 143 Documents Documentation, Publicación 0.0.1 static void Main() { Complex num1 = new Complex(2, 3); Complex num2 = new Complex(3, 4); // Add two Complex objects by using the overloaded + operator. Complex sum = num1 + num2; // Print the numbers and the sum by using the overridden // ToString method. System.Console.WriteLine("First complex number: {0}", num1); System.Console.WriteLine("Second complex number: {0}", num2); System.Console.WriteLine("The sum of the two numbers: {0}", sum); // Keep the console window open in debug mode. System.Console.WriteLine("Press any key to exit."); System.Console.ReadKey(); } } /* Output: First complex number: 2 + 3i Second complex number: 3 + 4i The sum of the two numbers: 5 + 7i */ 5.2.18 ref and out Sirven para usar variables como referencias en los métodos. Tanto ref, como out, no se pueden usar en parámetros opcionales. Reglas de ref El parámetro pasado al método, ha de estar declarado e inicializado El método se le ha de añadir ‘ref’ (ref int i) Al llamar el método, en el parámetro se ha de volver a usar ‘ref’ LlamarMethod(ref i) Reglas de out El argumento dentro del método (referencia a), se le ha de dar un valor antes de que termine el método. Tanto el parámetro como el argumento, es necesario indicarlo con ‘out tipo nombre’ 5.2.19 Sufijos para tipos numéricos Fuentes http://www.esasp.net/2010/04/sufijos-para-tipos-de-datos-numericos.html 144 Capítulo 5. Programacion Documents Documentation, Publicación 0.0.1 long float double decimal uint ulong L F D (opcional?) M UI (opcional?) UL (opcional?) short, int, ushort No tienen sufijo. 5.2.20 Tipos C# to PostgreSQL Fuentes http://stackoverflow.com/questions/845458/postgresql-and-c-sharp-datatypes http://npgsql.projects.pgfoundry.org/docs/manual/UserManual.html Postgresql int8 bool bytea date float8 int4 money numeric float4 int2 text time timetz timestamp timestamptz interval varchar inet bit uuid array NpgsqlDbType Bigint Boolean Bytea Date Double Integer Money Numeric Real Smallint Text Time Time Timestamp TimestampTZ Interval Varchar Inet Bit Uuid Array System.DbType Enum Int64 Boolean Binary Date Double Int32 Decimal Decimal Single Int16 String Time Time DateTime DateTime Object String Object Boolean Guid Object .Net System Type Int64 Boolean Byte[] DateTime Double Int32 Decimal Decimal Single Int16 String DateTime DateTime DateTime DateTime TimeSpan String IPAddress Boolean Guid Array 5.2.21 Upcast y Downcast Fuentes http://www.programacion.com/foros/java-basico/que_es_downcasting_170402 Queremos guardar una serie de objetos Silla en un ArrayList. El ArrayList sólo admite objetos de tipo Object, pero como Silla hereda de Object (como todos los objetos) puedes meter sillas directamente en el ArrayList: ArrayList miLista = new ArrayList(); miLista.add(new Silla()); 5.2. C# y ASP.NET MVC 145 Documents Documentation, Publicación 0.0.1 Cuando metes un objeto Silla en un ArrayList, Jaa hace un cast implícito al tipo Object. Esto se conoce como “upcasting”, es decir, moldear un objeto al tipo de una de sus superclases. Ahora bien, si necesitamos recuperar uno de esos objetos Silla, debemos hacer lo siguiente: Silla s = (Silla)miLista.get(0); El cast es necesario porque el método get() devuelve objetos de tipo Object. Pues bien, a esta operación se le llama “downcasting”, porque estás moldeando un objeto a una de sus subclases. Ahora cuidado: no puedes moldear un objeto Silla a Object y luego moldear ese Object a Mesa, por ejemplo, porque no funcionará. Sólo puedes hacer upcasting y downcasting dentro de la jerarquía de herencia del objeto, o dicho de otra forma, sólo puedes moldear el objeto a una de las clases comprendidas entre la clase Object y el tipo original del objeto (ambos inclusive), pasando por todas sus superclases. 5.2.22 C# Virtual Fuentes http://msdn.microsoft.com/es-es/library/9fkccyh4.aspx La palabra clave virtual se utiliza para modificar un método, propiedad, indizador o declaración de evento y permite invalidar cualquiera de estos elementos en una clase derivada. No puede utilizar el modificador virtual con los modificadores static, abstract, private u override. Para poder sobre-escribir un método (por ejemplo) en una subclase, es necesario que la clase padre tenga declarado un virtual. Por ejemplo class A { public void Mostrar() {} } class B : A { public override void Mostrar() {} } La class B daría error, por que el método Mostrar() en la clase A, no se deja sobre-escribir, para poder hacerlo, vasta con declarar el método de la clase A como virtual. class A { public virtual void Mostrar() {} } class B : A { public override void Mostrar() {} } Cuando simplemente se quiere “sobre-escribir un método padre”: class A { public virtual void Mostrar() {} } class B : A { 146 Capítulo 5. Programacion Documents Documentation, Publicación 0.0.1 public new void Mostrar() {} } Ver new and override basico , para ver las diferencias entre new y override. Scripts 5.2.23 C# Scripts Calcular Tiempo de Ejecución de un Programa using System.Diagnogtics; Stopwatch sw = new Stopwatch(); sw.Start(); // También se puede inicializar con un método static Stopwatch sw = Stopwatch.StartNew(); int contador = 0; for (int i = 0; i < 27; i++) { for (int j = 0; j < 27; j++) { for (int k = 0; k < 22; k++) { for (int g = 0; g < 100000; g++) { contador++; } } } } Console.WriteLine(contador); sw.Stop(); Console.WriteLine(sw.Elapsed.TotalSeconds); Envío Email usando SMTP C# using System.Net.Mail; /// <summary> /// Enviar un email /// </summary> /// <returns>true en caso de éxito, false en caso contrario.</returns> public bool Send() { try { MailMessage mail = new MailMessage(); mail.IsBodyHtml = true; 5.2. C# y ASP.NET MVC 147 Documents Documentation, Publicación 0.0.1 mail.From = new MailAddress("[email protected]", "snicoper"); mail.To.Add(new MailAddress("[email protected]", "Salvador Nicolas")); mail.Subject = "Mensaje de prueba desde C# .NET"; mail.Body = "<h1>Mensaje de prueba!!<h1>"; using (SmtpClient smtp = new SmtpClient()) { smtp.Host = "smtp.gmail.com"; smtp.Port = 587; smtp.EnableSsl = true; System.Net.NetworkCredential NetworkCred = new System.Net.NetworkCredential(); NetworkCred.UserName = "[email protected]"; NetworkCred.Password = "123456"; smtp.UseDefaultCredentials = true; smtp.Credentials = NetworkCred; smtp.Send(mail); } } catch (Exception) { return false; } return true; } Nota: También puede interesar. https://github.com/jstedfast/MailKit https://github.com/jstedfast/MimeKit Lanzar Finalizador de Clase C# Fuentes http://stackoverflow.com/a/1987288 http://msdn.microsoft.com/es-es/library/system.idisposable.dispose%28v=vs.110%29.aspx http://canyouhearthebits.wordpress.com/2008/08/08/como-implementar-correctamente-idisposable/ Un finalizador de clase, es una método que se ejecuta cuando el objeto es destruido, pero no por el usuario, si no por el GC. En C# no existe el “destructor de clase”. Advertencia: Ver IDisposable(abajo) para hacer este tipo de cosas Mi problema fue con un código como el siguiente class Point { public Point() { 148 Capítulo 5. Programacion Documents Documentation, Publicación 0.0.1 Console.WriteLine(1); } ~Point() { Console.WriteLine(2); } } class Program { static void Main(string[] args) { Point p = new Point(); p = null; Console.WriteLine(3); } } Resultado 1 3 2 En teoría, o según lo hace PHP, cuando se destruye un objeto (obj = null), o cuando finaliza por que ya no se referencia mas, el método __destruct() es llamado. En C#, que se llama finalilzador, no hace lo mismo, al menos no cuando se destruye de manera explicita asignándole ‘null’. Encontré en los comentarios un código, y al menos me hizo lo que esperaba que hiciera, que lanzara el finalizador en cuanto lo destruyera. Point p = new Point(); p = null; GC.Collect(); GC.WaitForPendingFinalizers(); Console.WriteLine(3); Ahora el resultado es 1 2 3 Interfaz IDisposable (Recomendado) Otra manera, seria que la clase implemente la interfaz IDisposable con un único miembro Dispose, dentro del método se podrían añadir la limpieza necesaria de la clase. Lectura Escritura archivos Básico Fuentes http://msdn.microsoft.com/es-es/library/system.io.filestream%28v=vs.110%29.aspx 5.2. C# y ASP.NET MVC 149 Documents Documentation, Publicación 0.0.1 using System.IO Comprobar si un archivo existe if (!File.Exists(filePath)) { throw new FileNotFoundException(); } Escribir en un archivo Si existe, y lo que queremos hacer es escribir en el: using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Write)) { } Con FileMode, decimos el modo de abrir el archivo, ejeplo, Append, OpenOrCreate, etc. http://msdn.microsoft.com/es-es/library/system.io.filemode%28v=vs.110%29.aspx Con FileAccess, decimos el acceso al archivo, ejemplo, Read, ReadWrite o Write. Pienso que es la mejor manera de abrir un recurso, por que podemos decirle el modo y acceso al recurso. Ahora con StreamWriter, añadimos los datos. Cuando se usan varios recursos, es posible poner uno seguido del otro, como en el siguiente ejemplo. El compilador generará los bloques try-finally anidados apropiados. using (FileStream fs = new FileStream(archivo, FileMode.OpenOrCreate, FileAccess.Write)) using (StreamWriter sw = new StreamWriter(fs)) { sw.Write("Nuevo texto"); sw.WriteLine("Nueva linea"); } Leer de un archivo También es posible abrirlo con FileStream, pero como solo se trata de leerlo, tambien lo puedo hacer con StreamReader. Primero, seria comprobar si el archivo existe y en caso de existir, abrirlo using (StreamReader sr = new StreamReader(filePath)) { //Leer el archivo } Crear Excepciones personalizadas 150 Capítulo 5. Programacion Documents Documentation, Publicación 0.0.1 public class CountIsZeroException : Exception { public CountIsZeroException() { } public CountIsZeroException(string message) : base(message) { } public CountIsZeroException(string message, Exception innerException) : base(message, innerException) { } } Redimensionar imagen C# using System.Drawing; using System.Drawing.Drawing2D; using System.IO; namespace HaveYouSeenMe.Models.Business { public class PetManagement { /// <summary> /// Redimensiona una imagen a un ancho/alto dado. /// </summary> /// <param name="filename">Nombre del archivo, incluida extension</param> /// <param name="filepath">Carpeta contenedora para guardar</param> /// <param name="thumbWi">Ancho de la imagen a redimensionar</param> /// <param name="thumbHi">Alto de la imagen a redimensionar</param> /// <param name="maintainAspect">Mantener proporciones ancho/alto?</param> public static void CreateThumbnail(string filename, string filepath, int thumbWi, int thumbHi, bool maintainAspect) { // Do nothing if the original is smaller than the designated // thumbnail dimensions var originalFile = Path.Combine(filepath, filename); var source = Image.FromFile(originalFile); if (source.Width <= thumbWi && source.Height <= thumbHi) return; Bitmap thumbnail; try { int wi = thumbWi; int hi = thumbHi; if (maintainAspect) { // Maintain the aspect ratio despite the thumbnail size parameters if (source.Width > source.Height) { wi = thumbWi; 5.2. C# y ASP.NET MVC 151 Documents Documentation, Publicación 0.0.1 hi = (int)(source.Height * ((decimal)thumbWi / source.Width)); } else { hi = thumbHi; wi = (int)(source.Width * ((decimal)thumbHi / source.Height)); } } thumbnail = new Bitmap(wi, hi); using (Graphics g = Graphics.FromImage(thumbnail)) { g.InterpolationMode = InterpolationMode.HighQualityBicubic; g.FillRectangle(Brushes.Transparent, 0, 0, wi, hi); g.DrawImage(source, 0, 0, wi, hi); } var thumbnailName = Path.Combine(filepath, "thumbnail_" + filename); thumbnail.Save(thumbnailName); } catch { } } } } 5.3 Html Css Categorias: 5.3.1 Combinadores CSS Diferentes combinadores en CSS > + ~ Cualquier elemento hijo de p, sin importar si es directo o no p a Cualquier elemento hijo de p, ha de ser un hijo directo de p p > a Primer hermano de article article + p Todos los hermanos de article article ~ p 5.3.2 Compativilidad HTML5 con IEs viejos <!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Pagina de practicas</title> <!--[if lt IE 9]> <script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script> 152 Capítulo 5. Programacion Documents Documentation, Publicación 0.0.1 <![endif]--> </head> <body> </body> </html> 5.3.3 font-face @font-face { font-family: "Nombre Fuente"; src: url(’carpeta/fuente.ttf’) format(’truetype); font-weight: normal; // Poner siempre el peso de la fuente } 5.3.4 Tag datalist para formulario Con list, lista en una campo de texto, una lista de elementos <input type="text" list="nombres"> <datalist id="nombres"> <option value="pedro_romero">Pedro Romero</option> <option value="antonio_fili">Antonio Filiprim</option> <option value="antonia_fila">Antonia Filiprina</option> <option value="anabel_ro">Anabel Rodriguez</option> </datalist> 5.3.5 Forms Input Types <input <input <input <input <input <input <input <input <input <input <input <input <input type="color"> type="date"> type="datetime"> type="datetime-local"> type="email"> type="month"> type="number"> type="range"> type="search"> type="tel"> type="time"> type="url"> type="week"> 5.3.6 Formularios Autocomplete OFF <form> <input type="text" autocomplete="off"> </form> Para ponerlo en todo el formulario, simplemente añadirlo en la etiqueta form 5.3. Html Css 153 Documents Documentation, Publicación 0.0.1 <form autocomplete="off"></form> 5.3.7 keyframes css keyframes es una animación que puede hacerse infinitamente Lo primo es crear una animación: @keyframes 0% { /* } 50% { /* } 100% { /* } } nombreKeyFrame { reglas css */ reglas css */ reglas css */ Para ejecutar el keyframe: .mi_regla_css { /* Aqui las reglas css */ animacion: nombreKeyFrame 1.5s infinite ease-in; } 5.3.8 Medidas relativas tipografías y cajas Para hacer paginas Web Responsive Desing solo se ha de tener presente unos pequeños cálculos. Aquí me anoto algunas reglas básicas a tener en cuenta. En la regla del body en css, poner el font-size: 16px La regla #page (El contenedor) en %, por ejemplo 98 %, aunque si no se quiere pasar de una anchura, especificarlo con max-width. En cuanto tamaño, no ponerlo en el body por si acaso, para mas adelante Tomar como referencia 960px al hacer la división en contenidos hijos de #page aunque sea un %, contar siempre como si fueran 960px Los cálculos para los ems: fuente_deseada_px / fuente_padre_px = resultado Para poner un h1 que ahora esta con 16px (con resset de Eric Meyer) en 24px, seria: 24 / 16 = 1.5 Serian 1.5em Los cálculos para los % seria: contenedor_deseado / contenedor_padre = resultado Si #page es de 960px y queremos que el header sea de 940px 940 / 960 = 0,979166667 Eliminamos el 0, y pasamos 2 decimales el 979166667 quedando en 97.9166667 % 154 Capítulo 5. Programacion Documents Documentation, Publicación 0.0.1 Acordarse que los borders, rellenos y margenes van a parte. Si queremos un contenedor completo de 200px con un border de 1px, margin de 10px y un padding de 10px sobre un contenedor de 960px el resultado seria el siguiente: Omito en la suma el relleno, por eso 178px margin 20px + border 2px = 22px - 200px = 178px de contenido Contenido: 178px / 960px = 18.5416667% margen: 10px / 960px = 1.0416667% relleno: 10px / 960px = 1.0416667% borde: 1px x2 ----------------------------------border: 1px solid red; width: 18.5416667%; margin: 1.0416667%; padding: 1.0416667%; Para cajas con ems en referencia a la tipografía Ejemplo: Tamaño fuente: 16px; Caja de 400px; 400 / 16 = 25 25ems seria una caja de 400px, pero si se aumenta a 18 en un futuro la caja pasaría a ser de 448px, tener cuidado con esto. 5.4 Javascript Categorias: 5.4.1 Apply y Call Javascript Los metodos apply y call, son metodos que tienen todas las funciones de javascript. Estos métodos nos permiten llamar a una function como si fuese el método de otro objeto. function A(nombre) { this.nombre = nombre; } function B(apellido) { return this.nombre + ’ ’ + apellido; } var o = new A(’Salvador’); B.apply(o, [’Nicolas’]); // Salvador Nicolas La diferencia de apply y call, es la manera que se le pasan los argumentos B.call(objeto, param1, param2, param3); B.apply(objeto, [param1, param2, param3]); 5.4. Javascript 155 Documents Documentation, Publicación 0.0.1 5.4.2 Atributos de la etiqueta <script> La etiqueta <script> tiene seis atributos: async: Opcional. Indica que el script debe descargarse solo cuando el contenido esta ya descargado. Solo es valido para si tiene el atributo src (es decir, para js externo) El problema es que no se garantiza el orden en que los scripts se ejecutan. charset: Opcional. El juego de caracteres del código especificado mediante el atributo src. defer: Opcional. Es parecido a async, lo que hace que aunque este en la cabecera del html lo trata como si estuviera al final del documento. En caso de necesitarlo, usar async. languaje: Opcional. Desaprobado, para el indicar el tipo de lenguaje/script Javascript, Javascript1.2 o SBScript por ejemplo. src: Opcional. La ruta del arhico .js type: Opcional. Para indicarle al navegador el tipo mime de script Normalmente se ha usado text/javascript, el tipo mime seria application/x-javascript. Actualmente no es necesario, ya que por defecto, el navagador lee text/javascript Para evitar problemas, siempre que sea posible, añadir las etiquetas <script> antes del </body> Un articulo interesante sobre defer y async http://www.marketingprofesional.net/ejecucion-asincronica-de-scriptscon-el-atributo-async-y-defer-para-mejorar-la-carga-de-una-web/ 5.4.3 Comprobar si una variable existe Para comprobar si una variable existe, es decir, si ha sido declarada, aunque no inicializada, para que no de error en modo strict if (!variable) {} // Error, si la variable no ha sido declarada if (typeof variable !== ’undefined’) {} // Correcto Ten en cuanta que el valor devuleto por typeof es undefined en estos casos y que ‘undefined’ es un string. typeof siempre devuelve un string! var var1; typeof var1; // ’undefined’ typeof var2; // ’undefined’ Pero por lo menos, aunque se aya inicializado pero no asignado un valor, se puede volver al crear y asignar un valor si es necesario sabiendo que no modificaremos un valor existente. 156 Capítulo 5. Programacion Documents Documentation, Publicación 0.0.1 if (typeof var2 === ’undefined’) { var var2 = ’Creando o asignando un valor en "var2"’; } console.log(var2); // Creando o asignando un valor en "var2" 5.4.4 Métodos de Date JS getTime() Devuelve una representación en milisegundo de la fecha, lo mismo que valuesOf(), setTime(milisegundos) Establece una representación en milisegundos de una fecha, cambiando la fecha. getFullYear() Devuelve 4 digitos del año (2013) en vez de 2 (13). getUTCFullGear() Devuelve 4 digitos para el año en UTC. setFullYear(year) Establecer el año de la fecha, el año se a de establecer con 4 dígitos. setUTCFullYear(year) Lo mimso que setFullYear() pero el año en UTC getMonth() Obtener el mes de una fecha, donde 0 representa enero y 11 diciembre. getUTCMonth() Lo mimso que getMonth(), pero en UTC setMonth(month) Establecer el mes de una fecha, donde 0 es enero y 11 diciembre. setUTCMonth(Month) Lo mismo que setMonth(month) pero en UTC getDate() Devuelve el dia del mes (1 - 31) de una fecha. getUTCMonth() Igual que getDate() pero en UTC setDate(date) Establecer el día de una fecha (1 - 31), si el día es mayor a los días que tiene el mes, el mes también sera incrementado. setUTCDate(date) Lo mismo que setDate(date) pero en UTC getDay() Obtener el día de la semana como un numero, donde 0 es representado por domingo y 6 como sábado getHours() Obtener la hora como un numero entre 0 y 23 getUTCHours() Lo mismo que getHours() pero UTC setHours(hours) Establecer la hora de una fecha, hours es un valor numérico entre 0 y 23 Si el valor es mayor de 23, el día es incrementado. setUTCHours(hours) Igual que setHours(hours) pero en UTC getMinutes() Obtener el minuto de una hora entre 0 y 59 getUTCMinutes() Lo mismo que getMinutes() pero en UTC setMinutes(minutes) Establecer los minutos en una fecha entre 0 y 59, si es mayor de 59, la hora sera incrementada. setUTCMinutes(minutes) Lo mismo que setMinutes(minutes) pero en UTC getSeconds() Obtener los segundos de una fecha, numeros entre 0 y 59 getUTCSeconds() Lo mismo que getSeconds() pero en UTC setSeconds(seconds) Establecer los segundos en una fecha, si los segundos es mayor a 59 los minutos se incrementan. setUTCSeconds(seconds) Igual que setSeconds(seconds) pero en UTC getMilliseconds() Obtener la fecha en milisegundos getUTCMilliseconds() Lo mismo que getMilliseconds() pero en UTC 5.4. Javascript 157 Documents Documentation, Publicación 0.0.1 setMilliseconds(milliseconds) Establecer una fecha pasando los milisegundos setUTCMilliseconds(milliseconds) Lo mismo que setMilliseconds(milliseconds) pero en UTC getTimezoneOffset() Devuelve la diferencia en minutos de la hora local respecto a UTC Por ejemplo, para mi seria -120 5.4.5 Saber el números de argumentos se han pasado en una función Fuentes https://developer.mozilla.org/es/docs/Referencia_de_JavaScript_1.5/Funciones/arguments Para saber cuantos argumentos se han pasado en una función, se ha de usar el objeto arguments. Arguments, aunque es un objeto, se trata como si fuera un array. function pruebaArguments() { arguments.length; // 3 arguments[1]; // ’dos’ } pruebaArguments(1, ’dos’, false); 5.4.6 Scroll Up To Fuentes http://jsfiddle.net/5bNmH/1/ Html Usa el glyphicon de Bootstrap <diV class="go-top"> <span class="glyphicon glyphicon glyphicon-chevron-up"></span> </diV> Javascript Requiere Jquery $(document).ready(function() { // Show or hide the sticky footer button $(window).scroll(function() { if ($(this).scrollTop() > 200) { $(’.go-top’).fadeIn(200); } else { $(’.go-top’).fadeOut(200); } }); // Animate the scroll to top $(’.go-top’).click(function(event) { event.preventDefault(); 158 Capítulo 5. Programacion Documents Documentation, Publicación 0.0.1 $(’html, body’).animate({scrollTop: 0}, 300); }) }); CSS .go-top { position: fixed; bottom: 2em; right: 2em; text-decoration: none; color: white; background-color: rgba(0, 0, 0, 0.3); font-size: 12px; padding: 1em; display: none; cursor: pointer; } .go-top:hover { background-color: rgba(0, 0, 0, 0.6); } 5.4.7 toString y valueOf Tanto toString como valueOf se puede usar para obtener datos rápidamente de un objeto. valueOf tiene precedencia sobre toString. Cuando se quiere convertir un objeto en un dato primitivo, javascript intenta por medio de valueOf obtener un datos primitivo. En caso de no existir, comprobara si toString existe y en caso de que tampoco exista, devolverá [object object] Por ejemplo var o = { titulo: ’Libro de javascript’, paginas: 656, valueOf: function() { return this.paginas; }, toString: function() { return this.paginas + 100; } }; var num = 700; num < o; // false: num no es menor a o.valueOf() que devuelve 656 num < o.toString(); // true, 700 es menor que (656 + 100) De manera implicita si solo se llama al objeto “o”, usara para la conversion valueOf. var o = { titulo: ’Libro de javascript’, paginas: 656, 5.4. Javascript 159 Documents Documentation, Publicación 0.0.1 //valueOf: function() { // return this.paginas; //}, toString: function() { return this.paginas + 100; } }; var num = 700; num < o; // true: ahora de manera implicita ha llamado a toString al no estar // defina valueOf var o = { titulo: ’Libro de javascript’, paginas: 656, //valueOf: function() { // return this.paginas; //}, //toString: function() { // return this.paginas + 100; //} }; var num = 700; num < o; // false: o devuelve [object object] 5.4.8 Valores como constantes en funciones Para crear un valor constante en una función, una manera simple seria crear una variable fuera de la función (una variable global) y después dentro de la funcionan cambiar el valor de dicha variable global. /* Opcion 1 */ var num = 0; function aumentar() { return ++num; } aumentar(); // 1 aumentar(); // 2 aumentar(); // 3 Una forma mas interesante seria de la siguiente manera. Como las funciones son un tipo de objeto, crear una propiedad de función y luego dentro de la función incrementar el valor. /* Opcion 2 */ // aumentar.num = 0; // Es posible crearlo antes de la definición de la funcionan function aumentar() { aumentar.num = (aumentar.num === undefined) ? 1 : ++aumentar.num; return aumentar.num; } aumentar(); // 1 aumentar(); // 2 160 Capítulo 5. Programacion Documents Documentation, Publicación 0.0.1 La 3º forma, seria con un cierre (Recomendada) var aumentar = (function() { var num = 1; return function() { return num++; }; })(); aumentar(); // 1 aumentar(); // 2 5.5 MariaDB Categorias: 5.5.1 Claves Foráneas MariaDB Para la creación de las claves foráneas, existen 2 tablas, una tabla padre que es la que contiene un id único y una tabla que contiene un id que hace referencia a la clase padre. Nota: Me he dado cuenta que para que se pueda crear bien la foreign key, si la tabla padre la id es UNSIGNED la id hija ha de serlo también. -- Clase padre CREATE TABLE IF NOT EXISTS usuarios ( id_usr INT UNSIGNED NOT NULL AUTO_INCREMENT, nombre_usr VARCHAR(30) NOT NULL, PRIMARY KEY(id_usr) ) ENGINE = InnoDB; La clase hija tiene una id que hace referencia a la clase padre y no se podrá poner una id donde no exista en la clase padre. Las id ha de ser un tipo KEY/INDEX, PRIMARY KEY, etc, en caso de no existir a partir de MySQL 5 crea un index para las tablas. -- Clase hija CREATE TABLE IF NOT EXISTS comentarios ( id_cmt INT UNSIGNED NOT NULL AUTO_INCREMENT, id_usr INT UNSIGNED NOT NULL, comentario_cmt TEXT NOT NULL, PRIMARY KEY(id_cmt), INDEX(id_usr), FOREIGN KEY (id_usr) REFERENCES usuarios(id_usr) ON DELETE CASCADE ON UPDATE NO ACTION ) ENGINE = InnoDB; Las clases hijas son las que tienen la foreign key y hay dos formas de crear una foreign key, o bien dentro de la creación de la tabla ( FOREIGN KEY (column_id) REFERENCES tabla_padre(column_id) 5.5. MariaDB 161 Documents Documentation, Publicación 0.0.1 ON DELETE CASCADE ON UPDATE NO ACTION ) o con ALTER TABLE: ALTER TABLE tabla_hija ADD CONSTRAINT FK_tabla_hija FOREIGN KEY (column_id) REFERENCES tabla_padre(column_id) ON UPDATE CASCADE ON DELETE RESTRICT; Donde CASCADE hay 4 tipos: [ON DELETE {RESTRICT | CASCADE | SET NULL | NO ACTION}] [ON UPDATE {RESTRICT | CASCADE | SET NULL | NO ACTION}] CASCADE: Borra o actualiza el registro en la tabla padre y automáticamente borra o actualiza los registros coincidentes en la tabla hija. Tanto ON DELETE CASCADE como ON UPDATE CASCADE están disponibles en MySQL 5.0. Entre dos tablas, no se deberían definir varias cláusulas ON UPDATE CASCADE que actúen en la misma columna en la tabla padre o hija. SET NULL: Borra o actualiza el registro en la tabla padre y establece en NULL la o las columnas de clave foránea en la tabla hija. Esto solamente es válido si las columnas de clave foránea no han sido definidas como NOT NULL. MySQL 5.0 soporta tanto ON DELETE SET NULL como ON UPDATE SET NULL. NO ACTION: En el estándar ANSI SQL-92, NO ACTION significa ninguna acción en el sentido de que un intento de borrar o actualizar un valor de clave primaria no sera permitido si en la tabla reverenciada hay una valor de clave foránea relacionado. (Gruber, Mastering SQL, 2000:181). En MySQL 5.0, InnoDB rechaza la operación de eliminación o actualización en la tabla padre RESTRICT: Rechaza la operación de eliminación o actualización en la tabla padre. NO ACTION y RESTRICT son similares en tanto omiten la cláusula ON DELETE u ON UPDATE. (Algunos sistemas de bases de datos tienen verificaciones diferidas o retrasadas, una de las cuales es NO ACTION. En MySQL, las restricciones de claves foráneas se verifican inmediatamente, por eso, NO ACTION y RESTRICT son equivalentes.) SET DEFAULT: Esta acción es reconocida por el procesador de sentencias (parser), pero InnoDB rechaza definiciones de tablas que contengan ON DELETE SET DEFAULT u ON UPDATE SET DEFAULT. 5.5.2 Consulta fechas Consultas básicas de MySQL Comparar fechas, por ejemplo buscar usuarios que han nacido en un mes actual SELECT * FROM usuarios WHERE MONTH(fecha_nacimiento) = MONTH(CURDATE()); Con CURDATE() o NOW() dentro de MONTH(), DAYOFMONTH(), YEAR(), etc, compara una fecha pasada con la fecha actual. El libro de MySQL de Paul Dubois en la pagina 90+ muestra ejemplos de fechas. 162 Capítulo 5. Programacion Documents Documentation, Publicación 0.0.1 5.5.3 MariaDB Data Types Fuentes https://mariadb.com/kb/en/mariadb/mariadb-documentation/data-types/ http://www.techonthenet.com/mariadb/datatypes.php 5.5.4 Operador IN El operador IN() es util para cuando se buscan varios valores dentro de una consulta. La forma tradicional seria SELECT * FROM members WHERE id_member = ’10’ OR id_member = ’20’; Lo que devolvería 2 usuarios, id 10 e id 20 Otra manera para hacerlo seria con IN() SELECT * FROM members WHERE id_member IN(’10’, ’20’); 5.5.5 Ordenar Resultado Para la ordenación de resultados se hace con ORDER BY nombre_col ASC|DESC Para ordenar varios grupos ORDER BY col1 ASC, col2 DESC Lo que hace es ordenar col1 en ascendente y dentro de ese grupo, col2 lo ordena de manera descendente. 5.5.6 Poner password a un usuario desde la consola SET PASSWORD FOR ’user’@’localhost’ = PASSWORD(’pass’); Otra manera ya que los passwords y usuarios están en la tabla mysql.user seria UPDATE user SET user.Password = PASSWORD(’123456’) WHERE user.Host = ’localhost’ AND user.User = ’nico’; Siempre y cuando el user sea nico y el host localhost Para ver todos los usuarios, host y si alguien no tiene pass: SELECT user.User, user.Host, user.Password FROM user; 5.5. MariaDB 163 Documents Documentation, Publicación 0.0.1 5.5.7 Recuperar password root Fuentes http://www.guatewireless.org/os/linux/mysql-recuperar-la-contrasena-de-root-en-5-pasos/ /etc/init.d/mysql stop mysqld_safe --skip-grant-tables & mysql -u root use mysql; update user set password=PASSWORD("contraseña") where User=’root’; flush privileges; quit /etc/init.d/mysql stop /etc/init.d/mysql start mysql -u root -p 5.6 PCRE - Perl Compatible Regular Expressions Categorias: 5.6.1 Caracteres con significado en PCRE Todos estos caracteres se han de escapar ya que tienen un significado especial. . \ + * ? [ ^ ] $ ( ) { } = ! < > | : 5.6.2 Detalles basicos en PCRE Fuentes http://es.php.net/manual/es/book.pcre.php http://www.php.net/manual/es/regexp.reference.meta.php http://www.php.net/manual/es/regexp.reference.escape.php#regexp.reference.escape Meta-caracteres (*) 0 o mas instancias de dicha expresión regular (|) Expresión regular compuesta por la expresión regular izquierda o derecha (^) Para identificar el inicio de una cadena ([^a-z]) Sirve para decir que no puede contener la expresión, en este caso cualquier letra en minúsculas. ($) Para identificar el final de una cadena (.) Para identificar la expresión “cualquier carácter” 164 Capítulo 5. Programacion Documents Documentation, Publicación 0.0.1 (+) Expresión regular compuesta por una o mas instancias de dicha expresión regular (?) Expresión regular compuesta por 0 o 1 instancia de dicha expresión regular ({max,min}) Expresión regular compuesta por un numero de variable de instancias de dicha Expresión Regular. El parámetro min indica el mínimo de numero de instancias aceptables, mientras que el parámetro max, si lo hubiera, indica el máximo numero de instancias aceptables. Si solo se encuentra min y la coma disponible, no existe ningún limite superior en cuanto al numero de instancias que podemos encontrar en la cadena. Por ultimo si solo definimos min sin la coma significara el único numero de instancias aceptable. ([]) Sirve para identificar grupos de caracteres aceptables para una determinada posición. Secuencias de escape (w) Representa un carácter de “palabra” y es equivalente a la expresión [a-zA-Z0-9_] (W) Representa lo opuesto a w y es equivalente a [^a-zA-Z0-9_] (s) Representa un carácter de espacio en blanco (S) Representa un carácter que no es un espacio en blanco (d) Representa un dígito, equivalente a [0-9] (D) Representa un carácter que no es un dígito, equivalente a [^0-9] (n) Representa un carácter de nueva linea (r) Representa un carácter de retorno de carro (t) Representa un carácter de tabulación 5.6.3 Verificacion de Email con PCRE PHP <?php $pattern = ’/^([a-z0-9])(([-a-z0-9._])*([a-z0-9]))*\@([a-z0-9])’ . ’(([a-z0-9-])*([a-z0-9]))+(\.([a-z0-9])([-a-z0-9_-])?([a-z0-9])+)+$/i’; Python pattern = ’{0}{1}’.format( r’^([a-z0-9])(([-a-z0-9._])*([a-z0-9]))*@([a-z0-9])’, r’(([a-z0-9-])*([a-z0-9]))+(.([a-z0-9])([-a-z0-9_-])?([a-z0-9])+)+$’) Javascript Advertencia: POR HACER 5.6. PCRE - Perl Compatible Regular Expressions 165 Documents Documentation, Publicación 0.0.1 C# using System.Text.RegularExpressions; string pattern = @"^([a-z0-9])(([-a-z0-9._])*([a-z0-9]))*\@([a-z0-9])" + @"(([a-z0-9-])*([a-z0-9]))+(\.([a-z0-9])([-a-z0-9_-])?([a-z0-9])+)+$"; Regex regex = new Regex(pattern, RegexOptions.IgnoreCase); bool isValid = regex.IsMatch("[email protected]"); HTML5 Advertencia: No probada ^([a-z0-9])(([-a-z0-9._])*([a-z0-9]))*\@([a-z0-9])(([a-z0-9-])*([a-z0-9]))+(\.([a-z0-9])([-a-z0-9_-]) 5.7 PHP Categorias: 5.7.1 Constantes Utiles PHP PATH_SEPARATOR En windows es ; y en unix : Útil por ejemplo para un set_include_path DIRECTORY_SEPARATOR En windows es \ y en unix / Útil para rutas PHP_EOL End of line, lo mismo que "\n" PHP_OS Sistema donde se encuentra ejecutando php PHP_VERSION Versión de PHP 5.7.2 Disable function En php.ini una directiva es disable_function = pasando en un string y separados por comas, es posible desactivar funciones como eval u otras potencialmente peligrosas para el proyecto. Esto solo funciona en php.ini, no con php_value (apache) o ini_set() 5.7.3 IP Real de un usuario <?php function getRealIP() { if (!empty($_SERVER[’HTTP_CLIENT_IP’])) return $_SERVER[’HTTP_CLIENT_IP’]; if (!empty($_SERVER[’HTTP_X_FORWARDED_FOR’])) return $_SERVER[’HTTP_X_FORWARDED_FOR’]; 166 Capítulo 5. Programacion Documents Documentation, Publicación 0.0.1 return $_SERVER[’REMOTE_ADDR’]; } 5.7.4 password_hash Fuentes http://php.net/manual/es/function.password-hash.php 5.7.5 Saber tipo mime de un archivo mirar por fopen_file() <?php shell_exec(’file -i’.escapeshellcmd($nombreArchivoSubido)); 5.8 PostgreSQL Categorias: 5.8.1 PK, FK y UNIQUE Psql Fuentes http://www.postgresql.org/docs/9.3/static/ddl-constraints.html create table usuarios( id SERIAL, nombre VARCHAR(50) NOT NULL, password VARCHAR(40), CONSTRAINT pk_usuarios PRIMARY KEY(id) ); create table tablon_anuncios( id SERIAL, id_usuario INT NOT NULL, fecha INT NOT NULL DEFAULT EXTRACT(epoch from now()), titulo VARCHAR(255) NOT NULL, contenido text NOT NULL, CONSTRAINT pk_tablon_anuncios PRIMARY KEY(id_usuario), CONSTRAINT fk1_tablon_anuncios FOREIGN KEY(id_usuario) REFERENCES usuarios(id) MATCH SIMPLE ON UPDATE CASCADE ON DELETE CASCADE ); -- Crea la clave primaria de la tabla CONSTRAINT pk_tablon_anuncios PRIMARY KEY(id_usuario), 5.8. PostgreSQL 167 Documents Documentation, Publicación 0.0.1 -- Le dice, que la col id_usuario de la tabla tablon_anuncios -- es la foreign key, que usa como referencia la tabla usuarios -- col id CONSTRAINT fk1_tablon_anuncios FOREIGN KEY(id_usuario) REFERENCES usuarios(id) MATCH SIMPLE ON UPDATE CASCADE ON DELETE CASCADE -- unique CONSTRAINT unq_tablon_anuncios UNIQUE(nombre_tabla) 5.8.2 Comandos consola Postgres Nota: Cuando usa $, significa que esta en el shell, cuando no tiene nada es que esta en psql Login usuario postgres: $ sudo su - postgres Creación de un usuario: CREATE USER nombre_usuario WITH password ’123456’ Eliminar usuario: DROP USER nombre_usuario Crear base de datos: CREATE DATABASE nombre_db WITH OWNER nombre_usuario; Eliminar base de datos: DROP DATABASE nombre_db Acceder database con usuario x: psql -U nombre_usuario nombre_db Obtener ayuda: \h Quit \q Leer comandos desde un archivo: \i input.sql Dump db a un archivo: $ pg_dump -U nombre_usuario nombre_db > db.out Dump todas las bases de datos: $ sudo su - postgres $ pg_dumpall > /var/lib/pgsql/backups/dumpall.sql 168 Capítulo 5. Programacion Documents Documentation, Publicación 0.0.1 Restaurar db: $ sudo su - postgres $ psql -f /var/lib/pgsql/backups/dumpall.sql mydb List databases: \l List tables in database: \d Describe table: \d table_name Describe table: \d+ table_name Use database_name: \c nombre_db Show users: select * from "pg_user"; # tambien \du Escribir las consultas en tu editor favorito: \e Activar/Desactivar ver el tiempo del query: \timing Reset a user password as admin: ALTER USER usertochange WITH password ’new_passwd’; Select version SELECT version(); Change Database Owner: ALTER DATABASE database_name OWNER TO new_owner; Create a superuser user: ALTER USER mysuper WITH SUPERUSER; # or even better ALTER USER mysuper WITH SUPERUSER CREATEDB CREATEROLE INHERIT LOGIN REPLICATION Sabar el tamaño usado las tablas en una base de datos: Ver mas: http://www.niwi.be/2013/02/17/postgresql-database-table-indexes-size/ SELECT pg_size_pretty(pg_database_size(’dbname’)); 5.8. PostgreSQL 169 Documents Documentation, Publicación 0.0.1 5.8.3 Crear Database Para crear una base de datos y poner como propietario a alguien: Nota: Crear User sudo -u postgres psql postgres CREATE DATABASE practicas WITH OWNER = snicoper; 5.8.4 Crear User Para crear un usuario: Nota: Crear Database sudo -u postgres psql postgres CREATE USER snicoper WITH PASSWORD ’123456’ NOCREATEDB NOCREATEUSER; 5.8.5 Duplicar tabla en postgresql Fuentes http://www.mkyong.com/database/postgresql-create-table-from-exisiting-table/ CREATE TABLE ’nombre_nueva_tabla’ AS SELECT ’tabla_a_copiar’; Si la tabla tabla_a_copiar esta poblada y no deseamos copiar los datos existentes, se puede poner un WHERE en la consulta. CREATE TABLE ’nombre_nueva_tabla’ AS SELECT ’tabla_a_copiar’ WHERE 1 = 2; Como 1 no es igual a 2, no se insertara ningún dato de la 1º tabla. 5.8.6 Obtener ultimo ID insertado en la db INSERT INTO persons (lastname,firstname) VALUES (’Smith’, ’John’) RETURNING id Ejeplo con Python with psycopg2.connect(conn_string) as conn: with conn.cursor() as cur: cur.execute( "INSERT INTO persons(lastname, firstname) \ VALUES(%s, %s) RETURNING id", (firstname, lastname)) conn.commit() print(cur.fetchone()[0]) 170 Capítulo 5. Programacion Documents Documentation, Publicación 0.0.1 5.9 Python Content: 5.9.1 Desordenar un string import random tamano = 10 abecedario = ’abcdefghijklmopqrstuvwxyz’ desordenar = random.sample(abecedario, tamano) palabra = ’’.join(desordenar) print(palabra) 5.9.2 Enviar email SMTP Fuentes http://www.mkyong.com/python/how-do-send-email-in-python-via-smtplib/ http://docs.python.org/3.3/library/smtplib.html import smtplib to = ’[email protected]’ gmail_user = ’[email protected]’ gmail_pwd = ’yourpassword’ smtpserver = smtplib.SMTP("smtp.gmail.com", 587) smtpserver.ehlo() smtpserver.starttls() smtpserver.ehlo smtpserver.login(gmail_user, gmail_pwd) header = ’To:’ + to + ’\n’ + ’From: ’ + gmail_user + ’\n’ + ’Subject:testing \n’ print header msg = header + ’\n this is test msg from mkyong.com \n\n’ smtpserver.sendmail(gmail_user, to, msg) print ’done!’ smtpserver.close() 5.9.3 Ejemplo de comentarios en un archivo Python # -*- coding: utf-8 -*"""Example Google style docstrings. This module demonstrates documentation as specified by the ‘Google Python Style Guide‘_. Docstrings may extend over multiple lines. Sections are created with a section header and a colon followed by a block of indented text. Example: Examples can be given using either the ‘‘Example‘‘ or ‘‘Examples‘‘ 5.9. Python 171 Documents Documentation, Publicación 0.0.1 sections. Sections support any reStructuredText formatting, including literal blocks:: $ python example_google.py Section breaks are created by simply resuming unindented text. Section breaks are also implicitly created anytime a new section starts. Attributes: module_level_variable (int): Module level variables may be documented in either the ‘‘Attributes‘‘ section of the module docstring, or in an inline docstring immediately following the variable. Either form is acceptable, but the two should not be mixed. Choose one convention to document module level variables and be consistent with it. .. _Google Python Style Guide: http://google-styleguide.googlecode.com/svn/trunk/pyguide.html """ module_level_variable = 12345 def module_level_function(param1, param2=None, *args, **kwargs): """This is an example of a module level function. Function parameters should be documented in the ‘‘Args‘‘ section. The name of each parameter is required. The type and description of each parameter is optional, but should be included if not obvious. If the parameter itself is optional, it should be noted by adding ", optional" to the type. If \*args or \*\*kwargs are accepted, they should be listed as \*args and \*\*kwargs. The format for a parameter is:: name (type): description The description may span multiple lines. Following lines should be indented. Multiple paragraphs are supported in parameter descriptions. Args: param1 (int): The first parameter. param2 (str, optional): The second parameter. Defaults to None. Second line of description should be indented. *args: Variable length argument list. **kwargs: Arbitrary keyword arguments. Returns: bool: True if successful, False otherwise. The return type is optional and may be specified at the beginning of the ‘‘Returns‘‘ section followed by a colon. 172 Capítulo 5. Programacion Documents Documentation, Publicación 0.0.1 The ‘‘Returns‘‘ section may span multiple lines and paragraphs. Following lines should be indented to match the first line. The ‘‘Returns‘‘ section supports any reStructuredText formatting, including literal blocks:: { ’param1’: param1, ’param2’: param2 } Raises: AttributeError: The ‘‘Raises‘‘ section is a list of all exceptions that are relevant to the interface. ValueError: If ‘param2‘ is equal to ‘param1‘. """ if param1 == param2: raise ValueError(’param1 may not be equal to param2’) return True def example_generator(n): """Generators have a ‘‘Yields‘‘ section instead of a ‘‘Returns‘‘ section. Args: n (int): The upper limit of the range to generate, from 0 to ‘n‘ - 1 Yields: int: The next number in the range of 0 to ‘n‘ - 1 Examples: Examples should be written in doctest format, and should illustrate how to use the function. >>> print [i for i in example_generator(4)] [0, 1, 2, 3] """ for i in range(n): yield i class ExampleError(Exception): """Exceptions are documented in the same way as classes. The __init__ method may be documented in either the class level docstring, or as a docstring on the __init__ method itself. Either form is acceptable, but the two should not be mixed. Choose one convention to document the __init__ method and be consistent with it. Note: Do not include the ‘self‘ parameter in the ‘‘Args‘‘ section. Args: msg (str): Human readable string describing the exception. code (int, optional): Error code, defaults to 2. 5.9. Python 173 Documents Documentation, Publicación 0.0.1 Attributes: msg (str): Human readable string describing the exception. code (int): Exception error code. """ def __init__(self, msg, code=2): self.msg = msg self.code = code class ExampleClass(object): """The summary line for a class docstring should fit on one line. If the class has public attributes, they should be documented here in an ‘‘Attributes‘‘ section and follow the same formatting as a function’s ‘‘Args‘‘ section. Attributes: attr1 (str): Description of ‘attr1‘. attr2 (list of str): Description of ‘attr2‘. attr3 (int): Description of ‘attr3‘. """ def __init__(self, param1, param2, param3=0): """Example of docstring on the __init__ method. The __init__ method may be documented in either the class level docstring, or as a docstring on the __init__ method itself. Either form is acceptable, but the two should not be mixed. Choose one convention to document the __init__ method and be consistent with it. Note: Do not include the ‘self‘ parameter in the ‘‘Args‘‘ section. Args: param1 (str): Description of ‘param1‘. param2 (list of str): Description of ‘param2‘. Multiple lines are supported. param3 (int, optional): Description of ‘param3‘, defaults to 0. """ self.attr1 = param1 self.attr2 = param2 self.attr3 = param3 def example_method(self, param1, param2): """Class methods are similar to regular functions. Note: Do not include the ‘self‘ parameter in the ‘‘Args‘‘ section. Args: param1: The first parameter. param2: The second parameter. Returns: True if successful, False otherwise. 174 Capítulo 5. Programacion Documents Documentation, Publicación 0.0.1 """ return True def __special__(self): """By default special members with docstrings are included. Special members are any methods or attributes that start with and end with a double underscore. Any special member with a docstring will be included in the output. This behavior can be disabled by changing the following setting in Sphinx’s conf.py:: napoleon_include_special_with_doc = False """ pass def __special_without_docstring__(self): pass def _private(self): """By default private members are not included. Private members are any methods or attributes that start with an underscore and are *not* special. By default they are not included in the output. This behavior can be changed such that private members *are* included by changing the following setting in Sphinx’s conf.py:: napoleon_include_private_with_doc = True """ pass def _private_without_docstring(self): pass 5.9.4 hashlib Fuentes https://docs.python.org/3.4/library/hashlib.html Ejemplo rapido from hashlib import sha256 a = sha256() a.update(b’123456’) password = a.hexdigest() # Si el password es pasado en una variable mi_password = ’123456’ a = sha256() 5.9. Python 175 Documents Documentation, Publicación 0.0.1 a.update(mi_password.encode(’utf-8’)) password = a.hexdigest() 5.9.5 Pickle serialize database Serializa datos y los guarda en una base de datos. Base de datos para el ejemplo CREATE TABLE datas ( id serial NOT NULL, data_serializada text NOT NULL, CONSTRAINT pk_id_datas PRIMARY KEY (id) ) Ejemplo serializando un único objeto import pickle import psycopg2 conn_string = ’dbname=practicas \ user=snicoper \ password=123456’ class Persona(object): def __init__(self, nombre, apellidos, email): self.nombre = nombre self.apellidos = apellidos self.email = email persona = Persona(’salvador’, ’nicolas pereiro’, ’[email protected]’) # Guardar los datos en la db, pasar de bytes a str data = pickle.dumps(persona, 0) data = data.decode(’utf-8’) with psycopg2.connect(conn_string) as conn: with conn.cursor() as cur: cur.execute( "INSERT INTO datas(data_serializada) \ VALUES(%s)", (data,)) conn.commit() # Leer los datos with psycopg2.connect(conn_string) as conn: with conn.cursor() as cur: cur.execute( "SELECT * FROM datas WHERE id = 1") datas = cur.fetchone() # pasar de str a bytes datas = datas[1].encode(’utf-8’) p = pickle.loads(datas) print(p.nombre) Ejemplo serializando varios objetos a la vez 176 Capítulo 5. Programacion Documents Documentation, Publicación 0.0.1 persona = Persona(’salvador’, ’nicolas pereiro’, ’[email protected]’) persona2 = Persona(’perico’, ’palote’, ’[email protected]’) # Guardar los datos en la db, pasar de bytes a str data = pickle.dumps((persona, persona2), 0) data = data.decode(’utf-8’) with psycopg2.connect(conn_string) as conn: with conn.cursor() as cur: cur.execute( "INSERT INTO datas(data_serializada) \ VALUES(%s) RETURNING id", (data,)) conn.commit() last_id = cur.fetchone()[0] # Leer los datos with psycopg2.connect(conn_string) as conn: with conn.cursor() as cur: cur.execute( "SELECT * FROM datas \ WHERE id=%s", (last_id,)) datas = cur.fetchone() # pasar de str a bytes datas = datas[1].encode(’utf-8’) p1, p2 = pickle.loads(datas) print(type(p2)) 5.9.6 Leer y guardar datos json en la db Leer y guardar datos JSON en una base de datos con psycopg2. El ejemplo es muy simple, pero para una rápida referencia, lo guardo. import json import psycopg2 def connect(): conn = psycopg2.connect(" \ dbname=practicas \ user=snicoper \ password=123456") return conn def save_data(data): conn = connect() cursor = conn.cursor() cursor.execute(’insert into datas(data) values(%s)’, (data,)) conn.commit() conn.close() def load_data(id): conn = connect() cursor = conn.cursor() cursor.execute(’SELECT * FROM datas WHERE id = %s’, (id, )) 5.9. Python 177 Documents Documentation, Publicación 0.0.1 datos = cursor.fetchone() conn.close() return datos # Guardar en la db archivo_json = ’tests/datas.json’ json_datas = open(archivo_json) data = json.load(json_datas) print(json.dumps(data)) save_data(json.dumps(data)) json_datas.close() # Leer desde la db datos = load_data(3)[1] datos_json = json.loads(datos) print(datos_json[’nombre’]) Categorias 5.9.7 Django Categorias: Insertar atributos en todos los campos en un ModelForm Para poder insertar un atributo en todos los campos de un formulario, por ejemplo el class="form-control" y no estar haciéndolo de uno a uno en todos sus campos. from django import forms from .models import IceCreamStore class IceCreamStoreForm(forms.ModelForm): class Meta: model = IceCreamStore def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) for field in self.fields: # Recorremos todos los campos del modelo para añadirle class="form-control self.fields[field].widget.attrs.update({’class’: ’form-control’}) # Añadir atributos personalizados a campos sueltos. self.fields[’title’].widget.attrs.update({’placeholder’: ’Titulo’}) Creación de un proyecto Django Nota: Para esta practica uso Django 1.7 y Python 3.4 La creación de un proyecto en Django te permite generar la estructura de directorios que mas te guste/interese, etc. 178 Capítulo 5. Programacion Documents Documentation, Publicación 0.0.1 Yo, voy creándome una que para mi gusto esta bien, pero que para nada significa que este bien o que sea la correcta. Utilizo Virtualenv/Virtualenvwrapper y tengo creado en env fuera del proyecto. La instalación de Django y cualquier otro paquete lo hago con un entorno virtual de Python. Dejo aquí como Instalacion Python en Ubuntu Ahora creo un directorio que es donde estará todo lo relacionado con el proyecto, como docs, requeriments, etc. mkdir proyect_name Creo varias carpetas, que mas tarde usare. cd proyect_name mkdir docs requeriments logs bin Los documentos (docs), lo genero con Sphinx y en requeriments creo tres archivos, uno común y otros dos, uno para desarrollo y otro para producción. Empiezo con requeriments Para un ejemplo simple, Django estará tanto en producción como en desarrollo (local), por lo que se añade a base.txt. Sphinx y django-debug-toolbar solo para desarrollo, Gunicorn solo para producción , así que editamos los tres archivos. Nota: Al no poner versiones, bajara la ultima versión, si se quiere especificar la versión poner por ejemplo Django==1.6.6. Seria buena idea, al menos después de instalar los paquetes, poner las versiones correspondientes. vim base.txt # Añadir django psycopg2 vim local.txt # Añadir -r base.txt # includes the base.txt requirements file sphinx django-debug-toolbar vim production.txt # Añadir -r base.txt # includes the base.txt requirements file gunicorn Ahora dependiendo de si estamos en el entorno de desarrollo o el de producción: # Para el entorno de desarrollo. pip install -r local.txt # Para el entorno de producción. pip install -r production.txt 5.9. Python 179 Documents Documentation, Publicación 0.0.1 cd .. Creacion del proyecto Django El proyecto para la practica se llamara mysite, así que empezamos con django-admin en la raíz de proyect_name. django-admin.py startproject mysite Renombro mysite a src mv mysite src Esto genera una pequeña estructura: src -- manage.py -- mysite -- __init__.py -- settings.py -- urls.py -- wsgi.py Entramos a src cd src La carpeta mysite, la renombro a settings mv mysite settings Creo que queda mas claro donde están los archivos de configuración. Ahora, creo dos archivos mas de configuración, uno para desarrollo y otro para producción, que usara otra base de datos dentro de la capeta settings. cd settings mv settings.py settings_base.py touch settings_local.py settings_prod.py El archivo settings_base.py lo dejo como base, para las configuraciones que se comparten en desarrollo y producción. De momento, usan las mismas configuraciones, mas tarde las cambiaremos. Ahora, hay que decirle a Django que archivos de configuración usar. Para el caso de desarrollo, cuando se usa ./manage.py, hay que editar ese mismo archivo. manage.py # cambiar os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings") # por os.environ.setdefault("DJANGO_SETTINGS_MODULE", "settings.settings_local") Cambiar dentro de settings/settings_base.py algunas configuraciones. # Buscar ROOT_URLCONF = ’mysite.urls’ 180 Capítulo 5. Programacion Documents Documentation, Publicación 0.0.1 WSGI_APPLICATION = ’mysite.wsgi.application’ # Remplazar por ROOT_URLCONF = ’settings.urls’ WSGI_APPLICATION = ’settings.wsgi.application’ Estados de DEBUG y Database Editar en settings/settings_base.py, y eliminar lo siguiente: # Eliminar desde la linea 22 a la 27 # SECURITY WARNING: don’t run with debug turned on in production! DEBUG = True TEMPLATE_DEBUG = True ALLOWED_HOSTS = [] # Eliminar # Database # https://docs.djangoproject.com/en/dev/ref/settings/#databases DATABASES = { ’default’: { ’ENGINE’: ’django.db.backends.sqlite3’, ’NAME’: os.path.join(BASE_DIR, ’db.sqlite3’), } } Añadir despues de INSTALLED_APPS THIRD_PARTY_APPS = ( ) LOCAL_APPS = ( ’home’, ) Añadir al final STATICFILES_DIRS = ( os.path.join(BASE_DIR, ’static’), ) TEMPLATE_DIRS = ( os.path.join(BASE_DIR, ’templates’), ) Editar en settings/settings_prod.py from settings.settings_base import * # SECURITY WARNING: don’t run with debug turned on in production! DEBUG = False TEMPLATE_DEBUG = False ALLOWED_HOSTS = [’ip(s) y/o dominio(s), aquí’] 5.9. Python 181 Documents Documentation, Publicación 0.0.1 # Application definition THIRD_PARTY_APPS += ( ) LOCAL_APPS += ( ) INSTALLED_APPS += THIRD_PARTY_APPS + LOCAL_APPS # Añadir la base de datos de produccion # Database # https://docs.djangoproject.com/en/dev/ref/settings/#databases DATABASES = { ’default’: { ’ENGINE’: ’django.db.backends.sqlite3’, ’NAME’: os.path.join(BASE_DIR, ’db.sqlite3’), } } En ALLOWED_HOSTS = [] Añadir un string con el dominio o ip. Editar en settings/settings_local.py from settings.settings_base import * # SECURITY WARNING: don’t run with debug turned on in production! DEBUG = True TEMPLATE_DEBUG = True # Application definition THIRD_PARTY_APPS += ( ’debug_toolbar.apps.DebugToolbarConfig’, ) LOCAL_APPS += ( ) INSTALLED_APPS += THIRD_PARTY_APPS + LOCAL_APPS # Añadir la base de datos de desarrollo # Database # https://docs.djangoproject.com/en/dev/ref/settings/#databases DATABASES = { ’default’: { ’ENGINE’: ’django.db.backends.sqlite3’, ’NAME’: os.path.join(BASE_DIR, ’db.sqlite3’), } } Nota: Configurar las bases de datos. Modificar settings/wsgi.py para decirle cual es el archivo de configuración de producción. 182 Capítulo 5. Programacion Documents Documentation, Publicación 0.0.1 # Linea 11, cambiar os.environ.setdefault("DJANGO_SETTINGS_MODULE", "settings.settings_prod") Lo básico ya esta creado y configurado, ahora los directorios. Crear directorios para templates, media, etc., Nos situamos en src y creamos algunas carpetas. mkdir templates media static cd .. static - Archivos de imágenes del sitio, css, jss y fonts para Bootstrap media - Archivos por el servidos, por usuarios o administración. templates - Archivos .html Dentro de static creamos cuatro carpetas, img, js, fonts, css cd static mkdir img js fonts css Ahora descargamos Bootstrap y copiamos los archivos dentro de cada carpeta en static. Hacemos los mismo con JQuery Dentro de templates, creamos algunos archivos .html cd templates touch base.html 404.html 500.html _messages.html Editar base.html y añadir {% load staticfiles %} <!DOCTYPE html> <html lang="es"> <head> <meta charset="utf-8"> <!--[if IE]> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <![endif]--> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>{% block title %}{% endblock title %}</title> <!-- Bootstrap --> <link href="{% static "css/bootstrap.min.css" %}" rel="stylesheet"> <link href="{% static "css/bootstrap-theme.min.css" %}" rel="stylesheet"> <link href="{% static "css/main.css" %}" rel="stylesheet"> {% block styles %}{% endblock styles %} </head> <body> <nav class="navbar navbar-default navbar-fixed-top" role="navigation"> <div class="container"> <div class="navbar-header"> <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navb <span class="icon-bar"></span> <span class="icon-bar"></span> <span class="icon-bar"></span> </button> <a class="navbar-brand" href="{% url ’home.index’ %}">Application name</a> </div> <div class="navbar-collapse collapse"> <ul class="nav navbar-nav"> <li><a href="#">Home</a></li> 5.9. Python 183 Documents Documentation, Publicación 0.0.1 </ul> </div> </div> </nav> <div class="container body-content"> {% include "_messages.html" %} {% block content %}{% endblock content %} <hr/> {% block footer %} <footer> <div> © Footer de la pagina </div> </footer> {% endblock footer %} </div> <diV class="go-top"> <span class="glyphicon glyphicon glyphicon-chevron-up"></span> </diV> <!-- jQuery (necessary for Bootstrap’s JavaScript plugins) --> <script src="{% static "js/jquery-2.1.1.min.js" %}"></script> <!-- Include all compiled plugins (below), or include individual files as needed --> <script src="{% static "js/bootstrap.min.js" %}"></script> <script src="{% static "js/main.js" %}"></script> {% block scripts %}{% endblock scripts %} </body> </html> Editar _messages.html y añadir: {% if messages %} <div class="row"> <div class="col-md-6 col-md-offset-3"> {% for message in messages %} {% if message.tags == ’error’ %} <div class="alert alert-danger">{{ message }}</div> {% else %} <div class="alert alert-{{ message.tags }}">{{ message }}</div> {% endif %} {% endfor %} </div> </div> {% endif %} Con esto saldrá un mensaje de django.contrib.messages un mensaje en al cabecera de la pagina. Editar 404.html y añadir {% extends ’base.html’ %} {% block title %}Pagina no encontrada{% endblock title %} {% block content %} <div class="row"> <div class="col-md-4 col-md-offset-4 col-sm-6 col-sm-offset-3 col-xs-12"> 184 Capítulo 5. Programacion Documents Documentation, Publicación 0.0.1 <h3>Pagina no encontrada</h3> </div> </div> {% endblock content %} Ir a src/templates/js, crear un archivo main.js y añadir // Show or hide the sticky footer button $(window).scroll(function() { if ($(this).scrollTop() > 200) { $(’.go-top’).fadeIn(200); } else { $(’.go-top’).fadeOut(200); } }); // Animate the scroll to top $(’.go-top’).click(function(event) { event.preventDefault(); $(’html, body’).animate({scrollTop: 0}, 300); }) Creara un pequeño scroll en la parte inferior derecha de la pagina para subir a la cabecera. Ir a src/templates/css, crear un archivo main.css y añadir body { padding-top: 70px; padding-bottom: 20px; } .go-top { position: fixed; bottom: 2em; right: 2em; text-decoration: none; color: white; background-color: rgba(0, 0, 0, 0.3); font-size: 12px; padding: 1em; display: none; cursor: pointer; border-radius: 45px; } .go-top:hover { background-color: rgba(0, 0, 0, 0.6); } Crear app home # En src/ ./manage.py startapp home mkdir -p home/templates/home touch home/templates/home/index.html touch home/urls.py Añadir al index recién creado 5.9. Python 185 Documents Documentation, Publicación 0.0.1 {% extends "base.html" %} {% block title %}Home{% endblock title %} {% block content %} <h2>Home page</h2> {% endblock content %} Editar settings/urls.py from django.conf.urls import patterns, include, url from django.contrib import admin urlpatterns = patterns( ’’, url(r’^admin/’, include(admin.site.urls)), url(r’^$’, include(’home.urls’)), ) Editar home/urls.py from django.conf.urls import patterns, url urlpatterns = patterns( ’home.views’, url(r’^$’, ’index’, name=’home.index’), ) Editar home/views.py from django.shortcuts import render def index(request): return render(request, ’home/index.html’) GIT Nos situamos en src e inicializamos git git init . git add --all git commit -m ’Initial commmit’ Crear .gitignore # File types # ############## *.pyc *.swo *.swp *.swn # Directories # ############### __pycache__/ .idea/ build/ 186 Capítulo 5. Programacion Documents Documentation, Publicación 0.0.1 logs/ # Specific files # ################## # OS generated files # ###################### .directory .DS_Store? ehthumbs.db Icon? Thumbs.db *~ Resultado final de la estructura: . ----| | | -- bin docs logs requeriments -- base.txt -- local.txt -- production.txt src -- home | -- admin.py | -- __init__.py | -- migrations | | -- __init__.py | -- models.py | -- templates | | -- home | | -- index.html | -- tests.py | -- urls.py | -- views.py -- manage.py -- media -- settings | -- __init__.py | -- settings_base.py | -- settings_local.py | -- settings_prod.py | -- urls.py | -- wsgi.py -- static | -- css | | -- bootstrap.css | | -- bootstrap.css.map | | -- bootstrap.min.css | | -- bootstrap-theme.css | | -- bootstrap-theme.css.map | | -- bootstrap-theme.min.css | | -- main.css | -- fonts | | -- glyphicons-halflings-regular.eot | | -- glyphicons-halflings-regular.svg | | -- glyphicons-halflings-regular.ttf 5.9. Python 187 Documents Documentation, Publicación 0.0.1 | | -- glyphicons-halflings-regular.woff | -- img | -- js | -- bootstrap.js | -- bootstrap.min.js | -- jquery-2.1.1.min.js | -- main.js -- templates -- 404.html -- 500.html -- base.html -- _messages.html 19 directories, 37 files Si todo ha salido bien ./manage.py runserver Me dejo en github una plantilla creada GitHub Quizás te pueda interesar: Instalación Nginx, Gunicorn y Django Cómo crear archivos de idioma Fuentes https://docs.djangoproject.com/en/1.7/topics/i18n/translation/ http://www.i18nguy.com/unicode/language-identifiers.html http://django-book.readthedocs.org/en/latest/chapter19.html Es posible hacerlo de dos maneras diferentes. Desde la raíz del proyecto Django, donde esta manage.py o desde la raíz de la app. Desde la raíz del proyecto Hay que editar settings.py para decirle los módulos que tendrán traducciones. LOCALE_PATHS = ( os.path.join(BASE_DIR, ’apps/home/locale/’), ) Después, ejecutar ./manage.py makemessages -l es Donde es es el identificador de lenguaje, aqui una lista Desde la raíz de la app Aquí no es necesario añadir LOCALE_PATHS a settings.py, y en vez de usar manage.py, se usa django-admin.py, además el directorio locale se ha de crear a mano. cd myapp mkdir locale django-admin.py makemessages -l es 188 Capítulo 5. Programacion Documents Documentation, Publicación 0.0.1 El script recorre completamente el árbol en el cual es ejecutado y extrae todas las cadenas marcadas para traducción. Crea (o actualiza) un archivo de mensajes en el directorio locale. En el ejemplo es, el archivo será locale/de/LC_MESSAGES/django.po. Dentro de los archivos .po, se va algo así. #: views.py:6 msgid "name" msgstr "nombre" msgid es la cadena de traducción, la cual aparece en el código fuente. No la modifiques. msgstr es donde colocas la traducción específica a un idioma. Su valor inicial es vacío de manera que es tu responsabilidad el cambiar esto. Asegúrate de que mantienes las comillas alrededor de tu traducción. Por conveniencia, cada mensaje incluye el nombre del archivo y el número de línea desde el cual la cadena de traducción fue extraída. #... from django.utils.translation import gettext_lazy as _ def index(request): var_name = _(’name’) #... el valor de var_name sera nombre Después, hay que compilarlo con compilemessages, y se aplica lo mismo que antes, cuando se hizo desde la raiz del proyecto Django o desde la raíz de la aplicación. # desde la raíz del proyecto ./manage.py compilemessages # desde la raíz de la aplicacion django-admin.py compilemessages Para reexaminar todo el código fuente y las plantillas en búsqueda de nuevas cadenas de traducción y actualizar todos los archivos de mensajes para todos los idiomas, ejecuta lo siguiente: ./manage.py/django-admin.py makemessages -a Algunas notas Para configurar una preferencia de idioma a nivel de la instalación, fija LANGUAGE_CODE en tu archivo de configuración. Django usará este idioma como la traducción por omisión – la opción a seleccionarse en último término si ningún otro traductor encuentra una traducción. Si deseas permitir que cada usuario individual especifique el idioma que ella o él prefiere, usa LocaleMiddleware. LocaleMiddleware permite la selección del idioma basado en datos incluidos en la petición. Personaliza el contenido para cada usuario. Para usar LocaleMiddleware, agrega django.middleware.locale.LocaleMiddleware a tu variable de configuración MIDDLEWARE_CLASSES. Debido a que el orden de los middlewares es rele- vante, deberías seguir las siguientes guías: Asegúrate de que se encuentre entre las primeras clases middleware instaladas. Debe estar ubicado después de SessionMiddleware, esto es debido a que LocaleMiddleware usa datos de la sesión. Si usas CacheMiddleware, coloca LocaleMiddleware después de este (de otra forma los usuarios podrían recibir contenido cacheado del locale equivocado). 5.9. Python 189 Documents Documentation, Publicación 0.0.1 LocaleMiddleware intenta determinar la preferencia de idioma del usuario siguiendo el siguiente algoritmo: Primero, busca una clave django_language en la sesión del usuario actual. Se eso falla, busca una cookie llamada django_language. Si eso falla, busca la cabecera HTTP Accept-Language. Esta cabecera es enviada por tu nave- gador y le indica al servidor qué idioma(s) prefieres en orden de prioridad. Django intenta con cada idioma que aparezca en dicha cabecera hasta que encuentra uno para el que haya disponible una traducción. Si eso falla, usa la variable de configuración global LANGUAGE_CODE. Migraciones en Django 1.7+ Crear migraciones ./manage.py makemigrations polls Mediante la ejecución de makemigrations, le estás diciendo a Django que has hecho algunos cambios a sus modelos y que desea que los cambios se almacenarán como la migración. Las migraciones son cómo almacena Django cambios a sus modelos (y por tanto el esquema de base de datos) - son simplemente los archivos en el disco. Puedes leer la migración para su nuevo modelo si se quiere; que es el archivo polls/migrations/0001_initial.py . No te preocupes, no se espera para leerlos cada vez que Django hace uno, sino que están diseñados para ser humano editable en caso de que quiera ajustar manualmente cómo Django cambia las cosas. Ver SQL que generara Para ver el SQL que generara cuando cree la db, usar sqlmigrate. Por ejemplo para ver 0001_initial.py 0002_auto_20140808_1242.py, solo poner el premer numero 0001 o 0002 Nota: Esto no genera la base de datos, solo muestra el SQL que generara cuando se haga migrate ./manage.py sqlmigrate polls 0001 Comprobar el modelo Esto solo comprueba si hay algun error en el modelo, pero no ejecuta nada. ./manage.py check Migrar las base de datos ./manage.py migrate El comando migrate toma todas las migraciones que no han sido aplicadas (pistas de Django cuáles se aplican mediante una tabla especial en su base de datos llamada django_migrations ) y les va en contra de su base de datos - en esencia, la sincronización de los cambios realizados en sus modelos con el esquema en la base de datos. Las migraciones son muy potentes y permiten cambiar tus modelos con el tiempo, a medida que desarrolle su proyecto, sin la necesidad de eliminar la base de datos o las tablas y hacer otros nuevos - que se especializa en la actualización de su base de datos en vivo, sin perder datos. Recordamos la guía de tres pasos para hacer cambios en el modelo: 190 Capítulo 5. Programacion Documents Documentation, Publicación 0.0.1 Cambiar los modelos (en models.py ). Ejecutar python manage.py makemigrations para crear migraciones de esos cambios Ejecutar python manage.py migrate para aplicar esos cambios a la base de datos. Problema con Error That port is already in use ps aux | grep -i manage kill -9 numero_pd Validación campo de un modelo # my_app/validators.py from django.core.exceptions import ValidationError def titulo_validation(value): if not len(value) > 4: raise ValidationError(’Minimo 4 caracteres’) # my_app/models.py from django.db import models from .validators import titulo_validation class Articulo(models.Model): titulo = models.CharField(max_length=200, validators=[titulo_validation]) #.... Tambien es posible hacerlo desde un ModelForm # my_app/forms.py from django import forms from .models import Articulo from .validators import titulo_validation class MyForm(models.ModelForm): def __init__(self): super().__init__(*args, **kwargs) self.fields[’titulo’].validators.append(titulo_validation) class Meta: model = Articulo 5.10 UML Categorias: 5.10. UML 191 Documents Documentation, Publicación 0.0.1 5.10.1 Relacion composicion agregacion Fuentes http://arodm.blogspot.com/2008/09/uml-relaciones-compocicion-agregacion.html Nota: Para ver los diagramas, pinchar en Fuentes Trabajando con los miembros de mi team de desarrollo me di cuenta que a los programadores le costaba interpretar los Diagramas de Clases que el analista realizaba. O existían interpretaciones ambiguas de lo que el realizaba, perdiendo asi la principal funcionalidad del lenguaje UML. Especialmente en cuanto a las relaciones que existían entre las clases. Por eso me dispuse a realizar este pequeño documento, donde voy a tratar de explicar que significa cada relación, en mis palabras, y como se traduce esto a código. Asociación Es generalmente, una relación estructural entre clases, es decir, que en el ejemplo, existe un atributo de la clase medio de transportes, que es del tipo Conductor. La navegabilidad nos muestra donde esta ubicado el atributo. Es decir cual es la clase que tiene contiene el atributo si ésta no lo mostrase. Agregación Es una relación que se derivó de la asociación, por ser igualmente estructural, es decir que contiene un atributo, que en todos los casos, será una colección, es decir un array, vector, etc, y además de ello la clase que contiene la colección debe tener un método que agregue los elementos a la colección. También se puede leer como que un medio de transporte tiene varias ruedas. Nos esta diciendo que los objetos rueda forman parte del objeto medio de transporte. Pero, su ciclo de vida no esta atado al del objeto medio de transporte. Es decir si el automóvil se destruye las ruedas pueden seguir existiendo independientemente. Composición Al igual que en la agregación, es una relación estructural pero se le suma, que tiene un método de destrucción de los objetos. Y a diferencia de la asociación, el ciclo de vida del objeto area está relacionado con el del objeto ruta. Es decir que si la ruta de viaje se levanta, las áreas que surgían a partir de ella desaparecen. También se puede leer como que una ruta tiene varias áreas de cobertura. Mucho se ha discutido a cerca de las agregaciones y las composiciones, el debate es casi tan caliente como el de los include y extends de los casos de uso. Ya que algunos sostienen que los lenguajes orientados a objetos, tienen garbage collector, por lo que no necesitan métodos de destrucción de los objetos (relacionados a los ciclos de vida en la composición). Y que la programación es la misma para las composiciones y las agregaciones, y que la diferencia es meramente conceptual entre una y otras. Es mas existen varias interpretaciones, pero la expuesta es la cual yo me adhiero. 192 Capítulo 5. Programacion Documents Documentation, Publicación 0.0.1 Clase de Asociación Es una Clase que surge de una multiplicidad de muchos a muchos, y fue incorporada en UML para dar soporte a este caso. Se sacan los atributos de las clases involucradas y se los incorpora a una clase a parte. Al igual que las anteriores hace referencia a una relación estructural. En el ejemplo son los objetos viaje y ruta. Realización Es una relación de contrato con otra clase. Se la utiliza para implementar una interfaz. En lenguajes como java o php utilizamos la palabra reservada implements public class Viaje implements InterfaceA{...} Generalmente cuando no estamos seguros si algo es una interfaz o una clase abstracta, por que dibujaron los tag que hacen referencias a las interfaces, debemos ver la relación para saber. Generalización Es una relación de herencia. Se puede decir que es un relación es un tipo de. En nuestro ejemplo: “un auto es un tipo de Medio de transporte”. Es entre una clase hija y su clase madre. En la codificación podemos encontrar la palabra “extends” que hace referencia a esta relación. Además podemos encontrar palabras claves tales como this y super o self y parent. Para darnos cuenta que existe una relación de este tipo involucrada. public class Auto extends MedioDeTransporte{...} Dependencia Es una relación de uso, es decir que una clase utiliza a otra. Y si esta ultima se altera, la anterior se puede ver afectada. En código se suelen traducir principalmente como las clases donde se hace la instanciación de un objeto. En nuestro ejemplo la clase viaje realiza los new de los distintos objetos. En este momento puede que te preguntes como puede hacer un new de una clase abstracta, jeje. No realiza los new de la clase abstracta, si no de sus hijas. Seria algo así como MedioDeTransporte medio = new Auto(); También se sostiene que este tipo de relación hace referencias, a los parámetros que se pasan en un método, bajo este concepto, en java, podría ser algo así como: public void crearViaje(MedioDeTransporte medio) {} Por ultimo también se sostiene que podemos codificar esta relación realizando un return del tipo de dato en algún método. Bueno espero haber limpiado algunas dudas, hay mucho para discutir sobre el asunto. 5.10. UML 193 Documents Documentation, Publicación 0.0.1 194 Capítulo 5. Programacion CAPÍTULO 6 Windows Contents 6.1 Eliminar un Servicio sc delete nombre_servicio 6.2 Instalación de PostgreSQL Windows 6.2.1 Fuentes http://www.postgresql.org/ http://www.petrikainulainen.net/programming/tips-and-tricks/installing-postgresql-9-1-to-windows-7-fromthe-binary-zip-distribution/ http://www.pgadmin.org/ Nota: Para una instalación rápida, descargar el instalador y solo añadirlo al PATH, me creo la menear del .zip por pura curiosidad. La versión probada es 9.3.4, cambiar según versión. Descargar el archivo .zip Crear carpeta C:\Postgresql Descomprimir carpeta en C:\Postgresql Renombrar C:\Postgresql\pgsql a C:\Postgresql\9.3.4 Crear dentro de C:\Postgresql\9.3.4 dos directorios data log 195 Documents Documentation, Publicación 0.0.1 6.2.2 Añadir el PATH C:\Postgresql\9.3.4\bin; 6.2.3 CMD Inicializar data initdb -U postgres -A password -E utf8 -W -D C:\Postgresql\9.3.4\data Iniciar pg_ctl -D "C:/Postgresql/9.3.4/data" -l "C:/Postgresql/9.3.4/log/pgsql.log" start Parar pg_ctl -D “C:/Postgresql/9.3.4/data” -l “C:/Postgresql/9.3.4/log/pgsql.log” stop 6.2.4 Añadir como Servicio pg_ctl.exe register -N Postgresql -U "NT AUTHORITY\NetworkService" -D "C:/Postgresql/9.3.4/data" -w 6.2.5 Descargar e instalar pgadmin http://www.pgadmin.org/ 6.2.6 Consigurar Abrir C:\Postgresql\9.3.4\data\postgresql.conf # Descomentar listen_addresses = ’localhost’ port = 5432 Crear base de datos practicas y usuario snicoper psql -U postgres CREATE USER snicoper WITH PASSWORD ’123456’ NOCREATEDB NOCREATEUSER; CREATE DATABASE practicas WITH OWNER = snicoper; Nota: Para evitar el mensaje en cmd ADVERTENCIA: El código de página de la consola (850) difiere del código de página de Windows (1252). [...] En CMD poner 196 Capítulo 6. Windows Documents Documentation, Publicación 0.0.1 /c chcp 1252 6.3 Instalación Python en Windows 6.3.1 Fuentes https://www.python.org/ http://www.lfd.uci.edu/~gohlke/pythonlibs/ http://www.stickpeople.com/projects/python/win-psycopg/ ..note:: Python 3.4+ ya viene por defecto pip y setuptools 6.3.2 Variables de entorno C:\Python34\;C:\Python34\Scripts\; 6.3.3 Virtualenv pip install virtualenv # Con la bandera --no-site-packages, no instala los packetes del Python original. # virtualenv --system-site-packages py3venv virtualenv venv cd venv Scripts\activate # Para salir de virtualenv deactivate Pysopg2 version 2.5.3 (py3venv) easy_install http://www.stickpeople.com/projects/python/win-psycopg/2.5.4/psycopg2-2.5.4.wi 6.3.4 PYTHONPATH Crear variable de entorno PYTHONPATH y añadir la carpeta site-packages de un entorno virtual C:\virtualenvs\py3venv\Lib\site-packages 6.3. Instalación Python en Windows 197 Documents Documentation, Publicación 0.0.1 6.4 Instalar Cygwin 6.4.1 Fuentes http://www.cygwin.com/ Descargar el instalador e instalar. La primera vez que lo instalo, lo instalo sin elegir nada, cuando a acabado la primera instalación, lo vuelvo a ejecutar y selecciono los paquetes a instalar. openssh wget ca-certificates curl tree Añadir al path C:\cygwin64\bin; Modificar C:\cygwin64\home\snicoper\.bashrc alias alias alias alias alias ll=’ls -lF’ la=’ls -a’ lla=’ll -a’ statc=’stat -c %a’ ccat=’pygmentize -g’ # Git function git_branch { git branch --no-color 2> /dev/null | sed -e ’/^[^*]/d’ -e ’s/* \(.*\)/(\1) /’ } PS1=’\[\e[0;32m\]\u@\[\e[m\]\[\e[0;32m\]\h\[\e[m\] \[\e[1;34m\]\w\[\e[m\] \[\e[1;32m\]\n\[\033[0;32m\ 6.5 Instalar PHP y Laravel Instalación de PHP y Laravel, para una instalación mas completa, apache o nginx instalar xampp o wpn-xm Descargar la version VC11 x86 Non Thread Safe Crear una carpeta en C:\php y descomprimir dentro los archivos del .zip siendo esta la raiz de todos los archivos. 6.5.1 Añadir al path Ir a propiedades de Mi Pc > Advanced system settings > Environment Variables... En el cuadro de abajo, System variables, buscar el Path y añadir al final ;C:\php; 198 Capítulo 6. Windows Documents Documentation, Publicación 0.0.1 6.5.2 Editar php.ini Entrar en C:\php, Ctrl+C, Ctrl+V en php.ini-development y renombrar a php.ini Abrirlo y editar # Linea 721 extension_dir = "C:/php/ext" # A partir de la linea 863 mas o menos, descomentar extension=php_bz2.dll extension=php_curl.dll extension=php_fileinfo.dll extension=php_gd2.dll extension=php_gettext.dll extension=php_mbstring.dll extension=php_openssl.dll extension=php_pdo_pgsql.dll extension=php_pdo_sqlite.dll extension=php_pgsql.dll extension=php_soap.dll extension=php_sockets.dll extension=php_sqlite3.dll extension=php_xsl.dll #Linea 913 date.timezone = Europe/Madrid Nota: Por ejemplo php_pgsql.dll hay que tener instalado Instalación de PostgreSQL Windows Para date.timezone ver Listado de zonas horarias soportadas 6.5.3 XDebug Abrir CMD y escribir php -i > phpini.txt Abrir el phpini.txt copiar todo el texto y pegarlo en http://xdebug.org/wizard.php Descargar y renombrar a php_xdebug.dll en C:\php\ext Añadir al final del php.ini zend_extension = C:\php\ext\php_xdebug.dll 6.5.4 Composer Abrir CMD cd C:\php php -r "readfile(’https://getcomposer.org/installer’);" | php echo @php "%~dp0composer.phar" %*>composer.bat composer -V 6.5. Instalar PHP y Laravel 199 Documents Documentation, Publicación 0.0.1 6.6 KDE For Windows 6.6.1 Fuentes http://windows.kde.org/ 6.6.2 Fijos kde-workspace 6.6.3 Opcionales umbrello okular kate kate-contextmenu kde-baseapps 6.7 MongoDB en Windows 6.7.1 Fuentes http://www.mongodb.org/ Descargar el archivo .zip para x64 bits Descomprimir en C:\ y renombrar a mongodb Añadir al Path: C:\mongodb\bin; Crear: cd C:\mongodb mkdir data mkdir log touch mongod.cfg Editar mongod.cfg # mongodb.conf # Where to store the data. dbpath=C:\mongodb\data #where to log 200 Capítulo 6. Windows Documents Documentation, Publicación 0.0.1 logpath=C:\mongodb\log\mongod.log #append log logappend=true Añadir como servicio C:\mongodb\bin\mongod.exe --auth --config C:\mongodb\mongod.cfg --install Eliminar servicio C:\mongodb\bin\mongod.exe --auth --config C:\mongodb\mongod.cfg --remove Iniciar/Parar servicio net start MongoDB net stop MongoDB 6.8 ODBC PostgreSQL en Windows 6.8.1 Desde el instalador de Postgres Una vez instalado Postgresql, ir a inicio y buscar “Application Stack Builder”. Después de elegir el PostgreSQL instalado, sale un menú, buscar en “Database Driver” y seleccionar pgsqlODBC, elegir la de 32. El primer path es para decirle donde lo descarga, se puede dejar que nos propone que es la carpeta de usuario. Después pregunta por la carpeta de instalación de postgresql, pongo en C:Postgresql (donde instalo postgres) Siguiente, Siguiente, Siguiente 6.8.2 Descargándolo a parte http://www.postgresql.org/ftp/odbc/versions/msi/ Descargar la versión de x86 e instalar. Instalarla en C:PostgresqlpsqlODBCx86 6.8.3 Independientemente del tipo de instalación Ir a Control PanelSystem and SecurityAdministrative Tools. Abrir ODBC Data Sources (32-bit). En User DNS Add y elegir Postgresql Unicode. Rellenar los campos con los datos del usuario postgres. Supongo que para la versión de x64, se deberá hacer lo mismo pero con un binario de x64. 6.9 Olbidar Red netsh wlan show profiles netsh wlan delete profile [nombre de red inalámbrica] 6.8. ODBC PostgreSQL en Windows 201 Documents Documentation, Publicación 0.0.1 Categorias 6.10 Visual Studio Categorias 6.10.1 Configuración Visual Studio Configruacion de Visual Studio 2013 Si se quiere restablecer la configuración por cmd (no lo he probado) Devenv.exe /ResetSettings "C:\Users\snicoper\MySettings.vssettings" Addons a instalar Web Essentials 2013 Update 2 CodeMaid Productivity Power Tools 2013 VsVim Opciones Tools -> Options: Environment -> Tabs and Windows -> Insert new tabs to the right of existing tabs (Marcar) Text Editor -> All Languages -> Line numbers (Marcar) Text Editor -> C# -> Advanced -> Place System directives first when sorting usings (Marcar) Productivity Power Tools -> Turn Extensions On/Off -> Ctrl+Click Go To definition (Desmarcar) Productivity Power Tools -> PowerCommand -> General -> Format document on save (Marcar) Productivity Power Tools -> Custom Document Well -> General -> Sorting -> Alphabetically (Desmascar) 6.10.2 NuGet Commands Fuentes http://blog.nuget.org/20121231/a-quick-tutorial-on-update-package-command.html Algunos comandos que encuentro utiles y los apunto aqui Get-Package: Muestra la lista de paquetes instalados y sus versiones. Install-Package [nombre]: Instala un paquete. 202 Capítulo 6. Windows Documents Documentation, Publicación 0.0.1 Update-Package: Actualiza los paquetes. Update-Package [nombre]: Actualiza el paquete [nombre]. Uninstall-Package [nombre]: Elimina un paquete. Para decir en que proyecto se instala/actualiza/etc. Valido para cualquier comando. Install-Package -ProjectName nombre_proyecto Update-Package -ProjectName nombre_proyecto 6.10.3 Solución Loop infinito en ASP.NET IIS Fuentes http://stackoverflow.com/questions/19601412/new-asp-net-mvc5-project-produces-an-infinite-loop-to-loginpage Cree un proyecto en asp.net con un nombre que ya había usado en otro proyecto, el que biene por defecto. Al cargar la pagina para probarla, me hacia un loop infinito en la barra de direcciones en el navegador y salia el error: "HTTP Error 404.15 - Not Found The request filtering module is configured to deny a request where the Para solucionarlo, abri el archivo: C:\Users\snicoper\Documents\IISExpress\config\applicationhost.config Una vez dentro, elimine toda referencia con el nombre del proyecto (pero no eliminar el archivo) 6.10. Visual Studio 203
© Copyright 2024