1. Netbeans IDE
Netbeans is free and open source Integrated Development Environment (IDE) which supports all major porgramming languages including PHP.  You can download Netbeans only for PHP, Javscript, and CSS from http://netbeans.org/downloads/index.html .

My first rank goes to Netbeans. It has the following features
  • Syntax highlighting
  • Complete PHP 5 Support
  • Auto completion of constructs like if, for and while, XML and HTML
  • Hover Help
  • WYSIWYG CSS editor
  • Integrated JavaScript  support
  • FTP adn SFTP support
  • GIT Open source project CVS support
2. Eclipse PDT (PHP Development Tools)
              Eclipse IDE is always best for developer to customize for their any favorite programming language . Developer needs to download the PDT plugin from the web site to enable the PHP editor in eclipse (www.eclipse.org/pdt) or Easy eclipse  for PHP can be used for dedicated PHP environment. Eclipse  PHP IDE also supports code completion, CSS and Javascript support

3. Aptana Studio 3
           Aptana Studio is the dedicated IDE for PHP, Python, CSS and JavaScript. It is built from Eclipse Scratch. It Supports most of features like Netbeans also light weight IDE. It can be downloaded from the following web site

4. Geany Light Weight IDE
           Geany is a small and lightweight integrated development environment. It was developed to provide a small and fast IDE, which has only a few dependencies from other packages. It is using only the GTK2 toolkit and therefore you need only the GTK2 runtime libraries to run Geany. you can install geany through software center or synaptic package manager in Ubuntu

The basic features of Geany are:
  • Syntax highlighting
  • Code completion
  •  Auto completion of constructs like if, for and while, XML and HTML
  •  Many supported filetypes like C, Java, PHP, HTML, Python, Perl, Pascal
  •  Embedded terminal emulation
5. gPHPedit
             gPHPEdit is a GNOME2 editor that is dedicated to editing PHP files and other supporting files, like HTML/CSS. It has support for drop-down function lists, hints showing parameters, and syntax highlighting.

Still so many IDEs are available for all operating system. Only Linux based IDE are listed here. You can refer this wikipedia link to find out entire PHP editor List
Merhabalar,
Bu yazımızda ücretsiz olan arm programlama derleyicisi olan CooCox ve arm işlemciler için cross platform nasıl kurulur ondan bahsedeceğiz.

1. adım : CooCox indirin : CooCox IDE 

2. adım : Sadece derleyici indirip yüklemek bizim için tek başına yeterli olmayacaktır.Bunun yanında işlemcimize kodlarımızı gönderebilmemiz adına crosscompiler yüklememiz gerekiyor.Crosscompiler bizim bilgisayarımızda ide mizle birlike yazmış olduğumuz programı arm işlemcimizin anlayacağını bir dile çevirerek, yine bu kodların işlemcimizin içerisine gömülmesinde başrol oynayacak.

Crosscompiler : ARM  GNU Cross Compiler

3. adım : Ide mizi ve crosspiler kurduktan sonra sıra geldi işlemci ile aramızda köprü görecek olan toolchain yolunu idemize tanıtmamız gerekiyor. 

Bunu yapabilmemiz için Project -> Select Toolchain Path yolunu takip edin


 daha sonra arm-none-eabi-gcc.exe programının dosya yolunu bu kısımda girmemiz gerekiyor.


ve artık Coocox Ide arm programlama için hazır halde 
This week our new film advice is Who am i


From the beginning to the end this film will affect you indeed.If hardware and software skills are combined together, what will happen ?. This film will give you an answer :)
While watching the film you will find yourself in the middle of the film.

Ok what are the lessons that we take from the film?

Every people has some talents and sometimes it takes time to discover it.In this film a guy  also has discovered his software talent and begins to work with it.This means if you are not happy with your existing job,be sure you have a talent try to discover it.Try and try again and you will find yours :)

Also the film show us a competition between same business area and competition between people who works in the same area.The engineering ethics disqussed in a worse manner and this is really good example how should be engineering ethics in a good manner.

The amazing this was that if soft and hardware skills meets in the same pot, there is no firewalls and freedom begins :) then its up to you how to use it. In ethical way or not.

Merhabalar,

Bu yazımızda yeni bir film tavsiyemizden bahsedeceğiz.Bu haftaki filmimiz Who am i


