Sildenafil For You (Viagra) Sildenafil Citrate Formula

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 &amp;mdash; my longest chapter so far
would be 75 printed pages, and it loads in under 5 seconds&amp;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>
&copy; 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