Max

Apr 032014
 

What is this about?

How to set up a Raspbian system as a read-only system in a couple of easy steps.

03-March_Reading_for_life

This penguin has been doing a lot of reading as of lately.

Why is this of interest to me?

The filesystem on the Raspberry Pi’s SD card, as every filesystem on every computer, can be corrupted if you disconnect the power suply.

Once you make the filesystem read-only (all changes go to a RAM-Disk), you will be able to disconnect the power supply whenever you want.

An additional bonus is less wear on the SD card – sometimes you do NOT want the logfiles which a standard Linux / Raspbian will write to anyway. Our solution will write those to a RAM-Disk and discard them on reboot / power cycling.

Last but not least, you can set up a known state to boot into, experiment, and if things go wrong, simply reboot.

How-To make Raspbian read-only

all commands to be run as root (sudo su) if not specified otherwise.

This how-to is based on another how-to I found on the Internet, in German. Thanks guys!

Disable swap

dphys-swapfile swapoff
dphys-swapfile uninstall
update-rc.d dphys-swapfile disable

Install UnionFS

UnionFS is an overlaying filesystem (you can mount from several different locations into the same folder). In case of collisions, UnionFS uses priorities for the filesystems. It is frequently used to create RAM-Disk Overlays for read-only systems, for instance also with Live CDs.

aptitude install unionfs-fuse

Create mount script

nano /usr/local/bin/mount_unionfs

Add the following content to this file:

 #!/bin/sh
 DIR=$1
 ROOT_MOUNT=$(awk '$2=="/" {print substr($4,1,2)}' < /etc/fstab)
 if [ $ROOT_MOUNT = "rw" ]
 then
   /bin/mount --bind ${DIR}_org ${DIR}
 else
   /bin/mount -t tmpfs ramdisk ${DIR}_rw
   /usr/bin/unionfs-fuse -o cow,allow_other,suid,dev,nonempty ${DIR}_rw=RW:${DIR}_org=RO ${DIR}
 fi

make it executable:

 chmod +x /usr/local/bin/mount_unionfs

Update /etc/fstab:

nano /etc/fstab

Modify the file to read (adjust partitions for NOOBS!) as follows:

proc            /proc           proc    defaults          0       0
/dev/mmcblk0p1  /boot           vfat    ro                0       2
/dev/mmcblk0p2  /               ext4    ro,noatime        0       1
mount_unionfs   /etc            fuse    defaults          0       0
mount_unionfs   /var            fuse    defaults          0       0
none            /tmp            tmpfs   defaults          0       0

Prepare the directories

cp -al /etc /etc_org
mv /var /var_org
mkdir /etc_rw
mkdir /var /var_rw
reboot

At this point your Raspberry Pi should be read-only already. You can verify this with

mount

This command should show something like the following:

/dev/root on / type ext4 (ro,noatime,data=ordered)
devtmpfs on /dev type devtmpfs (rw,relatime,size=215824k,nr_inodes=53956,mode=755)
tmpfs on /run type tmpfs (rw,nosuid,noexec,relatime,size=44820k,mode=755)
tmpfs on /run/lock type tmpfs (rw,nosuid,nodev,noexec,relatime,size=5120k)
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime)
tmpfs on /run/shm type tmpfs (rw,nosuid,nodev,noexec,relatime,size=89620k)
devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620)
/dev/mmcblk0p1 on /boot type vfat (ro,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=ascii,shortname=mixed,errors=remount-ro)
ramdisk on /etc_rw type tmpfs (rw,relatime)
unionfs-fuse on /etc type fuse.unionfs-fuse (rw,relatime,user_id=0,group_id=0,default_permissions,allow_other)
fusectl on /sys/fs/fuse/connections type fusectl (rw,relatime)
ramdisk on /var_rw type tmpfs (rw,relatime)
unionfs-fuse on /var type fuse.unionfs-fuse (rw,relatime,user_id=0,group_id=0,default_permissions,allow_other)
none on /tmp type tmpfs (rw,relatime)

This indicates to you that the filesystems are mounted read-only and unionfs is active.

Clean up the Log directory

mount -o remount,rw /
for f in $(find . -name \*log); do > $f; done
cd /var_org/log
rm -f *.gz

Reboot

Another reboot and you’re done!