Başından sonuna kadar sürükleyici ve sonu oldukça şaşırtıcı olan bir film.Film yazılım ve donanımın bir araya getirilerek bir grup hacker ın yasal olmayan yollardan kendilerini ispat etme çabasını anlatıyor.Başından sonun kadar kendinizi hackerlar dünyası içerisinde bulabileceğiniz bir film.

Peki filmde ne gibi dersler çıkarılabilir ?

Öncelikli olarak bir insanın sıradan bir işlerle uğraşırken hatta kendisini toplum içerisinde geri plana atılan bir insan olarak görürken yeteneğinin farkına varmasını ve hayatını bambaşka bir boyuta taşımasını nasıl sağladığı var filmde.Her insan yetenekleri ile doğar ancak bunu keşfetmesi zaman alabilir :)

Diğer yandan filmde etik ahlakının yasal olmayan yolları işlenmiş.Mühendislik etiğinin karanlık yüzünü bu filmde görebiliryoruz.Yine filmin içerisinde aynı alanda çalışan insanların (hacker topluluğu oluyor) birbirleri arasındaki rekabetlerinin doruklarına ulaşıyorsunuz.Mesleki hayatımızda da olduğu gibi.

İnce bir noktada makine dillerini anlamanın ve yazılım ile donanım bilgisinin bir araya gelerek ne kadar inanılmaz boyutlarda muazzam işler çıkarabileceğininde altı çiziliyor filmde.

Keyifli seyirler diliyorum.
Artık bildiğimiz üzere çağımız neslerin interneti çağı ve artık arduino size yeterli gelmiyor ve farklı platformlara yönelmek istiyorsunuz.Bu yazımızda sizin için arduino benzeri programlanabilir en iyi 10 adet geliştirme platformunu kaleme alıyoruz.

#1 – FRDM-K64F

The FRDM-K64F Freescale firması tarafından üretilen java geliştrime platformu arduino eklentileri uyumlu hali ile güzel bir alternatif.

#2 – SeeedStudio Grove system

SeedStudio Grove system sağladığı birbirinden farklı sensörleri sayesinden nesneler interneti için uygulama geliştiren yazılımcı ve donanımcıların vazgeçilmezi durumunda.Arduinodan raspberry pi ye ve hata beaglebone a bile uyumlu olan bu sensörler tak çalıştır mantığı ile gerçektende inanılmaz bir kaynak.

#3 – Raspberry Pi Model A+ and B+

Aslında çok fazla bahsetmeye gerek yok :) ilk çıktığı andan itibaren en ucuz linux tabanlı mini bilgisayar olarak nesnelerin interneti ile ilgilenen arkadaşaların daha çok üst düzey yazılımlarla ilgilendiği bir platform.Windows10 un gömülü sistem versiyonu ile birlikte raspverry pi bir tık boyut atlamış durumda.

#4 – Texas Instruments CC3200 LaunchPad

Çok güçlü bir Arm Cortex M4 işlemciye sahip bu geliştrime platformu ile artık uygulamalarınızı endüstriyel boyuta ulşatırmanın vakti geldi.Hali hazırda internette birçok uygulama örnekleri mevcut.

#5 – Advanticsys XM1000

Wireless sensor ağlarları ile çok ilgili iseniz sizin için kaçınılmaz platformlardan biri.Contiki ve TinyOS ile kendini kanıtlamış olan bu platform üzerinde msp430f2618 işlemci barındırmanın yanı sıra 116K flash hafıza ve 8k ram ile vazgeçilmezlerinizin arasında yerini alacaktır.


#6 – ESP8266

Son zamanlar en popüler ve en minik geliştirme kartlarından biri.Arduino vb platformlarla birlikte AT komutları ile seri haberleşme ile kullanılsa da, tek başına da harikalar yaratabilecek bir platform kendisi.Size kalan sadece Lua dilinde yazılmış örnekleri biraz araştırmak ve aşina olmak.Küçük bir ip ucu vermek gerekirse mevcut arduino IDE ile de bu minik herkülü programlayabilirsiniz.

#7 – Espruino Pico

Ben javascript diline hakimim diğer dillere şu anda ayıracak vaktim yok diyorsanız.Sizin için javascript tabanlı bu geliştirme kartı birebir.256k flash ve 48k ram ile gelen bu cihaz birçok nesnelerin interneti uygulamanızda size ilaç olacaktır.

