Obtener ultima version de
_TEMPLATES\TemplateAngular
Renombrar la carpeta (ej, Creditos)
editar los siguientes archivos y cambiar el nombre "programa1" por el del sitio (en este ejemplo, Creditos)
package.json
src\index.html
package-lock.json
angular.json
quitar los atributos readonly para poder compilarlo.
Eliminar ApplicationInsights Telemetry de todos los sitios web
Ejecutar como administrador IIS, y sobre el Default Web Site:
Quitar:
Módulos / ApplicationInsighsWebModule
Por lo tanto, deben estar sin readonly (pueden ocurrir errores por este tema)
Solucionar problema CORS en servicios asmx
Agregar en web.config lo siguiente:
<configuration>
....
....
....
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="http://servidor-origen-habilitado"/>
<add name="Access-Control-Allow-Methods" value="GET,PUT,POST,DELETE,OPTIONS"/>
<add name="Access-Control-Allow-Headers" value="Content-Type"/>
</customHeaders>
</httpProtocol>
</system.webServer>
</configuration>
Ej, si se quiere admitir que desde http://Xdesa:8080 se pueda llegar al servicio 'http://Xdesa/wsX/Seguridad.asmx/ExisteRolUsuario, poner lo siguiente:
<add name="Access-Control-Allow-Origin" value="http://Xdesa:8080"/>
(el error que da si no se agregan estas lineas es:
Access to XMLHttpRequest at ... from origin ... has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource)
<configuration>
....
....
....
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="http://servidor-origen-habilitado"/>
<add name="Access-Control-Allow-Methods" value="GET,PUT,POST,DELETE,OPTIONS"/>
<add name="Access-Control-Allow-Headers" value="Content-Type"/>
</customHeaders>
</httpProtocol>
</system.webServer>
</configuration>
Ej, si se quiere admitir que desde http://Xdesa:8080 se pueda llegar al servicio 'http://Xdesa/wsX/Seguridad.asmx/ExisteRolUsuario, poner lo siguiente:
<add name="Access-Control-Allow-Origin" value="http://Xdesa:8080"/>
(el error que da si no se agregan estas lineas es:
Access to XMLHttpRequest at ... from origin ... has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource)
Reactive form Error: formGroup expects a FormGroup instance. Please pass one in
Si da este error:
Error: formGroup expects a FormGroup instance. Please pass one in...
en el constructor, en la primer linea, inicializar el formulario:
ej:
this.clienteForm = this.fb.group({
id: [""],
numero: new FormControl({value: null, disabled: false}),
nombre: [""],
direccion: [""],
telefono: [""],
email: [""],
fechaNacimiento: [""]
});
Si no se hace, por un tema de asincronia, trata de utilizar el form que aun no esta inicializado y da el error.
Error: formGroup expects a FormGroup instance. Please pass one in...
en el constructor, en la primer linea, inicializar el formulario:
ej:
this.clienteForm = this.fb.group({
id: [""],
numero: new FormControl({value: null, disabled: false}),
nombre: [""],
direccion: [""],
telefono: [""],
email: [""],
fechaNacimiento: [""]
});
Si no se hace, por un tema de asincronia, trata de utilizar el form que aun no esta inicializado y da el error.
Reaper
Quitar el modo loop
En la pista del piano roll (la pista midi) darle F2 y ahi desactivar el modo loop
Configurar teclado MIDI
Conectar el teclado MIDI
Ctrl+p / MIDI devices / ver el que esta DISABLED y darle click derecho y habilitarlo (tanto en input como en output)
Agregar una pista (doble click en la zona izquierda)
Armar la pista (circulo rojo)
Probar el teclado
Grabar
Armar track (circulo rojo en el track)
Presionar el circulo rojo que esta mas abajo (abajo de todas las pistas)
Luego de grabar, click en FX
Elegir un VSTi (ej, EVM Grand Piano) *** SI NO SE ELIGE UN VSTi NO SE OYE EL PLAYBACK!! ***
Para escuchar el sonido del teclado MIDI en Reaper: click en icono Record Monitoring (un icono con forma de parlante que esta en cada pista)
Para que se escuche el monitoreo en la interfaz Focusrite
1. En Option / Preferences / Device / Audio System = ASIO / ASIO Driver: Focusrite Scarlet ASIO
2. Crear pista (doble click a la izquierda)
3. En la pista elegir Input MIDI / USB midi cable / All channels
4. Activar el monitoreo (click en parlante que esta en la pista)
5. Click en Route / en midi channel output elegir USB midi cable
En la pista del piano roll (la pista midi) darle F2 y ahi desactivar el modo loop
Configurar teclado MIDI
Conectar el teclado MIDI
Ctrl+p / MIDI devices / ver el que esta DISABLED y darle click derecho y habilitarlo (tanto en input como en output)
Agregar una pista (doble click en la zona izquierda)
Armar la pista (circulo rojo)
Probar el teclado
Grabar
Armar track (circulo rojo en el track)
Presionar el circulo rojo que esta mas abajo (abajo de todas las pistas)
Luego de grabar, click en FX
Elegir un VSTi (ej, EVM Grand Piano) *** SI NO SE ELIGE UN VSTi NO SE OYE EL PLAYBACK!! ***
Para escuchar el sonido del teclado MIDI en Reaper: click en icono Record Monitoring (un icono con forma de parlante que esta en cada pista)
Para que se escuche el monitoreo en la interfaz Focusrite
1. En Option / Preferences / Device / Audio System = ASIO / ASIO Driver: Focusrite Scarlet ASIO
2. Crear pista (doble click a la izquierda)
3. En la pista elegir Input MIDI / USB midi cable / All channels
4. Activar el monitoreo (click en parlante que esta en la pista)
5. Click en Route / en midi channel output elegir USB midi cable
** SI NO APARECE EL BOTON ROUTE: Options / Layouts / Track Panel / B
6. En FX, elegir un instrumento (ej DSK Brass)
7. Armar la pista (click en circulo rojo)
6. En FX, elegir un instrumento (ej DSK Brass)
7. Armar la pista (click en circulo rojo)
Importacion de todos los modulos de Material
Para instalar angular material:
npm install --save @angular/material @angular/cdk
ng add @angular/material
ng add @angular/material
1. Crear un archivo llamado material.module.ts y agregarle esto:
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import {MatCheckboxModule} from '@angular/material/checkbox';
import {MatButtonModule} from '@angular/material/button';
import {MatInputModule} from '@angular/material/input';
import {MatAutocompleteModule} from '@angular/material/autocomplete';
import {MatDatepickerModule} from '@angular/material/datepicker';
import {MatFormFieldModule} from '@angular/material/form-field';
import {MatNativeDateModule, MAT_DATE_LOCALE} from '@angular/material/core';
import {MatRadioModule} from '@angular/material/radio';
import {MatSelectModule} from '@angular/material/select';
import {MatSliderModule} from '@angular/material/slider';
import {MatSlideToggleModule} from '@angular/material/slide-toggle';
import {MatMenuModule} from '@angular/material/menu';
import {MatSidenavModule} from '@angular/material/sidenav';
import {MatToolbarModule} from '@angular/material/toolbar';
import {MatListModule} from '@angular/material/list';
import {MatGridListModule} from '@angular/material/grid-list';
import {MatCardModule} from '@angular/material/card';
import {MatStepperModule} from '@angular/material/stepper';
import {MatTabsModule} from '@angular/material/tabs';
import {MatExpansionModule} from '@angular/material/expansion';
import {MatButtonToggleModule} from '@angular/material/button-toggle';
import {MatChipsModule} from '@angular/material/chips';
import {MatIconModule} from '@angular/material/icon';
import {MatProgressSpinnerModule} from '@angular/material/progress-spinner';
import {MatProgressBarModule} from '@angular/material/progress-bar';
import {MatDialogModule} from '@angular/material/dialog';
import {MatTooltipModule} from '@angular/material/tooltip';
import {MatSnackBarModule} from '@angular/material/snack-bar';
import {MatTableModule} from '@angular/material/table';
import {MatSortModule} from '@angular/material/sort';
import {MatPaginatorModule} from '@angular/material/paginator';
@NgModule({
declarations: [],
imports: [
CommonModule,
MatCheckboxModule,
MatCheckboxModule,
MatButtonModule,
MatInputModule,
MatAutocompleteModule,
MatDatepickerModule,
MatNativeDateModule,
MatFormFieldModule,
MatRadioModule,
MatSelectModule,
MatSliderModule,
MatSlideToggleModule,
MatMenuModule,
MatSidenavModule,
MatToolbarModule,
MatListModule,
MatGridListModule,
MatCardModule,
MatStepperModule,
MatTabsModule,
MatExpansionModule,
MatButtonToggleModule,
MatChipsModule,
MatIconModule,
MatProgressSpinnerModule,
MatProgressBarModule,
MatDialogModule,
MatTooltipModule,
MatSnackBarModule,
MatTableModule,
MatSortModule,
MatPaginatorModule
],
exports: [
MatCheckboxModule,
MatCheckboxModule,
MatButtonModule,
MatInputModule,
MatAutocompleteModule,
MatDatepickerModule,
MatNativeDateModule,
MatFormFieldModule,
MatRadioModule,
MatSelectModule,
MatSliderModule,
MatSlideToggleModule,
MatMenuModule,
MatSidenavModule,
MatToolbarModule,
MatListModule,
MatGridListModule,
MatCardModule,
MatStepperModule,
MatTabsModule,
MatExpansionModule,
MatButtonToggleModule,
MatChipsModule,
MatIconModule,
MatProgressSpinnerModule,
MatProgressBarModule,
MatDialogModule,
MatTooltipModule,
MatSnackBarModule,
MatTableModule,
MatSortModule,
MatPaginatorModule
],
providers: [
{provide: MAT_DATE_LOCALE, useValue: 'es-ES'},
],
})
export class MaterialModule { }
2. Para la pagina en la que se quiere utilizar material, en el archivo module (ej, home.module.ts) agregar:
import { MaterialModule } from '../_material/material.module';
y en imports:
MaterialModule
3. En home.page.html, agregar algo para testearlo:
<ion-content padding>
<div style="text-align: center;">
<mat-button-toggle-group name="fontStyle" aria-label="Font Style" class="example-full-width">
<mat-button-toggle color="primary" value="opcion1">Opcion1</mat-button-toggle>
<mat-button-toggle color="primary" value="opcion2">Opcion2</mat-button-toggle>
</mat-button-toggle-group>
</div>
<div style="text-align: center;">
<mat-form-field class="example-full-width">
<input matInput placeholder="Nombre y apellido">
</mat-form-field>
</div>
<div style="text-align: center;">
<mat-form-field class="example-full-width">
<input matInput placeholder="Email">
</mat-form-field>
</div>
</ion-content>
Quitar fondo en imagenes complejas
1. Elegir pen tool\
2. Hacer click cada cierto tramo alrededor de la imagen
3. Luego de unir el punto final con el origen, hacer ctrl+z
4. Click derecho / make selection
5. Elegir el lazo
6. Click derecho / Layer via copy
2. Hacer click cada cierto tramo alrededor de la imagen
3. Luego de unir el punto final con el origen, hacer ctrl+z
4. Click derecho / make selection
5. Elegir el lazo
6. Click derecho / Layer via copy
Remover borde externo de imagenes recortadas con Photoshop CS6
agregar layer negro
rasterizar la imagen, y colocarla en el layer encima del fondo negro
select / all
click en rectangle marquee tool
click derecho / free transform
mover un poco la imagen
ctrl enter
select / modify / contract
1px
select / inverse
delete
ctrl+d
rasterizar la imagen, y colocarla en el layer encima del fondo negro
select / all
click en rectangle marquee tool
click derecho / free transform
mover un poco la imagen
ctrl enter
select / modify / contract
1px
select / inverse
delete
ctrl+d
Subir archivos con Angular y WebApi
app.component.html
<form [formGroup]="form" (ngSubmit)="onSubmit()" class="form-horizontal form-control-sm">
<div class="form-row">
<label for="nombre" class="col-sm-1 control-label form-control-sm text-right">Nombre</label>
<div class="col-sm-1">
<input class="form-control form-control-sm" formControlName="nombre">
</div>
</div>
<div class="form-row mb-2">
<label for="foto" class="col-sm-1 control-label form-control-sm text-right">Foto</label>
<div class="col-sm-3">
<img src="./assets/noimage.png" id="previewFoto" name="previewFoto" style="width: 150px; height: 150px;cursor: pointer" onClick="document.getElementById('foto').click();"
/>
</div>
<input class="form-control form-control-sm" id="foto" type="file" accept=".xlsx" (change)="upload($event)"
#fileInput style="display: none">
</div>
<input type="submit" value="Guardar" [disabled]="!form.valid" class="btn btn-primary col-sm-1">
</form>
app.component.ts
import { Component } from '@angular/core';
import { FormBuilder, FormGroup } from "@angular/forms";
import { DatosService } from './_servicios/datos.service';
import { Datos } from './_modelos/datos';
import { CustomResponse } from './_modelos/custom-response';
import { ResponseMessageCode } from './_servicios/enumerados';
//import { Archivo } from './_modelos/archivo';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent {
datos = new Datos();
form: FormGroup;
constructor(private fb: FormBuilder, private data : DatosService) {
this.createForm();
}
createForm() {
this.form = this.fb.group({
nombre: [''],
foto: ['']
});
}
upload(event) {
this.onFileChange(event);
}
onFileChange(event) {
if (event.target.files.length > 0) {
let archivoSeleccionado = event.target.files[0];
let reader = new FileReader();
reader.readAsDataURL(archivoSeleccionado);
let _this = this;
reader.onloadend = function () {
_this.form.patchValue({
foto: (<string>reader.result).split('base64,')[1]
});
}
}
}
onSubmit() {
this.datos.nombre = this.form.get('nombre').value;
if (this.datos.contenido != 'undefined') {
this.datos.contenido = this.form.get('foto').value;
}
this.data.guardar(this.datos).subscribe(
(response: CustomResponse<any>) => {
if (response.messageCode == ResponseMessageCode.OK) {
console.log("todo ok");
} else {
console.log("mal");
}
}
);
}
ngOnInit() {
}
}
app.module.ts
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { ReactiveFormsModule, FormsModule } from '@angular/forms';
import { HttpModule } from '@angular/http';
import { HttpClientModule } from '@angular/common/http';
import { AppComponent } from './app.component';
import { RouterModule, Routes } from '@angular/router';
const routes: Routes = [
{ path: 'home', component: AppComponent }
]
@NgModule({
declarations: [
AppComponent
],
imports: [
BrowserModule,
HttpModule,
HttpClientModule,
FormsModule,
ReactiveFormsModule,
RouterModule.forRoot(routes)
],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule { }
datos.service.ts
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Observable } from 'rxjs';
@Injectable({
providedIn: 'root'
})
export class DatosService {
constructor(public http: HttpClient) { }
public guardar(datos): Observable<any> {
return this.http.post<any>("http://localhost/servicios/api/creditos/subirarchivo", datos);
}
}
custom-response.ts
export class CustomResponse<T> {
messageCode: number;
message: string;
data: T;
}
datos.ts
export class Datos {
nombre: string;
contenido: string;
}
WebApi C#
[AllowAnonymous]
[OverrideAuthentication]
[HttpPost]
public IHttpActionResult SubirArchivo(Arch datos)
{
var path = System.Web.HttpContext.Current.Server.MapPath("~") + @"\xls\archivo.xlsx";
if (File.Exists(path))
File.Delete(path);
File.WriteAllBytes(path, datos.Contenido);
var mensaje = new { error = false, mensaje = "" };
return this.Ok(mensaje);
}
public class Arch
{
[JsonProperty("nombre")]
public string Nombre { get; set; }
[JsonProperty("contenido")]
public byte[] Contenido { get; set; }
}
no se puede cargar el archivo o ensamblado Microsoft.AI.Web...
Opcion 1:
Eliminar el contenido de la carpeta que se llame igual que el sitio que esta dando el problema, en esta carpeta (ej, si fuera el sitio creditos):
C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\creditos
Opción 2:
Instalar con NuGet:
Microsoft.ApplicationInsights (version 2.7.2)
y
Microsoft.ApplicationInsights.Web (version 2.7.2)
Este ultimo es el que contiene el archivo que resuelve el error: Microsoft.AI.Web.dll
Eliminar el contenido de la carpeta que se llame igual que el sitio que esta dando el problema, en esta carpeta (ej, si fuera el sitio creditos):
C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\creditos
Opción 2:
Instalar con NuGet:
Microsoft.ApplicationInsights (version 2.7.2)
y
Microsoft.ApplicationInsights.Web (version 2.7.2)
Este ultimo es el que contiene el archivo que resuelve el error: Microsoft.AI.Web.dll
Crear un paquete custom con NuGet
Ejemplo: crear un paquete para prueba.dll
mkdir c:\temp\prueba
mkdir c:\temp\prueba\lib
mkdir c:\temp\prueba\lib\net45
copy prueba.dll c:\temp\prueba\lib\net45
nuget spec prueba
nuget pack prueba.nuspec
<?xml version="1.0"?>
<package >
<metadata>
<id>prueba</id>
<version>1.0.0</version>
<authors>carusso</authors>
<owners>carusso</owners>
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<description>prueba</description>
<releaseNotes></releaseNotes>
<copyright></copyright>
<tags></tags>
<dependencies>
<dependency id="SampleDependency" version="1.0" />
</dependencies>
</metadata>
</package>
mkdir c:\temp\prueba
mkdir c:\temp\prueba\lib
mkdir c:\temp\prueba\lib\net45
copy prueba.dll c:\temp\prueba\lib\net45
nuget spec prueba
nuget pack prueba.nuspec
<?xml version="1.0"?>
<package >
<metadata>
<id>prueba</id>
<version>1.0.0</version>
<authors>carusso</authors>
<owners>carusso</owners>
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<description>prueba</description>
<releaseNotes></releaseNotes>
<copyright></copyright>
<tags></tags>
<dependencies>
<dependency id="SampleDependency" version="1.0" />
</dependencies>
</metadata>
</package>
Suscribirse a:
Entradas (Atom)