reboot

How-To Install additional Packages after “read-only-modding”

You’ve got to remount the root filesystem as readable. For instance, as root, you can do:

mount -o remount,rw /
aptitude update
aptitude install stress
Mar 302014
 

Auf dem Open Source Treffen habe ich zwei Vorträge zur Geschichte und der Zukunft von Computern, und Computertechnologien gehalten. Hier die Vorträge für euch zum Anschauen:

In dem zweiten Teil habe ich einige Videos von spannenden Technologien und Ausblicken gezeigt, die Du hier sehen kannst:

Nokia Morph Concept (Nanotechnologie – das Smartphone der Zukunft): https://www.youtube.com/watch?v=IX-gTobCJHs

How it feels through Google Glass: https://www.youtube.com/watch?v=v1uyQZNg2vE

MIT Tangible Media Group inFORM (3D user interface): https://www.youtube.com/watch?v=lvtfD_rJ2hE

Mar 152014
 

By default, osssink will not work on the Raspberry Pi with gstreamer-1.0.

As root, enter the following:

modprobe snd-pcm-oss

And then you should be able to play your audio files, for instance using:

gst-launch-1.0 playbin uri=file:///home/pi/tina.wav

AIFF files can be played with:

gst-launch-1.0 playbin uri=file:///home/pi/tina.aiff

Alternatively this will give you a test tone:

gst-launch-1.0 audiotestsrc ! audioconvert ! audioresample ! autoaudiosink

You can use

alsamixer

to control the volume (using the arrow keys).

Mar 152014
 

With this interesting tool you can redirect input over the network – control other Linux boxes as if you were physically sitting in front of them and using a USB mouse and keyboard.

The project’s GitHub repository is found here:

https://github.com/MerlijnWajer/uinput-mapper

More documentation is available on this site: http://hetgrotebos.org/wiki/uinput-mapper

Here is an introduction how to set up keyboard and mouse forwarding via SSH to a second Linux box.

keyboard-mouse

Installing uinput-mapper

as user root (sudo su):

aptitude install git-core

cd /opt

git clone https://github.com/MerlijnWajer/uinput-mapper.git

cd uinput-mapper

make

This will check out the tool into the /opt directory. This is not a requirement per se, you can also install it in a different directory of your liking.

make will build the file “uinputmapper/uinput_gen.py”

Use the same procedure on the server.

Connect to server

Test the connection by logging in via SSH and the appropriate key to the server (you need to set this private / public authentication up first, of course – see this article, for instance).

ssh root@192.168.1.61

Should log you in to the remote server. Change the username, (the path to the key if needed – can be specified with the –i option), and the IP address according to your setup.

Log out again.

Have a look at the input devices on your “local” machine, from which you will be redirecting the input:

ls -alh /dev/input/*

Sometimes, keyboards will create two devices – one for the additional (multimedia?) keys.

Connect (with error / stdin logging)

./input-read -G /dev/input/event0 -G /dev/input/event1 -D | ssh root@192.168.1.61 “/opt/uinput-mapper/input-create &>>/tmp/errorlog “

If nothing happens, have a look at /tmp/errorlog on your server:

Traceback (most recent call last):
  File “/opt/uinput-mapper/input-create”, line 73, in <module>
    fd, ev = in_f.load()
EOFError

Try connecting with the compatibility option for Python < 2.7 in this case.

./input-read -C -G /dev/input/event0 -G /dev/input/event1 -D | ssh root@192.168.1.61 “/opt/uinput-mapper/input-create -C &>>/tmp/errorlog2 “

please note, that the compatibility flag needs to be given on BOTH sides (local and remote part) of the command.

You can verify your Python version like this:

root@cloudsource2:/opt/uinput-mapper# python –version
Python 2.7.3

If everything works allright, you can leave away the last part (starting with the ampersand “& …”) which just redirects standard output and error from the server for debugging.

Mar 072014
 

Sisvel hat die Nokia Wireless-Patente lizensiert, und wendet sich momentan an Distributoren in England, Deutschland und Italien. Sie wollen 0,71 € je WLAN Gerät, eventuell sogar mehr.

Durch das breite Patentportfolio ist faktisch jeder, der WiFi Geräte in irgend einer Form einsetzen möchte gezwungen, das Portfolio zu lizensieren.

Die Distributoren sind momentan noch am Überlegen, wie sie die Situation handhaben sollen, vermutlich gibt es aber keinen Weg um diese Lizenzgebühr.

Einige weitere Gebühren die von uns (pi3g.com) direkt oder indirekt gezahlt werden:

  • MPEGLA Codec Gebühren (MPEG4 / H.264), MPEG-1 / 2 Codecs falls diese gekauft werden, …
  • WEEE (Elektroschrott)
  • Verpackungsverordnung
  • “GEMA” Gebühr (eigentlich ZPÜ – es verdient nicht nur die GEMA) – für jede SD Karte

Und so einiges mehr … wir werden aufgrund unserer knappen Kalkulation die Erhöhung im WLAN Bereich leider weitergeben müssen!

Mar 012014
 

LCD Display for Raspberry Pi – the Foundation’s first steps

Gordon Hollingworth was hinting at a new interesting product being prepared for the Embedded World 2014 in Nuremberg. We had the chance to see it at both the Farnell and the Toshiba booths.

The Raspberry Pi foundation has an interesting concept, as always:

Toshiba has a chip which converts the Raspberry Pi’s display port to a more generic parallel interface. The drivers – to program which you need to sign NDAs – have been developed by the Foundation, and are freely available.

The Foundation (according to Farnell, and Gordon H. ) will bring two displays to market during this year – a 7 ‘’ display with a low resolution, and a high-resolution 10’’ display. Both are supposed to have touch capabilities. These displays should be ready and in stock with Farnell in three to six months. I assume that RS Components will also stock them, as this is clearly a core extension for the Raspberry Pi.

Developers free to roll their own

Any other developer / entrepreneur, though, can basically source the Toshiba chip and interface it with a display of their choice – even before the Foundation will get to market with their displays.

Here are some pictures of this display:

raspberry-pi-foundation-development-board-display

 

This picture (click to enlarge) shows the Raspberry Pi foundation’s development board, along with a LCD display.

toshiba-raspberry-pi-adapter-chips

Picture showing the setup at the Toshiba booth.

There are two chips which are being demoed. Both carry unique business opportunities with them.

Toshiba HDMI to MIPI CSI2 bridge chip TC358743XBG

This chip (on the pcb developed by the Foundation) connects an Android PC, which plays a movie / runs a 3D rendering (teapot) over HDMI to the Raspberry Pi’s camera port, thus allowing the Raspberry Pi to capture HDMI input (also an idea which will open up many use cases – for instance pass-through recording and streaming of your favourite Playstation games!)

Toshiba MIPI DSI to DPI display chip TC358762XBG

This chip converts the Raspberry Pi’s Display Serial Interface (DSI) to a parallel interface (DPI). (“De-serializer display bridge for connectivity of panels using legacy parallel interface to the Baseband or Application Processors with MIPI® Display Serial Interface

read more about DSI on Wikipedia, and the TC358762XBG product brief.

 

NFC Board for the Raspi

This board has been on the market for a couple of weeks (maybe even months) already. pi3g actually won one sample board, courtesy of Farnell Smile 

NXP Technology provides the NFC chip used on this board. The board’s design is a bit unlucky (very big), and it won’t fit in many “normal” cases on the market, for instance the TEK-BERRY cases we use.

The guys from NXP assured me that it should be no problem to source the chip and alter the board’s design to a smaller board, though. The NFC antenna (which can be seen on the left in the following picture) can include other electronic components in the free space inside, and also components could go on the bottom of the board.

nfc-module-nxp

I see NFC as a very promising technology, and the Raspi is ready to be the first networked NFC reader under 100 € system cost.

 

 

Internet of Things

There are many companies and platforms being shown / developed / available for “Internet of Things” applications. These devices will have  a small custom applications processor, programmable, and with a small amount of RAM. They are then connected via WiFi to your home network, cloud solutions / or provide a built-in webhost for control via your smartphone / tablet.

A very important thing is the initial programming of your WiFi credentials into these devices. There are several solutions emerging. Apple is rolling their own (apple certified devices, which include a proprietary Apple chip, and just “show up” on your iOS devices – especially more present since iOS 7), but there is another interesting option available: BTE.

BTE is Bluetooth Low Energy, and basically is expressly built for such scenarios (of low-data transfer, low-power devices). BTE devices can be set up by the manufacturer to show up on any Smartphone (with built-in BTE – if you have Bluetooth 4.0 you have it), and be accessible without any code / authentication necessary.

You could now use an App to connect via BTE to the new device, set up your WiFi connection credentials, and once the WiFI connection works, and maybe a password is set, the BTE connection will be disabled alltogether. It would only be available again pressing a “factory reset” button.

I do not believe that the Raspberry Pi is a good platform for Internet of Things in mass-production / consumer devices. We need a smaller platform for these applications, with less processing resources, and lower power usage.

For enthusiasts, who want to experiment in this direction, and directly interface with the computer, the Pi is great, though!

Maybe we will build a “Internet of Things” platform on which you can develop your own application / this could also be a great idea to put on Kickstarter / … .

 

Riotboard

The highlight of the fair!

This is what Model C of the Raspberry Pi should be like, if it ever would be published. Technical specifications include:

  • ARM Cortex A9 MPCore Processor at 1 GhZ
  • HD video decoder
  • OpenGL ES 2.0 3D graphics accelerator, 2D accelerator
  • 1 GB DDR3 RAM
  • headphone / microphone (!) jack
  • LVDS, HDMI, Parallel RGB interface
  • four USB ports
  • barrel power connector (not micro USB)
  • 4 GB Flash on-board
  • GBit LAN port
  • GPIO connector

This board runs Android and Ubuntu Linux, at impressive speeds. Web browsing, PDF viewing is quite fluent with it.

The GBit port, and the four USB ports make it a good NAS / home cloud system base board. Further possible applications include Thin Clients, stand-alone web browsing stations, and build-your-own media centres. It should also run web applications more fluently than the Pi. With the built-in flash, you could even make do without an additional SD card.

All this very attractively priced, and available now through Farnell (and soon through us, maybe).

Have a look at the spec sheet. (PDF, 12 MB)

We are seriously considering adding this board to our portfolio as a high-end SBC solution, where the Raspberry Pi simply has insufficient compute power.

Here’s a photo:

riotboard

Jan 312014
 

Open source code allows your operating system and application stack to be recompiled for different systems.

Today, with many applications being migrated into the cloud, good performance per Watt of power usage is paramount in keeping power-costs down.

x86 traditionally has not been optimized for best per-Watt performance – Intel is catching up with Atom, especially with the BayTrail SoC for the mobile application area. For microservers Intel has introduced the C2000 “Avoton” Atom SoC.

Let’s look at a couple of alternatives for modern cloud computing.

The ARM architecture is quite big already in the mobile market, getting more and more into the desktop markets (take the Raspberry Pi for instance), and now it’s taking big strides towards servers.

ARM Contender #1: Calxeda

Calxeda developed one of the first (or maybe THE first) ARM-based server module solutions. Their design “EnergyCore ECX-1000” is based on 4 x ARMv7 Cortex A9 cores (32 bit), running at 1.1 – 1.4 GhZ.

Each board has one memory slot for up to 4 GB of RAM (remember, 32 bit!), and four SATA ports per socket, and five 10 GBit/s on-board LAN-ports. They were specified at 1.5 W power usage per core, and 5 W per node.

It was planned originally by Calxeda to produce a “Midway” chip, which would allow for 40 bit memory addressing. Being socket compatible with the ECX-1000’s, the chip would have allowed to address 16 GB of memory.

According to this article, Calxeda was looking to provide a 15 – 20 x price/performance advantage over “traditional” server processors. This article claims Calxeda was also looking at a 5x – 10x performance / Watt increase.

Dell has built a server based on the Calxeda board architecture and donated it to the Apache Software foundation, so they can tweak Apache, Hadoop, Cassandra, … for the architecture. In this server architecture, up to 360 ECX-1000 nodes can be put in a 4U chassis.

HP has also tested the waters with it’s experimental Redstone ARM Server, based on Calxeda technology. It allows up to 288 ECX-1000 nodes in 4U rack space.

Avantek announced machines based on the Calxeda architecture at the end of 2012, with a 3U base machine (four x ECX-1000 cards, some disk drives) weighing in at about 4000 GBP (~ about 4900 €), and a fully “loaded” machine with 48 cards, giving 192 Cores and 192 GB of memory, mix of disk and flash at about 40.000 GBP (~ about 49.000 €). Here’s Avantek’s info page, which also has a comparison to Xeon E5450 on it.

“Ten times the performance at the same power in the same space”.

Calxeda ran out of money in mid-December 2013, and it looks as though they are shutting down operations. The intellectual property may very well be bought by Dell or HP. It had roughly 125 employees by the time the news hit, and they had raised about 90 – 100 Million $ in venture funding. (Have a look at the article to see an actual Calxeda card, with the SATA ports next to each core). Calxeda was also backed by ARM Holdings Inc.

 

Tilera

Tilera has it’s own RISC based design (non-ARM), including many cores (up to 72) in one SoC, interconnected with the “iMesh” non-blocking interconnect, with “Terabits of on-chip bandwidth”. The cores can be programmed in ANSI C/C++ or JAVA. Linux runs on the system – support for the Tilera architecture was added in October 2010, with ver. 2.6.36 of the Linux kernel. The CPU series itself was launched in October 2011.

Facebook claimed, that in their tests the Tilera architecture was about four times more power efficient than the Intel X86 architecture. They ran memcached 

Router & Wireless company MikroTik has a product called “Cloud Core Router” which is based on a 36 core Tilera CPU. To give you an idea of it’s cost: the router retails (depending on the version) for about 1000 € including VAT.

Have a look at this page to see the Cloud Core Router. Tilera has also some evaluation platforms of their own.

 

ARM Contender #2: Marvell ARMADA XP

This is a series of multicore processors, (quad-core ARM). The XP apparently stands for “extreme performance”.

Marvell powers Dell “Copper” ARM Server.

Chinese search giant Baidu has deployed these.

 

ARM Contender #3: AMD

AMD’s getting on the ARM bandwagon. I always liked that company (and despite my criticism of it these days, I also like Intel!) – they are not disappointing me!

The Opteron A1100 is based on the first true 64 bit addressing ARMv8 core, Cortex A57.

The Octo-Core version of the Opteron A1100 is claimed to be “two to four times faster” when compared with the Opteron X2150, with four x64 Jaguar cores. This is an interesting comparison, because both are targeted to be available on the Moonshot platform (see below).

The TDP of the octo-core version of A1100 is 25 W. It contains two 10 GbE ports, eight SATA 6G ports, eight PCIe-3.0 lanes.

Development platforms based on the Opteron A1100 should be available soon. On the developer board, the chip can address up to 32 x 4 GB of memory (four DIMM slots).

AMD predicts that in 2019 the ARM platform will take up about 25 % of the server market.

Read more in AMD’s press release

 

The Moonshot platform

HP is offering different server-modules for the ProLiant Moonshot. The Moonshot platform is intended for cloud computing centers.

Calxeda’s modules (EnergyCore, see above) were also intended to be used for this platform.

HP also uses Intel’s Atom chips for Moonshot. They plan to use Avoton for it (see below for more information about Avoton).

The first Moonshot system is Moonshot 1500 – taking up 4.3 Rack Units, with 45 ProLiant Moonshot Atom S1200, ethernet switch and some more gear, prices start at 50.605 €.

HP wants to offer KeyStone Chips from TI including many DSPs, interesting for instance for content delivery networks (transcoding), etc.

 

Intel: Avoton

With the BayTrail SoC being targeted at the mobile market, Intel has introduced a different SoC for microservers, which is called Avoton (Atom C2000 series being the first representatives). They also have a SoC Rangeley, which shares some of the Avoton platform and manufacturing process, but is targeted at the communications / networking market.

Avoton has eight CPU cores based on the new Silvermont microarchitecture – the first true reworking of the Atom architecture since it’s beginnings. Intel finally introduced out-of-order execution for it.

Configured with two DIMMs per channel, a single Avoton node can support up to 64 GB RAM. It supports four Gigabit Ethernet connections – but no 10 GBit connection.

They have integrated power control tightly into the chip, and have made sensible tradeoffs – for instance wake up latency has not been compromised upon to avoid dropped packets and such.

They have a choice of different products based on Avoton and Rangeley. Ranging from two cores and 6 W, clocked at 1.7 GhZ to eight cores and 20 W, clocked at 2.4 GhZ.

Figures released from Intel indicate that the Atom C2750 (2.4 GhZ, 8 Cores, 20 Watt) easily outperform Marvell’s ARMADA XP (1,33 GhZ, 4 Cores, A9) and Calxeda’s ECX-1000 (1.4 GhZ, 4 cores, A9) in memory bandwidth and General purpose computing. I agree with the article that AMD’s Cortex A57 core with true 64-bit addressing will be the real rival for Avalon, the one it should be compared against.

Intel is targetting the C2000 at “cold storage” applications. Have a look at this PDF to read more about it.

The C2750 supports Intel’s virtualization feature (VT-x), but not VT-d apparently (which is used to “pass through devices” to the virtualized system, e.g. graphics cards, …)

Performance

Have a look at these charts. They even measure against a Raspberry Pi!

Prices

The Atom C2750’s list price is 171 $.

A1SAi-2750F

Supermicro has a motherboard, the A1SAi-2750F, which integrates the C2750.

This board is avaliable at about 340 € including VAT in Germany. It has 4 DDR-3 SO-DIMM slots, 1 x PCIe 2.0 x 8, 1 x VGA, 2 x 2 x USB 3.0, 2 x USB 2.0, 4 x GB LAN, Also 2 x 6 GB/s SATA, and 4 x 3 GB/s SATA.

It is a Mini-ITX board.

ASRock C2750D4I

This is another option, but more expensive, and with only 2 GbE ports.

 

SPEC_int_rate Benchmarks

source one 

  • Opteron A1100, eight core: 80 (simulated) @ 25 W
  • Opteron X2150, four core: 28,1 @ 22 W
  • Atom C2750 (Avolon): 105 @ 28 W
  • Intel Xeon E7-8870 (2,4 GhZ), Deca Core: 1770 @ 105.63 W
Jan 112014
 

Once upon a time, there was a Raspberry Pi which wanted a shorter card. Luckily, pi3g came to the rescue.

Today, we are very proud to introduce our newest product:

pi.card – half the size, double the fun

pi.card-front-and-back

Size & Compatibility

pi.card is halt the height of your usual SDHC card, a perfect fit for the Raspberry Pi’s SD slot. It is fully compatible with all available Raspberry Pi models and cases, as it simply takes less space.

Initially it will be available as 16 GB Class 6 card, but we plan on introducing additional sizes and options, soon.

Of course, pi.card is compatible with all operating systems, which support standard SDHC cards.

pi.card-and-raspberry-pi

Pre-Installed System

pi.card ships with NOOBS & Raspbian (already selected and pre-installed for your convenience) – you can plug it in and start your Raspberry Pi immediately!

raspberry-pi-with-pi.card

Perfect fit for TEK-BERRY cases

pi.card has been designed with the beautiful TEK-BERRY cases (and of course their owners!) in mind. As we use TEK-BERRY cases for nearly all our products, pi.card is of course also a good addition to your pi3g Raspberry Pi!

pi.card-in-teko-case

raven-case-open-pi.card

Comes with it’s own reader

pi.card comes with it’s very own SD reader, so you can easily re-install / modify / backup pi.card’s contents.

pi.card-smilepi.card-inserted-into-smile

We do not recommend to insert pi.card into normal SDHC readers, as you may not be able to retrieve pi.card easily once you are finished with your reading / writing task. It simply is a mechanical problem – normal readers were not designed with pi.card’s form factor in mind!

Available now

Update: pi.card is now available in a limited quantity in our shop: buy pi.card from pi3g. It costs 25 € (including VAT) for the initial 16 GB version with the special SD reader, excluding shipping. Shop is in German only right now – working on that.

Shipping is free for orders over 100 € to Germany in our pi3g shop, and we have lowered rates for international shipping!

Secure one of the very first pi.card’s!

Dec 102013
 

We have lowered our shipping rates in our store from 16,50 € to 11,25 € – worldwide. Have yourself a berry Christmas!

The shop is still in German, but we’re going to switch to WooCommerce most probably, soon – and it will be in English, then. Please bear with us. If you want to buy something, and have trouble with the language, please send us an e-mail and we will assist you!

pi3g-lowered-shipping-rates

Optimization WordPress Plugins & Solutions by W3 EDGE