#8 – Spark Core

Çok güçük ama güçlü.Arm Cortex M3 işelmci ile gelen bu cihaz kutusunda çıkar ve nesnelerin internetine başla sloganı ile piyasada.Online derleyici üzerinden programlama avantajının yanı sıra,yine desktop üzerine yüklenebilecek basit ATOM IDE si ile de bu muazzam cihazı programlayabilirsiniz.En büyük özelliği ile üzerinde Wifi ile birlikte gelmesi.

#9 – CryptoCape


Nesnelerin interneti uygulmanızı güvenli bir boyuta taşımak istiyormusunuz ?
Sizin için düşünülmüş bu ekleti tam da uygulamanıza göre.Tüm veri şifreleme kütüphanelerini bünyesinde barındıran bu cihazlar artık internet uygulamalarınız hiç olmadığı kadar daha güvenli.

#10 – Rapiro


Biraz pahalı olsa da Rapiro arduino ve raspberry pi yi bir araya getirerek bize kendi robotumuzu geliştirme platformu sunuyor.Hele ki birde wifi eklediğinizde tadından yenmez bir hal alacağına eminim :)

Bu makelemizde sizlerle içerikleri ile öne çıkan en iyi mikroişlemciler ve pic programlama kitaplarından bahsedeceğiz.
.

# En iyi 3 8051 işlemci programlama kitapları


1.The 8051 Microcontroller and embedded system using Assembly and C by Muhammad Ali Mazidi

2. 8051 Micrcontroller internal, instructions, programming and interfacing by Subrata Ghosal

3.The 8051 Micrcontroller (with CD) by kennth ayala

#Pic mikroişlemciler için tavsiye kitaplar



4. The pic microcontroller and embedded system using assembly and C by Muhammad Ali Mazidi

                                                       

5.PIC microcontroller projects in C : basic to advanced by dogan ibrahim


#Avr programlama kitapları

6. AVR microcontroller and embedded systems using assembly and C by Muhammad Ali Mazidi


7. Experimenting with AVR Microcontroller (Technology in action) by alan trevennor

#En iyi arm programlama kitapları


8.The definitive Guide for Cortex M3 and M4- by Yiu

9.Embedded system introduction To ARM cortex M by jonathan W valvano

10.ARM system Developer’s Guide: Designing and optimizing system software by sloss


Birçok insan arduinonun endüstriyel boyutta kullanılıp, kullanılamayacağı konusunda tartışma içerisinde.
Bunun tam olarak cevabını sizlere veremesemde,arduino için yazılmış ve endüstriyel uygulamalarda kullanılması kaçınılmaz kütüphanelerden bahsetmek istiyorum.

1. Modbus Kütüphanesi :

Endüstride birçok cihaz ve plc kendi aralarında ya da scada gibi yönetim sistemleri ile haberleşme durumundadır.Modbus ise endüstriyel cihazlar arasında haberleşme metodu olarak kullanılan en yaygın yöntemlerden biridir.


Master Arduino

#include <SoftwareSerial.h>
/*-----( Declare Constants and Pin Numbers )-----*/
#define SSerialRX        10  //Serial Receive pin
#define SSerialTX        11  //Serial Transmit pin

#define SSerialTxControl 3   //RS485 Direction control

#define RS485Transmit    HIGH
#define RS485Receive     LOW

#define Pin13LED         13

/*-----( Declare objects )-----*/
SoftwareSerial RS485Serial(SSerialRX, SSerialTX); // RX, TX

/*-----( Declare Variables )-----*/
int byteReceived;
int byteSend;

void setup()   /****** SETUP: RUNS ONCE ******/
{
  // Start the built-in serial port, probably to Serial Monitor
  Serial.begin(9600);
  Serial.println("YourDuino.com SoftwareSerial remote loop example");
  Serial.println("Use Serial Monitor, type in upper window, ENTER");
  
  pinMode(Pin13LED, OUTPUT);   
  pinMode(SSerialTxControl, OUTPUT);    
  
  digitalWrite(SSerialTxControl, RS485Receive);  // Init Transceiver   
  
  // Start the software serial port, to another device
  RS485Serial.begin(4800);   // set the data rate 

}//--(end setup )---


void loop()   /****** LOOP: RUNS CONSTANTLY ******/
{
  digitalWrite(Pin13LED, HIGH);  // Show activity
  if (Serial.available())
  {
    byteReceived = Serial.read();
    
    digitalWrite(SSerialTxControl, RS485Transmit);  // Enable RS485 Transmit   
    RS485Serial.write(byteReceived);          // Send byte to Remote Arduino
    
    digitalWrite(Pin13LED, LOW);  // Show activity    
    delay(10);
    digitalWrite(SSerialTxControl, RS485Receive);  // Disable RS485 Transmit       
  }
  
  if (RS485Serial.available())  //Look for data from other Arduino
   {
    digitalWrite(Pin13LED, HIGH);  // Show activity
    byteReceived = RS485Serial.read();    // Read received byte
    Serial.write(byteReceived);        // Show on Serial Monitor
    delay(10);
    digitalWrite(Pin13LED, LOW);  // Show activity   
   }  

}//--(end main loop )---

/*-----( Declare User-written Functions )-----*/

//NONE
//*********( THE END )***********

Slave Arduino

#include <SoftwareSerial.h>
/*-----( Declare Constants and Pin Numbers )-----*/
#define SSerialRX        10  //Serial Receive pin
#define SSerialTX        11  //Serial Transmit pin

#define SSerialTxControl 3   //RS485 Direction control
#define RS485Transmit    HIGH
#define RS485Receive     LOW

#define Pin13LED         13

/*-----( Declare objects )-----*/
SoftwareSerial RS485Serial(SSerialRX, SSerialTX); // RX, TX

/*-----( Declare Variables )-----*/
int byteReceived;
int byteSend;

void setup()   /****** SETUP: RUNS ONCE ******/
{
  // Start the built-in serial port, probably to Serial Monitor
  Serial.begin(9600);
  Serial.println("SerialRemote");  // Can be ignored
  
  pinMode(Pin13LED, OUTPUT);   
  pinMode(SSerialTxControl, OUTPUT);  
  
  digitalWrite(SSerialTxControl, RS485Receive);  // Init Transceiver
  
  // Start the software serial port, to another device
  RS485Serial.begin(4800);   // set the data rate 
}//--(end setup )---


void loop()   /****** LOOP: RUNS CONSTANTLY ******/
{
  //Copy input data to output  
  if (RS485Serial.available()) 
  {
    byteSend = RS485Serial.read();   // Read the byte 
    
    digitalWrite(Pin13LED, HIGH);  // Show activity
    delay(10);              
    digitalWrite(Pin13LED, LOW);   
    
    digitalWrite(SSerialTxControl, RS485Transmit);  // Enable RS485 Transmit    
    RS485Serial.write(byteSend); // Send the byte back
    delay(10);   
    digitalWrite(SSerialTxControl, RS485Receive);  // Disable RS485 Transmit      
//    delay(100);
  }
2. PID Kütüphanesi:

Endüstriyel otomasyon projelerinde kontrol metodlarının olmazsa olmazıdır.Birçok uygulamada giriş ve çıkışa bağımlı olarak pid üzerinden kontrol metodları uygulanır.Arduino için pid kütüphanesi kullanmaz endüstriye bazda bir uygulama yapmak istiyorsak kaçınılmaz.

pid.h :

#ifndef PID_v1_h
#define PID_v1_h
#define LIBRARY_VERSION 1.1.1
class PID
{
public:
//Constants used in some of the functions below

#define AUTOMATIC 1

#define MANUAL 0

#define DIRECT 0

#define REVERSE 1

//commonly used functions **************************************************************************

PID(double*, double*, double*, // * constructor. links the PID to the Input, Output, and

double, double, double, int); // Setpoint. Initial tuning parameters are also set here



void SetMode(int Mode); // * sets PID to either Manual (0) or Auto (non-0)



bool Compute(); // * performs the PID calculation. it should be

// called every time loop() cycles. ON/OFF and

// calculation frequency can be set using SetMode

// SetSampleTime respectively



void SetOutputLimits(double, double); //clamps the output to a specific range. 0-255 by default, but

//it's likely the user will want to change this depending on

//the application

//available but not commonly used functions ********************************************************

void SetTunings(double, double, // * While most users will set the tunings once in the

double); // constructor, this function gives the user the option

// of changing tunings during runtime for Adaptive control

void SetControllerDirection(int); // * Sets the Direction, or "Action" of the controller. DIRECT

// means the output will increase when error is positive. REVERSE

// means the opposite. it's very unlikely that this will be needed

// once it is set in the constructor.

void SetSampleTime(int); // * sets the frequency, in Milliseconds, with which

// the PID calculation is performed. default is 100

//Display functions ****************************************************************

double GetKp(); // These functions query the pid for interal values.

double GetKi(); // they were created mainly for the pid front-end,

double GetKd(); // where it's important to know what is actually

int GetMode(); // inside the PID.

int GetDirection(); //

private:

void Initialize();

double dispKp; // * we'll hold on to the tuning parameters in user-entered

double dispKi; // format for display purposes

double dispKd; //

double kp; // * (P)roportional Tuning Parameter

double ki; // * (I)ntegral Tuning Parameter

double kd; // * (D)erivative Tuning Parameter

int controllerDirection;

double *myInput; // * Pointers to the Input, Output, and Setpoint variables

double *myOutput; // This creates a hard link between the variables and the

double *mySetpoint; // PID, freeing the user from having to constantly tell us

// what these values are. with pointers we'll just know.

unsigned long lastTime;

double ITerm, lastInput;

unsigned long SampleTime;

double outMin, outMax;

bool inAuto;

};

#endif

pid.cpp:



#if ARDUINO >= 100
#include "Arduino.h"
#else
#include "WProgram.h"
#endif
#include <PID_v1.h>
/*Constructor (...)*********************************************************
* The parameters specified here are those for for which we can't set up
* reliable defaults, so we need to have the user set them.
***************************************************************************/
PID::PID(double* Input, double* Output, double* Setpoint,
double Kp, double Ki, double Kd, int ControllerDirection)
{
myOutput = Output;
myInput = Input;
mySetpoint = Setpoint;
inAuto = false;
PID::SetOutputLimits(0, 255); //default output limit corresponds to
//the arduino pwm limits
SampleTime = 100; //default Controller Sample Time is 0.1 seconds
PID::SetControllerDirection(ControllerDirection);
PID::SetTunings(Kp, Ki, Kd);
lastTime = millis()-SampleTime;
}

/* Compute() **********************************************************************
* This, as they say, is where the magic happens. this function should be called
* every time "void loop()" executes. the function will decide for itself whether a new
* pid Output needs to be computed. returns true when the output is computed,
* false when nothing has been done.
**********************************************************************************/
bool PID::Compute()
{
if(!inAuto) return false;
unsigned long now = millis();
unsigned long timeChange = (now - lastTime);
if(timeChange>=SampleTime)
{
/*Compute all the working error variables*/
double input = *myInput;
double error = *mySetpoint - input;
ITerm+= (ki * error);
if(ITerm > outMax) ITerm= outMax;
else if(ITerm < outMin) ITerm= outMin;
double dInput = (input - lastInput);
/*Compute PID Output*/
double output = kp * error + ITerm- kd * dInput;
if(output > outMax) output = outMax;
else if(output < outMin) output = outMin;
*myOutput = output;
/*Remember some variables for next time*/
lastInput = input;
lastTime = now;
return true;
}
else return false;
}

/* SetTunings(...)*************************************************************
* This function allows the controller's dynamic performance to be adjusted.
* it's called automatically from the constructor, but tunings can also
* be adjusted on the fly during normal operation
******************************************************************************/
void PID::SetTunings(double Kp, double Ki, double Kd)
{
if (Kp<0 || Ki<0 || Kd<0) return;
dispKp = Kp; dispKi = Ki; dispKd = Kd;
double SampleTimeInSec = ((double)SampleTime)/1000;
kp = Kp;
ki = Ki * SampleTimeInSec;
kd = Kd / SampleTimeInSec;
if(controllerDirection ==REVERSE)
{
kp = (0 - kp);
ki = (0 - ki);
kd = (0 - kd);
}
}
/* SetSampleTime(...) *********************************************************
* sets the period, in Milliseconds, at which the calculation is performed
******************************************************************************/
void PID::SetSampleTime(int NewSampleTime)
{
if (NewSampleTime > 0)
{
double ratio = (double)NewSampleTime
/ (double)SampleTime;
ki *= ratio;
kd /= ratio;
SampleTime = (unsigned long)NewSampleTime;
}
}
/* SetOutputLimits(...)****************************************************
* This function will be used far more often than SetInputLimits. while
* the input to the controller will generally be in the 0-1023 range (which is
* the default already,) the output will be a little different. maybe they'll
* be doing a time window and will need 0-8000 or something. or maybe they'll
* want to clamp it from 0-125. who knows. at any rate, that can all be done
* here.
**************************************************************************/
void PID::SetOutputLimits(double Min, double Max)
{
if(Min >= Max) return;
outMin = Min;
outMax = Max;
if(inAuto)
{
if(*myOutput > outMax) *myOutput = outMax;
else if(*myOutput < outMin) *myOutput = outMin;
if(ITerm > outMax) ITerm= outMax;
else if(ITerm < outMin) ITerm= outMin;
}
}
/* SetMode(...)****************************************************************
* Allows the controller Mode to be set to manual (0) or Automatic (non-zero)
* when the transition from manual to auto occurs, the controller is
* automatically initialized
******************************************************************************/
void PID::SetMode(int Mode)
{
bool newAuto = (Mode == AUTOMATIC);
if(newAuto == !inAuto)
{ /*we just went from manual to auto*/
PID::Initialize();
}
inAuto = newAuto;
}
/* Initialize()****************************************************************
* does all the things that need to happen to ensure a bumpless transfer
* from manual to automatic mode.
******************************************************************************/
void PID::Initialize()
{
ITerm = *myOutput;
lastInput = *myInput;
if(ITerm > outMax) ITerm = outMax;
else if(ITerm < outMin) ITerm = outMin;
}
/* SetControllerDirection(...)*************************************************
* The PID will either be connected to a DIRECT acting process (+Output leads
* to +Input) or a REVERSE acting process(+Output leads to -Input.) we need to
* know which one, because otherwise we may increase the output when we should
* be decreasing. This is called from the constructor.
******************************************************************************/
void PID::SetControllerDirection(int Direction)
{
if(inAuto && Direction !=controllerDirection)
{
kp = (0 - kp);
ki = (0 - ki);
kd = (0 - kd);
}
controllerDirection = Direction;
}
/* Status Funcions*************************************************************
* Just because you set the Kp=-1 doesn't mean it actually happened. these
* functions query the internal state of the PID. they're here for display
* purposes. this are the functions the PID Front-end uses for example
******************************************************************************/
double PID::GetKp(){ return dispKp; }
double PID::GetKi(){ return dispKi;}
double PID::GetKd(){ return dispKd;}
int PID::GetMode(){ return inAuto ? AUTOMATIC : MANUAL;}
int PID::GetDirection(){ return controllerDirection;}
3. Map Fonksiyonu:

Map fonksiyonunu bizim için çok önemli kılan özelliği, belirli bir giriş aralığına göre çıkış aralığı tanımlayabilmemiz.Buda bize endüstriyel otomasyon bazında gerek kompanzasyon gerekse analog çıkış atamak istediğimizde belirli set değerleri arasında bir çıkış verebilmemize olanak sağlıyor.

/* Map an analog value to 8 bits (0 to 255) */
void setup() {}

void loop()
{
  int val = analogRead(0);
  val = map(val, 0, 1023, 0, 255);
  analogWrite(9, val);
}

4. Sofware Serial :

Endüstriyel birçok projede birden fazla cihazla haberleşmede daha önce bahsettiğimiz modbus protokolünün yanı sıra birden fazla seri haberleşme metoduna da ihtiyaç duyulabilmektedir.

SoftwareSerial mySerial(10, 11); // RX, TX

void setup() {
  // Open serial communications and wait for port to open:
  Serial.begin(57600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }


  Serial.println("Goodnight moon!");

  // set the data rate for the SoftwareSerial port
  mySerial.begin(4800);
  mySerial.println("Hello, world?");
}

void loop() { // run over and over
  if (mySerial.available()) {
    Serial.write(mySerial.read());
  }
  if (Serial.available()) {
    mySerial.write(Serial.read());
  }
}


ELEKTRO BLOGGER A HOŞGELDINIZ

ARAMA YAP

EN COK OKUNANLAR

- Copyright © ELEKTRO-BLOGGER Blogger