RasterVect 24.5   
Vectorizer RasterVect transforms raster images to a vector format.
          Reinders: “AVX-512 May Be a Hidden Gem” in Intel Xeon Scalable Processors   

Imagine if we could use vector processing on something other than just floating point problems.  Today, GPUs and CPUs work tirelessly to accelerate algorithms based on floating point (FP) numbers. Algorithms can definitely benefit from basing their mathematics on bits and integers (bytes, words) if we could just accelerate them too. FPGAs can do this, […]

The post Reinders: “AVX-512 May Be a Hidden Gem” in Intel Xeon Scalable Processors appeared first on HPCwire.


          SOLUCION PARA VARIOS PROGRAMAS appcrash   

SOLUCION PARA VARIOS PROGRAMAS appcrash

Respuesta a Problemas con APPCRASH

Me puede ayudar porfa o si sabe de alguna Solucion al abrir el Vector Works 2010 me sale este error:

Nombre del evento de problema: APPCRASH
Nombre de la aplicación: Vectorworks2010.exe
Versión de la aplicación: 15.0.2.0
Marca de tiempo de la aplicación: 4b0e2827
Nombre del módulo con errores: StackHash_4c0d
Versión del módulo con errores: 0.0.0.0
Marca de tiempo del módul...

Publicado el 26 de Octubre del 2013 por Jose

          4th of july balloons vector icon   
4th of july balloons vector icon clip art
          4th of july award ribbon vector icon   
4th of july award ribbon vector icon clip art
          4th of july banner vector icon   
4th of july banner vector icon clip art
          4th of july calendar day vector icon   
4th of july calendar day vector icon clip art
          4th of july statue of liberty vector icon   
4th of july statue of liberty vector icon clip art
          statue of liberty vector icon   
statue of liberty vector icon clip art
          4th of july cupcake vector icon   
4th of july cupcake vector icon clip art
          4th of july noise maker vector icon   
4th of july noise maker vector icon clip art
          4th of july USA vector icon   
4th of july USA vector icon clip art
          4th of july rocket firework vector icon   
4th of july rocket firework vector icon clip art
          4th of july uncle sam hat vector icon   
4th of july uncle sam hat vector icon clip art
          4th of july party balloon vector icon   
4th of july party balloon vector icon clip art
          4th of july gift vector icon   
4th of july gift vector icon clip art
          4th of july USA statue of liberty vector icon   
4th of july USA statue of liberty vector icon clip art
          4th of july fireworks vector icon   
4th of july fireworks vector icon clip art
          4th of july USA ribbon vector icon   
4th of july USA ribbon vector icon clip art
          4th of july bbq grill vector icon   
4th of july bbq grill vector icon clip art
          4th of july hotdog vector icon   
4th of july hotdog vector icon clip art
          4th of july USA star vector icon   
4th of july USA star vector icon clip art
          4th of july USA flag vector icon   
4th of july USA flag vector icon clip art
          shamrock St Patricks Day flat vector design GF   
shamrock St Patricks Day flat vector design GF clip art
          brown light saber sword cut file vector art   
brown light saber sword cut file vector art clip art
          gold light saber sword cut file vector art   
gold light saber sword cut file vector art clip art
          purple light saber sword cut file vector art   
purple light saber sword cut file vector art clip art
          grey light saber sword cut file vector art   
grey light saber sword cut file vector art clip art
          cute little girl svg cut file dxf vector   
cute little girl svg cut file dxf vector clip art
          green light saber sword cut file vector art   
green light saber sword cut file vector art clip art
          little girl svg cut file dxf vector   
little girl svg cut file dxf vector clip art
          primary colors crayon svg cut file vector icon   
primary colors crayon svg cut file vector icon clip art
          yellow light saber sword cut file vector art   
yellow light saber sword cut file vector art clip art
          blue light saber sword cut file vector art   
blue light saber sword cut file vector art clip art
          teal light saber sword cut file vector art   
teal light saber sword cut file vector art clip art
          digi kitty cartoon cat vector svg cut file   
digi kitty cartoon cat vector svg cut file clip art
          number set vector svg cut files art   
number set vector svg cut files art clip art
          dandelion yellow crayon svg cut file vector icon   
dandelion yellow crayon svg cut file vector icon clip art
          pink light saber sword cut file vector art   
pink light saber sword cut file vector art clip art
          clover St Patricks Day flat vector design GF   
clover St Patricks Day flat vector design GF clip art
          pineapple svg cut file vector monogram dxf   
pineapple svg cut file vector monogram dxf clip art
          Announcing VanEck Vectors ETFs' June 2017 Distributions   

Click to view a price quote on ITM.

Click to research the Financial Services industry.

          Announcing VanEck Vectors Equity ETF's June 2017 Distributions   

Click to view a price quote on PPH.

Click to research the Financial Services industry.

          beer mug St Patricks Day flat vector design GF   
beer mug St Patricks Day flat vector design GF clip art
          lime green light saber sword cut file vector art   
lime green light saber sword cut file vector art clip art
          orange light saber sword cut file vector art   
orange light saber sword cut file vector art clip art
          red light saber sword cut file vector art   
red light saber sword cut file vector art clip art
          shamrock clover St Patricks Day flat vector design GF   
shamrock clover St Patricks Day flat vector design GF clip art
          pineapple svg cut file vector   
pineapple svg cut file vector clip art
          aqua light saber sword cut file vector art   
aqua light saber sword cut file vector art clip art
          pineapple dxf vector cut file   
pineapple dxf vector cut file clip art
          crayon set svg cut file vector icon   
crayon set svg cut file vector icon clip art
          10674 Royalty Free RF Clipart Cute Frog Female Cartoon Mascot Character In A Pond Holding A Valentin   
10674 Royalty Free RF Clipart Cute Frog Female Cartoon Mascot Character In A Pond Holding A Valentine Love Heart With Text Happy Valentines Day Vector Illustration clip art
          10666 Royalty Free Clipart Smiling Frog Female Cartoon Mascot Character Holding A Valentine Love Hea   
10666 Royalty Free Clipart Smiling Frog Female Cartoon Mascot Character Holding A Valentine Love Heart With Text Kiss Me Vector Greeting Card With Flowers And Text Happy Valentine Day clip art
          10702 Royalty Free RF Clipart I Love Dog With Red Heart Paw Print Logo Design Vector Illustration   
10702 Royalty Free RF Clipart I Love Dog With Red Heart Paw Print Logo Design Vector Illustration clip art
          10924 Royalty Free RF Clipart Happy Egg Cartoon Mascot Character Waving For Greeting With Speech Bub   
10924 Royalty Free RF Clipart Happy Egg Cartoon Mascot Character Waving For Greeting With Speech Bubble And Text Yo! Vector Illustration clip art
          10943 Royalty Free RF Clipart Black And White Smiling Egg Cartoon Mascot Character Showing Thumbs Up   
10943 Royalty Free RF Clipart Black And White Smiling Egg Cartoon Mascot Character Showing Thumbs Up Vector Illustration clip art
          10802 Royalty Free RF Clipart Lover Bomb Cartoon Mascot Character With Open Arms For Hugging And Hea   
10802 Royalty Free RF Clipart Lover Bomb Cartoon Mascot Character With Open Arms For Hugging And Hearts Vector Illustration clip art
          10929 Royalty Free RF Clipart Black And White Talking Egg Cartoon Mascot Character Holding A Blank S   
10929 Royalty Free RF Clipart Black And White Talking Egg Cartoon Mascot Character Holding A Blank Sign Vector Illustration clip art
          10715 Royalty Free RF Clipart I Love Animals With Bone And Red Heart With Paw Print Logo Design Vect   
10715 Royalty Free RF Clipart I Love Animals With Bone And Red Heart With Paw Print Logo Design Vector Illustration clip art
          10696 Royalty Free RF Clipart Vintage Cartoon Hand Giving Thumbs Up Gesture Vector With Stars Sunbur   
10696 Royalty Free RF Clipart Vintage Cartoon Hand Giving Thumbs Up Gesture Vector With Stars Sunburst Background In Old Style clip art
          10829 Royalty Free RF Clipart Black And White Nervous Bomb Face Cartoon Mascot Character With Expres   
10829 Royalty Free RF Clipart Black And White Nervous Bomb Face Cartoon Mascot Character With Expressions Vector Illustration clip art
          10683 Royalty Free RF Clipart Cute Panda Bear Cartoon Mascot Character Holding A Valentine Love Hear   
10683 Royalty Free RF Clipart Cute Panda Bear Cartoon Mascot Character Holding A Valentine Love Heart With Text Be Me Vector Illustration clip art
          10786 Royalty Free RF Clipart Black And White Smiling Bomb Cartoon Mascot Character Holding Wooden B   
10786 Royalty Free RF Clipart Black And White Smiling Bomb Cartoon Mascot Character Holding Wooden Blank Sign Vector Illustration clip art
          10889 Royalty Free RF Clipart Crying Cartoon Square Emoticons With Tears And Expression Vector With    
10889 Royalty Free RF Clipart Crying Cartoon Square Emoticons With Tears And Expression Vector With Yellow Background clip art
          10952 Royalty Free RF Clipart Red Easter Egg Cartoon Mascot Character Wearing A Foam Finger Vector I   
10952 Royalty Free RF Clipart Red Easter Egg Cartoon Mascot Character Wearing A Foam Finger Vector Illustration clip art
          10629 Royalty Free RF Clipart Happy Marmot Cartoon Mascot Character With Open Arms Vector Flat Desig   
10629 Royalty Free RF Clipart Happy Marmot Cartoon Mascot Character With Open Arms Vector Flat Design clip art
          10841 Royalty Free RF Clipart Joy Logo With Smiley Face Cartoon Character Vector Illustration   
10841 Royalty Free RF Clipart Joy Logo With Smiley Face Cartoon Character Vector Illustration clip art
          10895 Royalty Free RF Clipart Smiling Love Cartoon Square Emoticons With Hearts Eyes And Expression    
10895 Royalty Free RF Clipart Smiling Love Cartoon Square Emoticons With Hearts Eyes And Expression Vector With Yellow Background clip art
          10867 Royalty Free RF Clipart Nervous Cartoon Funny Face With Panic Expression Vector Illustration   
10867 Royalty Free RF Clipart Nervous Cartoon Funny Face With Panic Expression Vector Illustration clip art
          10964 Royalty Free RF Clipart Chef Egg Cartoon Mascot Character Showing Thumbs Up And Holding A Fryi   
10964 Royalty Free RF Clipart Chef Egg Cartoon Mascot Character Showing Thumbs Up And Holding A Frying Pan Vector Illustration clip art
          10872 Royalty Free RF Clipart Scared Cartoon Funny Face With Panic Expression Vector With Blue Backg   
10872 Royalty Free RF Clipart Scared Cartoon Funny Face With Panic Expression Vector With Blue Background clip art
          10920 Royalty Free RF Clipart Black And White Surprisingly Cartoon Funny Face With Expression Vector   
10920 Royalty Free RF Clipart Black And White Surprisingly Cartoon Funny Face With Expression Vector Illustration clip art
          10706 Royalty Free RF Clipart Red Heart Paw Print With Claws And Dog Head Silhouette Logo Design Vec   
10706 Royalty Free RF Clipart Red Heart Paw Print With Claws And Dog Head Silhouette Logo Design Vector With Text I love My Dog clip art
          10645 Royalty Free RF Clipart Happy Marmmot Cartoon Mascot Character Waving In Groundhog Day Vector    
10645 Royalty Free RF Clipart Happy Marmmot Cartoon Mascot Character Waving In Groundhog Day Vector Flat Design With Background And Text Happy Groundhog Day clip art
          10800 Royalty Free RF Clipart Crazy Bomb Cartoon Mascot Character Running Vector Illustration   
10800 Royalty Free RF Clipart Crazy Bomb Cartoon Mascot Character Running Vector Illustration clip art
          10696 Royalty Free RF Clipart Yellow Cartoon Hand Giving Thumbs Up Gesture Vector With Vintage Stars   
10696 Royalty Free RF Clipart Yellow Cartoon Hand Giving Thumbs Up Gesture Vector With Vintage Stars Background clip art
          10971 Royalty Free RF Clipart Talking Egg Cartoon Mascot Character Holding A Blank Sign Vector Illus   
10971 Royalty Free RF Clipart Talking Egg Cartoon Mascot Character Holding A Blank Sign Vector Illustration clip art
          10843 Royalty Free RF Clipart Joy Logo With Smiley Face Cartoon Character Vector With Green Backgrou   
10843 Royalty Free RF Clipart Joy Logo With Smiley Face Cartoon Character Vector With Green Background clip art
          10919 Royalty Free RF Clipart Black And White Sick Cartoon Funny Face With Tired Expression And Ther   
10919 Royalty Free RF Clipart Black And White Sick Cartoon Funny Face With Tired Expression And Thermometer Vector Illustration clip art
          10883 Royalty Free RF Clipart Surprisingly Cartoon Funny Face With Expression Vector Illustration   
10883 Royalty Free RF Clipart Surprisingly Cartoon Funny Face With Expression Vector Illustration clip art
          10978 Royalty Free RF Clipart Colored Easter Egg Cartoon Mascot Character Holding A Blank Sign Vecto   
10978 Royalty Free RF Clipart Colored Easter Egg Cartoon Mascot Character Holding A Blank Sign Vector Illustration clip art
          10661 Royalty Free RF Clipart Cute Princess Frog Cartoon Mascot Character With Crown Holding A Love    
10661 Royalty Free RF Clipart Cute Princess Frog Cartoon Mascot Character With Crown Holding A Love Heart Vector Illustration clip art
          10935 Royalty Free RF Clipart Black And White Cute Egg Cartoon Mascot Character Holding A Blank Sign   
10935 Royalty Free RF Clipart Black And White Cute Egg Cartoon Mascot Character Holding A Blank Sign Vector Illustration clip art
          10725 Royalty Free RF Clipart Chef Pig Cartoon Mascot Character Holding A Tray Of Fast Food And Givi   
10725 Royalty Free RF Clipart Chef Pig Cartoon Mascot Character Holding A Tray Of Fast Food And Giving A Thumb Up Vector Illustration clip art
          10907 Royalty Free RF Clipart Black And White Evil Cartoon Funny Face With Bitchy Expression Vector    
10907 Royalty Free RF Clipart Black And White Evil Cartoon Funny Face With Bitchy Expression Vector Illustration clip art
          10730 Royalty Free RF Clipart Winking Chef Pig Cartoon Mascot Character Circle Banner Vector Illustr   
10730 Royalty Free RF Clipart Winking Chef Pig Cartoon Mascot Character Circle Banner Vector Illustration clip art
          10724 Royalty Free RF Clipart Chef Pig Cartoon Mascot Character Holding A Tray Of Fast Food Over A W   
10724 Royalty Free RF Clipart Chef Pig Cartoon Mascot Character Holding A Tray Of Fast Food Over A Wooden Sign Giving A Thumb Up Vector With Text Welcome clip art
          10659 Royalty Free RF Clipart Cute Princess Frog Cartoon Mascot Character With Crown And Arrow Holdi   
10659 Royalty Free RF Clipart Cute Princess Frog Cartoon Mascot Character With Crown And Arrow Holding A Love Heart Vector Illustration clip art
          10825 Royalty Free RF Clipart Black And White Crying Bomb Face Cartoon Mascot Character With Tears V   
10825 Royalty Free RF Clipart Black And White Crying Bomb Face Cartoon Mascot Character With Tears Vector Illustration clip art
          10691 Royalty Free RF Clipart African American Cartoon Hand Giving Thumbs Up Gesture Vector With Tex   
10691 Royalty Free RF Clipart African American Cartoon Hand Giving Thumbs Up Gesture Vector With Text OK clip art
          10731 Royalty Free RF Clipart Winking Chef Pig Cartoon Mascot Character Red Circle Banner With Text    
10731 Royalty Free RF Clipart Winking Chef Pig Cartoon Mascot Character Red Circle Banner With Text Welcome Vector Illustration clip art
          10860 Royalty Free RF Clipart Cartoon Funny Face With Dollar Eyes And Smiling Expression Vector With   
10860 Royalty Free RF Clipart Cartoon Funny Face With Dollar Eyes And Smiling Expression Vector With Green Background clip art
          10949 Royalty Free RF Clipart Happy Colored Easter Egg Cartoon Mascot Character Holding A Paintbrush   
10949 Royalty Free RF Clipart Happy Colored Easter Egg Cartoon Mascot Character Holding A Paintbrush And Palette Vector Illustration clip art
          10909 Royalty Free RF Clipart Black And White Angry Cartoon Funny Face With Grumpy Expression Vector   
10909 Royalty Free RF Clipart Black And White Angry Cartoon Funny Face With Grumpy Expression Vector Illustration clip art
          10687 Royalty Free RF Clipart African American Cartoon Hand Giving Thumbs Up Gesture Vector Illustra   
10687 Royalty Free RF Clipart African American Cartoon Hand Giving Thumbs Up Gesture Vector Illustration clip art
          10784 Royalty Free RF Clipart Black And White Funny Bomb Cartoon Mascot Character With A Panic Expre   
10784 Royalty Free RF Clipart Black And White Funny Bomb Cartoon Mascot Character With A Panic Expression Vector Illustration clip art
          10668 Royalty Free RF Clipart Cute Frog Female Cartoon Mascot Character Vector Illustration   
10668 Royalty Free RF Clipart Cute Frog Female Cartoon Mascot Character Vector Illustration clip art
          10957 Royalty Free RF Clipart Black And White Happy Egg Cartoon Mascot Character Waving For Greeting   
10957 Royalty Free RF Clipart Black And White Happy Egg Cartoon Mascot Character Waving For Greeting Vector Illustration clip art
          10637 Royalty Free RF Clipart Cute Marmot Cartoon Mascot Character Waving From Corner Vector Flat De   
10637 Royalty Free RF Clipart Cute Marmot Cartoon Mascot Character Waving From Corner Vector Flat Design With Background And Text Happy Groundhog Day clip art
          10755 Royalty Free RF Clipart Scared Orange Balloon Cartoon Mascot Character Vector Illustration   
10755 Royalty Free RF Clipart Scared Orange Balloon Cartoon Mascot Character Vector Illustration clip art
          10947 Royalty Free RF Clipart Black And White Smiling Egg Cartoon Mascot Character With A Rabbit Ear   
10947 Royalty Free RF Clipart Black And White Smiling Egg Cartoon Mascot Character With A Rabbit Ears And Ribbon Waving For Greeting Vector Illustration clip art
          10651 Royalty Free RF Clipart Cute Little Yeti Cartoon Mascot Character Holding A Valentine Love Hea   
10651 Royalty Free RF Clipart Cute Little Yeti Cartoon Mascot Character Holding A Valentine Love Heart Vector Illustration clip art
          10812 Royalty Free RF Clipart Happy Bomb Face Cartoon Mascot Character With Expressions Vector Illus   
10812 Royalty Free RF Clipart Happy Bomb Face Cartoon Mascot Character With Expressions Vector Illustration clip art
          10710 Royalty Free RF Clipart I Love Dog With Black Heart Paw Print With Claws Logo Design Vector Il   
10710 Royalty Free RF Clipart I Love Dog With Black Heart Paw Print With Claws Logo Design Vector Illustration clip art
          10804 Royalty Free RF Clipart Smiling Bomb Cartoon Mascot Character Holding A Wooden Blank Sign Vect   
10804 Royalty Free RF Clipart Smiling Bomb Cartoon Mascot Character Holding A Wooden Blank Sign Vector Illustration clip art
          10656 Royalty Free RF Clipart Cute Frog Cartoon Mascot Character Holding A Valentine Love Heart Vect   
10656 Royalty Free RF Clipart Cute Frog Cartoon Mascot Character Holding A Valentine Love Heart Vector With Text I love You clip art
          10816 Royalty Free RF Clipart Angry Bomb Face Cartoon Mascot Character With Expressions Vector Illus   
10816 Royalty Free RF Clipart Angry Bomb Face Cartoon Mascot Character With Expressions Vector Illustration clip art
          10790 Royalty Free RF Clipart Winking Bomb Cartoon Mascot Character Giving A Thumb Vector Illustrati   
10790 Royalty Free RF Clipart Winking Bomb Cartoon Mascot Character Giving A Thumb Vector Illustration clip art
          10885 Royalty Free RF Clipart Happy Cartoon Square Emoticons With Smiling Expression Vector With Yel   
10885 Royalty Free RF Clipart Happy Cartoon Square Emoticons With Smiling Expression Vector With Yellow Background clip art
          10874 Royalty Free RF Clipart Mad Cartoon Funny Face With Crazy Expression And Protruding Tongue Vec   
10874 Royalty Free RF Clipart Mad Cartoon Funny Face With Crazy Expression And Protruding Tongue Vector With Orange Background clip art
          10801 Royalty Free RF Clipart Black And White Bomb Cartoon Mascot Character With Open Arms For Huggi   
10801 Royalty Free RF Clipart Black And White Bomb Cartoon Mascot Character With Open Arms For Hugging Vector Illustration clip art
          10873 Royalty Free RF Clipart Mad Cartoon Funny Face With Crazy Expression And Protruding Tongue Vec   
10873 Royalty Free RF Clipart Mad Cartoon Funny Face With Crazy Expression And Protruding Tongue Vector Illustration clip art
          10830 Royalty Free RF Clipart Nervous Bomb Face Cartoon Mascot Character With Expressions Vector Ill   
10830 Royalty Free RF Clipart Nervous Bomb Face Cartoon Mascot Character With Expressions Vector Illustration clip art
          10916 Royalty Free RF Clipart Black And White Nervous Cartoon Funny Face With Panic Expression Vecto   
10916 Royalty Free RF Clipart Black And White Nervous Cartoon Funny Face With Panic Expression Vector Illustration clip art
          10697 Royalty Free RF Clipart Black And White Hand Giving Thumbs Up Gesture With Cartoon Face Vector   
10697 Royalty Free RF Clipart Black And White Hand Giving Thumbs Up Gesture With Cartoon Face Vector Illustration clip art
          10938 Royalty Free RF Clipart Cute Egg Cartoon Mascot Character Licking His Lips And Holding Silverw   
10938 Royalty Free RF Clipart Cute Egg Cartoon Mascot Character Licking His Lips And Holding Silverware Vector Illustration clip art
          10709 Royalty Free RF Clipart I Love Dog With Black Heart Paw Print Logo Design Vector Illustration   
10709 Royalty Free RF Clipart I Love Dog With Black Heart Paw Print Logo Design Vector Illustration clip art
          10675 Royalty Free RF Clipart Princess Frog Cartoon Mascot Character With Crown And Arrow Perched On   
10675 Royalty Free RF Clipart Princess Frog Cartoon Mascot Character With Crown And Arrow Perched On A Pond Lily Pad In Lake Vector With Background clip art
          10813 Royalty Free RF Clipart Black And White Crazy Bomb Face Cartoon Mascot Character With Expressi   
10813 Royalty Free RF Clipart Black And White Crazy Bomb Face Cartoon Mascot Character With Expressions Vector Illustration clip art
          10815 Royalty Free RF Clipart Black And White Angry Bomb Face Cartoon Mascot Character With Expressi   
10815 Royalty Free RF Clipart Black And White Angry Bomb Face Cartoon Mascot Character With Expressions Vector Illustration clip art
          10980 Royalty Free RF Clipart Scared Cracked Red Egg Cartoon Mascot Character With Open Arms Vector    
10980 Royalty Free RF Clipart Scared Cracked Red Egg Cartoon Mascot Character With Open Arms Vector Illustration clip art
          10922 Royalty Free RF Clipart Happy Egg Cartoon Mascot Character Waving For Greeting Vector Illustra   
10922 Royalty Free RF Clipart Happy Egg Cartoon Mascot Character Waving For Greeting Vector Illustration clip art
          10714 Royalty Free RF Clipart Black And White I Love Animals With Bone And Heart With Paw Print Logo   
10714 Royalty Free RF Clipart Black And White I Love Animals With Bone And Heart With Paw Print Logo Design Vector Illustration clip art
          10653 Royalty Free RF Clipart Happy Little Yeti Cartoon Mascot Character Over A Valentine Love Heart   
10653 Royalty Free RF Clipart Happy Little Yeti Cartoon Mascot Character Over A Valentine Love Heart Vector Illustration clip art
          10951 Royalty Free RF Clipart Smiling Red Easter Egg Cartoon Mascot Character Showing Thumbs Up Vect   
10951 Royalty Free RF Clipart Smiling Red Easter Egg Cartoon Mascot Character Showing Thumbs Up Vector Illustration clip art
          10649 Royalty Free RF Clipart Happy Marmmot Cartoon Mascot Character With Cylinder Hat Waving In Gro   
10649 Royalty Free RF Clipart Happy Marmmot Cartoon Mascot Character With Cylinder Hat Waving In Groundhog Day Vector Flat Design With Background clip art
          10789 Royalty Free RF Clipart Black And White Winking Bomb Cartoon Mascot Character Giving A Thumb V   
10789 Royalty Free RF Clipart Black And White Winking Bomb Cartoon Mascot Character Giving A Thumb Vector Illustration clip art
          10810 Royalty Free RF Clipart Mad Bomb Cartoon Mascot Character In A Prohibited Symbol Form Vector I   
10810 Royalty Free RF Clipart Mad Bomb Cartoon Mascot Character In A Prohibited Symbol Form Vector Illustration clip art
          10669 Royalty Free RF Clipart Smiling Frog Female Cartoon Mascot Character In A Pond Vector Illustra   
10669 Royalty Free RF Clipart Smiling Frog Female Cartoon Mascot Character In A Pond Vector Illustration clip art
          10711 Royalty Free RF Clipart I Love With Black Heart Paw Print With Claws And Dog Silhouette Logo D   
10711 Royalty Free RF Clipart I Love With Black Heart Paw Print With Claws And Dog Silhouette Logo Design Vector Illustration clip art
          10655 Royalty Free RF Clipart Cute Frog Cartoon Mascot Character Holding A Valentine Love Heart Vect   
10655 Royalty Free RF Clipart Cute Frog Cartoon Mascot Character Holding A Valentine Love Heart Vector Illustration clip art
          10795 Royalty Free RF Clipart Happy Bomb Cartoon Mascot Character Jumping With Open Arms Vector Illu   
10795 Royalty Free RF Clipart Happy Bomb Cartoon Mascot Character Jumping With Open Arms Vector Illustration clip art
          10835 Royalty Free RF Clipart Black And White Bomb Face Cartoon Mascot Character With Emoji Expressi   
10835 Royalty Free RF Clipart Black And White Bomb Face Cartoon Mascot Character With Emoji Expressions Vector Illustration clip art
          10846 Royalty Free RF Clipart Joy Yellow Logo With Smiley Face Cartoon Character Vector With Blue Ba   
10846 Royalty Free RF Clipart Joy Yellow Logo With Smiley Face Cartoon Character Vector With Blue Background clip art
          10931 Royalty Free RF Clipart Black And White Strong Egg Cartoon Mascot Character Winking And Showin   
10931 Royalty Free RF Clipart Black And White Strong Egg Cartoon Mascot Character Winking And Showing Muscle Arms Vector Illustration clip art
          10678 Royalty Free RF Clipart Smiling Brown Teddy Bear Cartoon Mascot Character Holding A Valentine    
10678 Royalty Free RF Clipart Smiling Brown Teddy Bear Cartoon Mascot Character Holding A Valentine Love Heart Vector Illustration clip art
          10858 Royalty Free RF Clipart Crying Cartoon Funny Face With Tears And Expression Vector With Orange   
10858 Royalty Free RF Clipart Crying Cartoon Funny Face With Tears And Expression Vector With Orange Background clip art
          10831 Royalty Free RF Clipart Black And White Happy Bomb Face Cartoon Mascot Character With Smiling    
10831 Royalty Free RF Clipart Black And White Happy Bomb Face Cartoon Mascot Character With Smiling Expressions Vector Illustration clip art
          10850 Royalty Free RF Clipart Happy Cartoon Funny Face With Smiling Expression Vector With Yellow Ba   
10850 Royalty Free RF Clipart Happy Cartoon Funny Face With Smiling Expression Vector With Yellow Background clip art
          10857 Royalty Free RF Clipart Crying Cartoon Funny Face With Tears And Expression Vector Illustratio   
10857 Royalty Free RF Clipart Crying Cartoon Funny Face With Tears And Expression Vector Illustration clip art
          10746 Royalty Free RF Clipart Smiling Yellow Balloon Cartoon Mascot Character Vector Illustration   
10746 Royalty Free RF Clipart Smiling Yellow Balloon Cartoon Mascot Character Vector Illustration clip art
          10635 Royalty Free RF Clipart Cute Marmot Cartoon Mascot Character Waving From Corner Vector Flat De   
10635 Royalty Free RF Clipart Cute Marmot Cartoon Mascot Character Waving From Corner Vector Flat Design clip art
          10839 Royalty Free RF Clipart Yellow Smiley Face Cartoon Character Vector Illustration   
10839 Royalty Free RF Clipart Yellow Smiley Face Cartoon Character Vector Illustration clip art
          10699 Royalty Free RF Clipart African American Hand Giving Thumbs Up Gesture With Cartoon Face Vecto   
10699 Royalty Free RF Clipart African American Hand Giving Thumbs Up Gesture With Cartoon Face Vector Illustration clip art
          10970 Royalty Free RF Clipart Black And White Talking Egg Cartoon Mascot Character Holding A Blank S   
10970 Royalty Free RF Clipart Black And White Talking Egg Cartoon Mascot Character Holding A Blank Sign Vector Illustration clip art
          10854 Royalty Free RF Clipart Angry Cartoon Funny Face With Grumpy Expression Vector With Red Backgr   
10854 Royalty Free RF Clipart Angry Cartoon Funny Face With Grumpy Expression Vector With Red Background clip art
          10723 Royalty Free RF Clipart Chef Pig Cartoon Mascot Character Holding A Tray Of Fast Food Over A W   
10723 Royalty Free RF Clipart Chef Pig Cartoon Mascot Character Holding A Tray Of Fast Food Over A Wooden Sign Giving A Thumb Up Vector Illustration clip art
          10966 Royalty Free RF Clipart Chef Egg Cartoon Mascot Character Showing Thumbs Up And Holding A Fryi   
10966 Royalty Free RF Clipart Chef Egg Cartoon Mascot Character Showing Thumbs Up And Holding A Frying Pan With Food Vector With Text Breakfast clip art
          10752 Royalty Free RF Clipart Smiling Blue Balloon Cartoon Mascot Character Vector Illustration   
10752 Royalty Free RF Clipart Smiling Blue Balloon Cartoon Mascot Character Vector Illustration clip art
          10689 Royalty Free RF Clipart Black And White Cartoon Hand Giving Thumbs Up Gesture Vector With Text   
10689 Royalty Free RF Clipart Black And White Cartoon Hand Giving Thumbs Up Gesture Vector With Text OK clip art
          10741 Royalty Free RF Clipart Cartoon Bright Violet Balloon Vector Illustration   
10741 Royalty Free RF Clipart Cartoon Bright Violet Balloon Vector Illustration clip art
          10890 Royalty Free RF Clipart Cartoon Square Emoticons With Dollar Eyes And Smiling Expression Vecto   
10890 Royalty Free RF Clipart Cartoon Square Emoticons With Dollar Eyes And Smiling Expression Vector With Yellow Background clip art
          10636 Royalty Free RF Clipart Cute Marmot Cartoon Mascot Character Waving From Corner Vector Flat De   
10636 Royalty Free RF Clipart Cute Marmot Cartoon Mascot Character Waving From Corner Vector Flat Design With Background clip art
          10879 Royalty Free RF Clipart Sick Cartoon Funny Face With Tired Expression And Thermometer Vector I   
10879 Royalty Free RF Clipart Sick Cartoon Funny Face With Tired Expression And Thermometer Vector Illustration clip art
          10729 Royalty Free RF Clipart Winking Chef Pig Cartoon Mascot Character Vector Illustration   
10729 Royalty Free RF Clipart Winking Chef Pig Cartoon Mascot Character Vector Illustration clip art
          10766 Royalty Free RF Clipart Red Balloons Cartoon Mascot Character Expressions Set Vector Illustrat   
10766 Royalty Free RF Clipart Red Balloons Cartoon Mascot Character Expressions Set Vector Illustration clip art
          10776 Royalty Free RF Clipart Happy Four Colorful Balloons Cartoon Mascot Character With Expressions   
10776 Royalty Free RF Clipart Happy Four Colorful Balloons Cartoon Mascot Character With Expressions Vector With Stars Background And Text Happy Birthday clip art
          10663 Royalty Free RF Clipart Smiling Frog Female Cartoon Mascot Character Holding A Valentine Love    
10663 Royalty Free RF Clipart Smiling Frog Female Cartoon Mascot Character Holding A Valentine Love Heart Vector Illustration clip art
          10721 Royalty Free RF Clipart Chef Pig Cartoon Mascot Character Holding A Cooked Steak On A Bbq Fork   
10721 Royalty Free RF Clipart Chef Pig Cartoon Mascot Character Holding A Cooked Steak On A Bbq Fork Over A Wooden Sign Giving A Thumb Up Vector Illustration clip art
          10864 Royalty Free RF Clipart Smiling Cartoon Funny Face With Happy Expression Vector With Blue Back   
10864 Royalty Free RF Clipart Smiling Cartoon Funny Face With Happy Expression Vector With Blue Background clip art
          10823 Royalty Free RF Clipart Black And White Smiling Bomb Face Cartoon Mascot Character With Expres   
10823 Royalty Free RF Clipart Black And White Smiling Bomb Face Cartoon Mascot Character With Expressions Vector Illustration clip art
          10739 Royalty Free RF Clipart Crazy Black And White Balloon Cartoon Mascot Character Vector Illustra   
10739 Royalty Free RF Clipart Crazy Black And White Balloon Cartoon Mascot Character Vector Illustration clip art
          10677 Royalty Free RF Clipart Black And White Teddy Bear Cartoon Mascot Character Holding A Valentin   
10677 Royalty Free RF Clipart Black And White Teddy Bear Cartoon Mascot Character Holding A Valentine Love Heart Vector Illustration clip art
          10826 Royalty Free RF Clipart Crying Bomb Face Cartoon Mascot Character With Tears Vector Illustrati   
10826 Royalty Free RF Clipart Crying Bomb Face Cartoon Mascot Character With Tears Vector Illustration clip art
          10927 Royalty Free RF Clipart Black And White Scared Cracked Egg Cartoon Mascot Character With Open    
10927 Royalty Free RF Clipart Black And White Scared Cracked Egg Cartoon Mascot Character With Open Arms Vector Illustration clip art
          10716 Royalty Free RF Clipart I Love My Dog With Bone And Red Heart With Paw Print Logo Design Vecto   
10716 Royalty Free RF Clipart I Love My Dog With Bone And Red Heart With Paw Print Logo Design Vector Illustration clip art
          10842 Royalty Free RF Clipart Joy Logo With Smiley Face Cartoon Character Vector Illustration   
10842 Royalty Free RF Clipart Joy Logo With Smiley Face Cartoon Character Vector Illustration clip art
          10853 Royalty Free RF Clipart Angry Cartoon Funny Face With Grumpy Expression Vector Illustration   
10853 Royalty Free RF Clipart Angry Cartoon Funny Face With Grumpy Expression Vector Illustration clip art
          10891 Royalty Free RF Clipart Grumpy Cartoon Square Emoticons With Sadness Expression Vector With Ye   
10891 Royalty Free RF Clipart Grumpy Cartoon Square Emoticons With Sadness Expression Vector With Yellow Background clip art
          10757 Royalty Free RF Clipart Winking Black And White Balloon Cartoon Mascot Character Vector Illust   
10757 Royalty Free RF Clipart Winking Black And White Balloon Cartoon Mascot Character Vector Illustration clip art
          10836 Royalty Free RF Clipart Bomb Face Cartoon Mascot Character With Emoji Expressions Vector Illus   
10836 Royalty Free RF Clipart Bomb Face Cartoon Mascot Character With Emoji Expressions Vector Illustration clip art
          10887 Royalty Free RF Clipart Angry Cartoon Square Emoticons With Grumpy Expression Vector With Yell   
10887 Royalty Free RF Clipart Angry Cartoon Square Emoticons With Grumpy Expression Vector With Yellow Background clip art
          10751 Royalty Free RF Clipart Smiling Black And White Balloon Cartoon Mascot Character Vector Illust   
10751 Royalty Free RF Clipart Smiling Black And White Balloon Cartoon Mascot Character Vector Illustration clip art
          10648 Royalty Free RF Clipart Happy Marmmot Cartoon Mascot Character With Cylinder Hat Waving In Gro   
10648 Royalty Free RF Clipart Happy Marmmot Cartoon Mascot Character With Cylinder Hat Waving In Groundhog Day Vector Flat Design With Background And Text Happy Groundhog Day clip art
          10893 Royalty Free RF Clipart Evil Cartoon Square Emoticons With Bitchy Expression Vector With Yello   
10893 Royalty Free RF Clipart Evil Cartoon Square Emoticons With Bitchy Expression Vector With Yellow Background clip art
          10768 Royalty Free RF Clipart Blue Balloons Cartoon Mascot Character Expressions Set Vector Illustra   
10768 Royalty Free RF Clipart Blue Balloons Cartoon Mascot Character Expressions Set Vector Illustration clip art
          10742 Royalty Free RF Clipart Nervous Black And White Balloon Cartoon Mascot Character Vector Illust   
10742 Royalty Free RF Clipart Nervous Black And White Balloon Cartoon Mascot Character Vector Illustration clip art
          10632 Royalty Free RF Clipart Smiling Marmot Cartoon Mascot Character With Hat And Open Arms In Grou   
10632 Royalty Free RF Clipart Smiling Marmot Cartoon Mascot Character With Hat And Open Arms In Groundhog Day Vector Flat Design With Background Isolated On White clip art
          10820 Royalty Free RF Clipart Smiling Love Bomb Face Cartoon Mascot Character With Hearts Eyes Vecto   
10820 Royalty Free RF Clipart Smiling Love Bomb Face Cartoon Mascot Character With Hearts Eyes Vector Illustration clip art
          10958 Royalty Free RF Clipart Happy Egg Cartoon Mascot Character Waving For Greeting Vector Illustra   
10958 Royalty Free RF Clipart Happy Egg Cartoon Mascot Character Waving For Greeting Vector Illustration clip art
          10870 Royalty Free RF Clipart Smiling Love Cartoon Funny Face With Hearts Eyes And Expression Vector   
10870 Royalty Free RF Clipart Smiling Love Cartoon Funny Face With Hearts Eyes And Expression Vector With Pink Background clip art
          10744 Royalty Free RF Clipart Cartoon Yellow Balloon Vector Illustration   
10744 Royalty Free RF Clipart Cartoon Yellow Balloon Vector Illustration clip art
          Vector obtains $21 million in funding   
Capitalism in space: The smallsat rocket company Vector has obtained $21 million in new funding, making it possible for it to accelerate its test rocket schedule. With this most recent round of funding, Vector will accelerate the company’s upcoming flight test series and launch orbital customer missions in early 2018. Vector’s next launch is planned for Summer 2017, making it
          A Separate Thread for Gary Gaulin   
Post by GaryGaulin
I just went over the article, and can add:

Quote
Relatedly, Penfield observed that spontaneous electrical discharges in the brain cause involuntary sensations and movements and even emotions, but never abstract reasoning or calculation. There are no “calculus” seizures or “moral” seizures, in which patients involuntarily take second derivatives or ponder mercy.


The above is expected, from a vector mapped movement based system.

Quote
Similar observations emerge from Roger Sperry’s famous studies of patients who had undergone surgery to disconnect the hemispheres of the brain. This was done to prevent seizures. The post-operative patients experienced peculiar perceptual and behavioral changes, but they retained unity of personal identity—a unified intellect and will. The changes Sperry discovered in his research (for which he won a Nobel Prize) were so subtle as to pass unnoticed in everyday life.


It is not normal for one hand to keep trying to light a cigarette while the other hand keeps throwing it away. That and other examples of the known side effects of corpus callosotomy surgery indicates that the patients did not fully retain their "unity".

Quote
In the past decade, British researcher Adrian Owen has found using fMRI imaging that some patients with such severe brain damage that they are considered to be in a persistent vegetative state are actually capable of sophisticated thought. The “comatose” patients’ brain scans show that, in reply to questions by an examiner, the patients are in fact thinking and imagining.


The above is also expected, from what at least I have for a model. The important part needed for imagination is at the end of the brain stem, not all the optional add-ons that surround it.
          Tucson aerospace startup raises $21 million in Series A round, hiring 200 for high-wage jobs   
Vector will use the money to accelerate the company’s upcoming flight test series and launch orbital customer missions in early 2018.

          プライベートレーベル スカート フェイクレザー タイト M 茶   
プライベートレーベル スカート フェイク…
現在価格:648 円,入札数:-,終了日時:2017/07/01 22:17
          (Colorado Springs) KRISS VECTOR SDP G2 10MM 5.5" THREADED FDE 15RD - $ 1,329   
KRISS VECTOR SDP G2 10MM 5.5" THREADED FDE 15RD
          TRALALA LIZLISA カーディガン ショート丈 半袖 丸首 リブ 白 F   
TRALALA LIZLISA カーディガン ショート丈…
現在価格:1,728 円,入札数:-,終了日時:2017/07/02 22:43
          Behringer USA BEHRINGER MS40 Studio Recording Equipment, New   
$200.79
End Date: Sunday Jul-30-2017 8:29:38 PDT
Buy It Now for only: $200.79
Buy It Now | Add to watch list

          ESBPCS for VCL v6.9.1 - Delphi 10 Seattle/C++ Builder 10 Seattle   
ESBPCS for VCL is a collection of over 6000 routines/methods and over 235 classes/components in over 140 units for Delphi 7, 2005/Win32, 2006/Win32, 2007, 2009, 2010, XE, XE2, XE3, XE4, XE5, XE6, XE7, XE8, 10 Seattle, 10.1 Berlin, 10.2 Tokyo and C++ Builder 2006, 2007, 2009,2010, XE, XE2, XE3, XE4, XE5, XE6, XE7, XE8, 10 Seattle, 10.1 Berlin, 10.2 Tokyo which are aimed at making "data entry and manipulation easier" for Developers and their Customers. ESBPCS is also available in several subsets: ESBPCS-Calcs, ESBPCS-Dates, ESBPCS-Stats, ESBPCS-Lite as well as the Full version. All versions include source upon registration.Components included cover Integer Edits, Float Edits, Hex Edits, IP Address Edits, Percentage Edits, Date Edits, Time Edits, Date/Time Edits, Month Edits, Time Edits, Complex Edits, Fraction Edits, Currency Edits, Calculator Edits, Calendar Edits, Button Edits, Degree/Minute/Second Edits, Comboboxes, Month Comboboxes, Day of Week Comboboxes, Time Zone Comboboxes, Country Comboboxes, Duration Comboboxes, SpinEdits, Month SpinEdit, DOW SpinEdits, Duration SpinEdits, Currency SpinEdits, Vector Edits, Matrix Edits, Button Edits, Calculators (Scientific and Programmer's), Calendars, Statistical Analysis, Labels, URL Labels, Math Labels, CheckBoxes, RadioGroups, CheckGroups, Memos, RichEdits and much more. Routines included cover Mathematics, Probability, Statistics, Complex Numbers, Fractions, Physics, Geometry, Astronomy, Longitude/Latitude, Unit Conversions, Strings, File IO, Registry, Financials, Country Lists, Holidays, Time Zones, Dates and Times, and much more.Recently added: Jewish Holidays (Hanukkah, Yom Kippur, Rosh Hashanah), National Holidays Includes full source to all components and routines.
          ESBPCS for VCL v6.9.1 - Delphi 10.1 Berlin   
ESBPCS for VCL is a collection of over 6000 routines/methods and over 235 classes/components in over 140 units for Delphi 7, 2005/Win32, 2006/Win32, 2007, 2009, 2010, XE, XE2, XE3, XE4, XE5, XE6, XE7, XE8, 10 Seattle, 10.1 Berlin, 10.2 Tokyo and C++ Builder 2006, 2007, 2009,2010, XE, XE2, XE3, XE4, XE5, XE6, XE7, XE8, 10 Seattle, 10.1 Berlin, 10.2 Tokyo which are aimed at making "data entry and manipulation easier" for Developers and their Customers. ESBPCS is also available in several subsets: ESBPCS-Calcs, ESBPCS-Dates, ESBPCS-Stats, ESBPCS-Lite as well as the Full version. All versions include source upon registration.Components included cover Integer Edits, Float Edits, Hex Edits, IP Address Edits, Percentage Edits, Date Edits, Time Edits, Date/Time Edits, Month Edits, Time Edits, Complex Edits, Fraction Edits, Currency Edits, Calculator Edits, Calendar Edits, Button Edits, Degree/Minute/Second Edits, Comboboxes, Month Comboboxes, Day of Week Comboboxes, Time Zone Comboboxes, Country Comboboxes, Duration Comboboxes, SpinEdits, Month SpinEdit, DOW SpinEdits, Duration SpinEdits, Currency SpinEdits, Vector Edits, Matrix Edits, Button Edits, Calculators (Scientific and Programmer's), Calendars, Statistical Analysis, Labels, URL Labels, Math Labels, CheckBoxes, RadioGroups, CheckGroups, Memos, RichEdits and much more. Routines included cover Mathematics, Probability, Statistics, Complex Numbers, Fractions, Physics, Geometry, Astronomy, Longitude/Latitude, Unit Conversions, Strings, File IO, Registry, Financials, Country Lists, Holidays, Time Zones, Dates and Times, and much more.Recently added: Jewish Holidays (Hanukkah, Yom Kippur, Rosh Hashanah), National Holidays Includes full source to all components and routines.
          ESBPCS for VCL v6.9.1 - Delphi 10.2 Tokyo   
ESBPCS for VCL is a collection of over 6000 routines/methods and over 235 classes/components in over 140 units for Delphi 7, 2005/Win32, 2006/Win32, 2007, 2009, 2010, XE, XE2, XE3, XE4, XE5, XE6, XE7, XE8, 10 Seattle, 10.1 Berlin, 10.2 Tokyo and C++ Builder 2006, 2007, 2009,2010, XE, XE2, XE3, XE4, XE5, XE6, XE7, XE8, 10 Seattle, 10.1 Berlin, 10.2 Tokyo which are aimed at making "data entry and manipulation easier" for Developers and their Customers. ESBPCS is also available in several subsets: ESBPCS-Calcs, ESBPCS-Dates, ESBPCS-Stats, ESBPCS-Lite as well as the Full version. All versions include source upon registration.Components included cover Integer Edits, Float Edits, Hex Edits, IP Address Edits, Percentage Edits, Date Edits, Time Edits, Date/Time Edits, Month Edits, Time Edits, Complex Edits, Fraction Edits, Currency Edits, Calculator Edits, Calendar Edits, Button Edits, Degree/Minute/Second Edits, Comboboxes, Month Comboboxes, Day of Week Comboboxes, Time Zone Comboboxes, Country Comboboxes, Duration Comboboxes, SpinEdits, Month SpinEdit, DOW SpinEdits, Duration SpinEdits, Currency SpinEdits, Vector Edits, Matrix Edits, Button Edits, Calculators (Scientific and Programmer's), Calendars, Statistical Analysis, Labels, URL Labels, Math Labels, CheckBoxes, RadioGroups, CheckGroups, Memos, RichEdits and much more. Routines included cover Mathematics, Probability, Statistics, Complex Numbers, Fractions, Physics, Geometry, Astronomy, Longitude/Latitude, Unit Conversions, Strings, File IO, Registry, Financials, Country Lists, Holidays, Time Zones, Dates and Times, and much more.Recently added: Jewish Holidays (Hanukkah, Yom Kippur, Rosh Hashanah), National Holidays Includes full source to all components and routines.
          ESBPCS for VCL v6.9.1   
ESBPCS for VCL is a collection of over 6000 routines/methods and over 235 classes/components in over 140 units for Delphi 7, 2005/Win32, 2006/Win32, 2007, 2009, 2010, XE, XE2, XE3, XE4, XE5, XE6, XE7, XE8, 10 Seattle, 10.1 Berlin, 10.2 Tokyo and C++ Builder 2006, 2007, 2009,2010, XE, XE2, XE3, XE4, XE5, XE6, XE7, XE8, 10 Seattle, 10.1 Berlin, 10.2 Tokyo which are aimed at making "data entry and manipulation easier" for Developers and their Customers. ESBPCS is also available in several subsets: ESBPCS-Calcs, ESBPCS-Dates, ESBPCS-Stats, ESBPCS-Lite as well as the Full version. All versions include source upon registration.Components included cover Integer Edits, Float Edits, Hex Edits, IP Address Edits, Percentage Edits, Date Edits, Time Edits, Date/Time Edits, Month Edits, Time Edits, Complex Edits, Fraction Edits, Currency Edits, Calculator Edits, Calendar Edits, Button Edits, Degree/Minute/Second Edits, Comboboxes, Month Comboboxes, Day of Week Comboboxes, Time Zone Comboboxes, Country Comboboxes, Duration Comboboxes, SpinEdits, Month SpinEdit, DOW SpinEdits, Duration SpinEdits, Currency SpinEdits, Vector Edits, Matrix Edits, Button Edits, Calculators (Scientific and Programmer's), Calendars, Statistical Analysis, Labels, URL Labels, Math Labels, CheckBoxes, RadioGroups, CheckGroups, Memos, RichEdits and much more. Routines included cover Mathematics, Probability, Statistics, Complex Numbers, Fractions, Physics, Geometry, Astronomy, Longitude/Latitude, Unit Conversions, Strings, File IO, Registry, Financials, Country Lists, Holidays, Time Zones, Dates and Times, and much more.Recently added: Jewish Holidays (Hanukkah, Yom Kippur, Rosh Hashanah), National Holidays Includes full source to all components and routines.
          SPC Severe Thunderstorm Watch 386   
WW 386 SEVERE TSTM AR OK TX 302040Z - 010400Z
WW 0386 Image

URGENT - IMMEDIATE BROADCAST REQUESTED
Severe Thunderstorm Watch Number 386
NWS Storm Prediction Center Norman OK
340 PM CDT Fri Jun 30 2017

The NWS Storm Prediction Center has issued a

* Severe Thunderstorm Watch for portions of 
  West Central Arkansas
  Southern and Central Oklahoma
  Western North Texas

* Effective this Friday afternoon and evening from 340 PM until
  1100 PM CDT.

* Primary threats include...
  Scattered large hail likely with isolated very large hail events
    to 2.5 inches in diameter possible
  Scattered damaging wind gusts to 70 mph likely
  A tornado or two possible

SUMMARY...Scattered thunderstorms are forecast to develop and
intensify across the watch area this afternoon and evening.  Initial
storms will pose a risk of very large hail and perhaps a tornado. 
The damaging wind threat will increase this evening.

The severe thunderstorm watch area is approximately along and 60
statute miles north and south of a line from 50 miles west southwest
of Altus OK to 5 miles north of Fort Smith AR. For a complete
depiction of the watch see the associated watch outline update
(WOUS64 KWNS WOU6).

PRECAUTIONARY/PREPAREDNESS ACTIONS...

REMEMBER...A Severe Thunderstorm Watch means conditions are
favorable for severe thunderstorms in and close to the watch area.
Persons in these areas should be on the lookout for threatening
weather conditions and listen for later statements and possible
warnings. Severe thunderstorms can and occasionally do produce
tornadoes.

&&

OTHER WATCH INFORMATION...CONTINUE...WW 385...

AVIATION...A few severe thunderstorms with hail surface and aloft to
2.5 inches. Extreme turbulence and surface wind gusts to 60 knots. A
few cumulonimbi with maximum tops to 500. Mean storm motion vector
28030.

...Hart

Read more
          SPC Severe Thunderstorm Watch 385   
WW 385 SEVERE TSTM CT MA NH NY PA VT 301745Z - 010100Z
WW 0385 Image

URGENT - IMMEDIATE BROADCAST REQUESTED
Severe Thunderstorm Watch Number 385
NWS Storm Prediction Center Norman OK
145 PM EDT Fri Jun 30 2017

The NWS Storm Prediction Center has issued a

* Severe Thunderstorm Watch for portions of 
  Northern Connecticut
  Western and Central Massachusetts
  Southern New Hampshire
  Eastern New York
  Northeast Pennsylvania
  Southern Vermont

* Effective this Friday afternoon and evening from 145 PM until
  900 PM EDT.

* Primary threats include...
  Scattered damaging wind gusts to 70 mph possible
  Scattered large hail events to 1.5 inches in diameter possible

SUMMARY...Scattered thunderstorms will form over central NY/PA and
track across the watch area this afternoon and evening.  The
stronger cells will pose a risk of damaging wind gusts and hail.

The severe thunderstorm watch area is approximately along and 105
statute miles east and west of a line from 25 miles southwest of
Poughkeepsie NY to 45 miles north of Rutland VT. For a complete
depiction of the watch see the associated watch outline update
(WOUS64 KWNS WOU5).

PRECAUTIONARY/PREPAREDNESS ACTIONS...

REMEMBER...A Severe Thunderstorm Watch means conditions are
favorable for severe thunderstorms in and close to the watch area.
Persons in these areas should be on the lookout for threatening
weather conditions and listen for later statements and possible
warnings. Severe thunderstorms can and occasionally do produce
tornadoes.

&&

AVIATION...A few severe thunderstorms with hail surface and aloft to
1.5 inches. Extreme turbulence and surface wind gusts to 60 knots. A
few cumulonimbi with maximum tops to 450. Mean storm motion vector
28030.

...Hart

Read more
          Neutral blood レザー カジュアルシューズ 厚底 革靴 茶 26.5   
Neutral blood レザー カジュアルシューズ…
現在価格:1,944 円,入札数:-,終了日時:2017/07/01 22:05
          Neutral Gray ハンド バッグ フェイクレザー ディープグリーン 深緑   
Neutral Gray ハンド バッグ フェイクレザ…
現在価格:1,458 円,入札数:-,終了日時:2017/07/01 22:28
          HAI sporting GEAR ノータック スラックスパンツ   
HAI sporting GEAR ノータック スラックス…
現在価格:864 円,入札数:-,終了日時:2017/07/01 22:05
          HAI SPORTING GEAR コットン シャツ ジャケット ステンカラー   
HAI SPORTING GEAR コットン シャツ ジャ…
現在価格:972 円,入札数:-,終了日時:2017/07/02 22:06
          NOVESPAZIO カーディガン ニット 長袖 Vネック 透かし編み 38   
NOVESPAZIO カーディガン ニット 長袖 Vネ…
現在価格:3,240 円,入札数:-,終了日時:2017/07/02 22:47
          ノーベスパジオ カットソー ビジュー ビーズ ノースリーブ 38   
ノーベスパジオ カットソー ビジュー ビー…
現在価格:2,808 円,入札数:-,終了日時:2017/07/02 22:10
          NOVESPAZIO タンクトップ ノースリーブ ホワイト 38 【中古】   
NOVESPAZIO タンクトップ ノースリーブ ホ…
現在価格:2,160 円,入札数:-,終了日時:2017/07/02 22:29
          Allegorithmic Substance Designer rev.6.0.4.265 (win x64 bit)   
Allegorithmic Substance Designer rev.6.0.4.265 (win x64 bit)


Substance Designer — мощная программа, которая предназначена для создания, редактирования и обработки сложных текстур. Программа позволяет микшировать и манипулировать битмапами, векторными изображениями и процедурными элементами. Текстуры созданные с помощью Substance Designer являются динамическими, то есть их можно свободно модифицировать на любом этапе создания. При этом пользователь на выходе автоматически получает разные карты — диффузные, нормал, спекуляр и т.д.
Substance Designer - a powerful program that is designed to create, edit and process complex textures. The program allows you to mix and manipulate bitmaps, vector images and procedural elements. Textures created with Substance Designer are dynamic, ie they can be freely modified at any stage of the creation. The user output automatically gets different cards — diffuse, normal, seriously, etc.
          ノーベスパジオ NOVESPAZIO カーディガン ニット リボン カシュクール カーキ 38   
ノーベスパジオ NOVESPAZIO カーディガン …
現在価格:1,080 円,入札数:-,終了日時:2017/07/02 22:16
          NOVESPAZIO ホルターネック 総柄 コットン ブラウン 38【中古】   
NOVESPAZIO ホルターネック 総柄 コットン…
現在価格:1,080 円,入札数:-,終了日時:2017/07/02 22:52
          Vectorville 2.0   
Vectorville 2.0

Finally... decided to bring Vectorville back! Let's roll!


          INDIVI ニット ポンチョ ケープ ドルマン 絹 毛混 グレー 黒 42   
INDIVI ニット ポンチョ ケープ ドルマン …
現在価格:3,240 円,入札数:-,終了日時:2017/07/01 22:39
          Vectoring: Telekom muss VDSL-Nutzer kündigen   
Es trifft auch die Deutsche Telekom: Die Vectoring Company muss einem Kunden kündigen, weil ein anderer Betreiber Vectoring einsetzt. Es handelt sich um EWE. (Vectoring, DSL)
          Стильная голубая брошюра, корпоративный флаер - векторные бизнес шаблоны   
Стильная голубая брошюра, корпоративный флаер - векторные бизнес шаблоны

Стильная голубая брошюра, корпоративный флаер - векторные бизнес шаблоны. Business brochure vector, flyers templates # 20
25 files | EPS + preview | 87 Mb

          Брендирование, корпоративный стиль - фирменный бланк, визитка, папка, конверт, диск   
Брендирование, корпоративный стиль - фирменный бланк, визитка, папка, конверт, диск

Брендирование, корпоративный стиль - фирменный бланк, визитка, папка, конверт, диск, ручка, настольный флаг, сумка. Corporate identity business vector template design
25 files | EPS + preview | 116 Mb

          Флаер, брошюра, цветные шаблоны с рамками для фото и текста. Flyer, brochure, billboard vector template design   
Флаер, брошюра, цветные шаблоны с рамками для фото и текста. Flyer, brochure, billboard vector template design

Флаер, брошюра, цветные шаблоны с рамками для фото и текста. Flyer, brochure, billboard vector template design
25 files | EPS + preview | 68 Mb

          Сертификат, диплом с медалью в векторе. Certificate and vector diploma design template # 24   
Сертификат, диплом с медалью в векторе. Certificate and vector diploma design template # 24

Сертификат, диплом с медалью в векторе. Certificate and vector diploma design template # 24
25 files | AI + preview | 60 Mb

          Сертификат, диплом - готовые векторные шаблоны. Certificate and vector diploma vector   
Сертификат, диплом - готовые векторные шаблоны. Certificate and vector diploma vector

Сертификат, диплом - готовые векторные шаблоны. Certificate and vector diploma design template # 25
10 files | EPS + preview | 111 Mb

          Путешествие, буквы с самолетом - векторные бизнес логотипы   
Путешествие, буквы с самолетом - векторные бизнес логотипы

Путешествие, буквы с самолетом - векторные бизнес логотипы. Logo travel business vector illustration template #48
25 files | EPS + preview | 99 Mb

          Стильные визитки для деловых людей - векторные шаблоны   
Стильные визитки для деловых людей - векторные шаблоны

Стильные визитки для деловых людей - векторные шаблоны. Business card vector templates #15
40 files | EPS + preview | 120 Mb

          Золотые логотипы векторе. Gold logo business vector illustration #21   
Золотые логотипы векторе. Gold logo business vector illustration #21

Золотые логотипы векторе. Gold logo business vector illustration #21
25 files | EPS + preview | 184 Mb

          Сертификаты и дипломы вектор. Certificate and vector diploma design template # 22   
Сертификаты и дипломы вектор. Certificate and vector diploma design template # 22

Сертификаты и дипломы вектор. Certificate and vector diploma design template # 22
15 files | EPS + preview | 89 Mb

          Двухсторонние карточки, визитки - векторные шаблоны. Business card vector templates   
Двухсторонние карточки, визитки - векторные шаблоны. Business card vector templates

Двухсторонние карточки, визитки - векторные шаблоны. Business card vector templates #16
30 files | EPS + preview | 130 Mb

          Дипломы, сертификаты в векторе. Certificate and vector diploma design template # 23   
Дипломы, сертификаты в векторе. Certificate and vector diploma design template # 23

Дипломы, сертификаты в векторе. Certificate and vector diploma design template # 23
15 files | EPS + preview | 89 Mb

          Нарисованные птицы вектор. Vector Wild Birdies Collection   
Нарисованные птицы вектор. Vector Wild Birdies Collection

Нарисованные птицы вектор. Vector Wild Birdies Collection
Vector 25 | Ai Files+Jpg Preview | Архив: RAR Размер: 28.59 MB

          Овощи, фрукты, ягоды, ленты и вензеля в векторе   
Овощи, фрукты, ягоды, ленты и вензеля в векторе

Овощи, фрукты, ягоды, ленты и вензеля в векторе. Drawing vector decorative ribbons, banners, vegetables and fruits
AI, EPS, PNG, JPG, 1170(w) x 780(h) px, 68 Mb

          Рамадан, красочные иллюстрации, исламские фоны в векторе   
Рамадан, красочные иллюстрации, исламские фоны в векторе

Рамадан, красочные иллюстрации, исламские фоны в векторе. Ramadan Kareem vector greeting card, islamic background # 16
25 files | EPS + preview | 285 Mb

          Рамадан Карим поздравительные открытки в векторе   
Рамадан Карим поздравительные открытки в векторе

Рамадан Карим поздравительные открытки в векторе. Ramadan Kareem vector greeting card, islamic background # 17
25 files | EPS + preview | 172 Mb

          Klebefolien Vector/Genus Spectra für den Insektenvernichter Vector Plasma & Vector One Design & Genu   
26,42 EUR
Klebefolien VectorLeicht austauschbare Spezial-Folien fur InsektenvernichterDie Folien sind staubabweisend, wasserabweisend und UV-A Lichtbest?ndigDie Klebefolie ist geeignet f?r den Insektenvernichter Vector Plasma Design und Vector One Design.- Klebefolie f?r Vector One Design?&?Genus Spectra Comp? Ma?e: 42cm x 13cm (L x B)? Farbe: Schwarz? Material: Card- Klebefolie f?r Vector Plasma Design &?Genus Spectra? Ma?e: 42cm x 26cm (L x B)? Farbe: Schwarz? Material: Card- Vector One: 1 Packung enth?lt 10 St?ck Klebefolien. Preis ist per Packung- Vector Plasma: 1 Packung enth?lt 10 St?ck Klebefolien. Preis ist per Packung?

          Comment on An Open Letter to Moderates by dhlii   
No Ron, you mischaracterize me. I have no doubt that some humans can do stupid and evil things. What I have said is that in a free market - the incentives strongly work against that, so it is less common than otherwise. Conversely in government the incentives work towards stupidity and evil. I am as worried about human misconduct as you are. I just worry more about it where I see it as far more dangerous. With respect to actual private bad behavior - our law, that "common law" with is very close to the 3 principles I keep beating on, is pretty much all we need. Can you name a single form of likely misconduct - in business or otherwise, that is not covered by laws that are atleast a century old ? If someone initiates force against others - in business or otherwise. I am opposed and our criminal law prohibits that. If one engages in fraud - that too has been illegal for centuries. And finally we have had tort law for several centuries. If someone causes you actual harm - even innocently, then you can petition government to be made whole by them. What more is it that you think is needed ? What misconduct that someone in business can engage in is not covered by that ? In most instances we are covered MORE effectively by that. One of the huge problems with torts today is that if you conform to government regulations - that is quite often an affirmative defense. You really do not grasp that businesses - particularly big businesses buy protection from government - often in the form of regulation. I would finally note - that we do not have the government resources to properly enforce the laws of a century ago - or just my 3 core principles - atleast not without excercising borad discretion. Law administration and enforcement is quite expensive - and it comes entirely at the expense of our standard of living - and sometimes Twice. You note that health insurance has a unique propensity for screwing customers. That is FALSE. Health insurance screws the insured. In most cases those are NOT the customers, and that is a major part of the problem. Health insurance in particular due to our current abysmal structure has myriads of vectors for moral hazard. On the one hand the insured ar mostly disconnected from the cost of the healthcare they receive so they have no reason to make cost constrained choices - and cost is ALWAYS a factor. If it ever is not the system is broke. From the opposite direction doctors and hospitals are paid by insurance companies (or government) not patients, and insurance companies are mostly paid by employers - not the insured. In all the above the problem is that those using the service and those paying are not the same and patients will screw insurance companies, and insurance companies will screw patients. Because neither has reason to deal with the other in good faith. The incentives are wrong. That is one of the reasons I think subscription medicine could take off. I have no doubt the first example you gave occured. At the same time - even if the employee was diagnosed with ADD - it would not be a pre-existing condition. But we do not fix this nonsense - partly because of the factors I noted above - the insurance company has no reason to want to make the employee happy - he is NOT their customer. But there is another reason - that I am surprised you did not note - that applies specifically to your example. Employer paid insurance is regulated by ERISA. The employee can not sue. The only remedey the employee has is through an ERISA process that takes over a year or more. Insurance companies are not stupid - they know that few people can afford to fight for a year or more over $30. But again this problem is caused by the bad incentives of employer mandated insurance and bad regulation. I am sure you can come up with myriads of other real world examples - but we do not have a free market in health insurance and have not in my lifetime. Even back to your example - why does insurance cover routine medicine ? That is insane. The rough equivalent of what used to be called a major medical plan is still very cheap today. Why in gods name would you want the doctor to write you a perscription, that a pharmacy fills - and collects a co-pay from you, bills the insurance company which then pays for it out of premiums it collects from your employer, who treats those premiums as part of your pay. How can you possibly expect that to be an efficient way of delivering medical service ? And how can you expect medical prices to drop - ever, if the govenrment requires you to bill them at the lowest price you give anyone else - or potentially go to jail. With respect to your example #2 - that could not have been employer paid insurance. Even so, normal contract law would say that if you paid for fire insurance, and there is a fire, and AFTER the fire you quite paying premiums, the insurance company can cancel your insurance, but it still has to repair the damage from the fire. I beleive that is typical for "claims made" insurance, which is most insurance. It basically means if you are insured at the time the claim is made - you are covered. Regardless, your examples are all of circumstances that would have been covered by ordinary law that existed 100 years ago. If as you say - and I beleive you, the insurance companies are violating my core principles - which have been codified in the law for centuries and getting away with it. Why is a regulation going to fix things ? I had this problem with the civil rights act and the voting rights act and spousal abuse laws and ...... How does making something that is already illegal and making it illegal AGAIN change anything ? I have never said the law should not be enforced. But between the self regulating nature of actual free market transactions, and the LEGITIMATE law based on the principles I keep beating on, we have more than enough to cover anything you think should be "regulated". You seem to want to solve a lack of enforcement problem by passing more laws. How is that supposed to work ?
          An adventure with clocks, component, and clojure.spec   

I have long parted with my initial, lacking approach to component handling in Clojure. I now rely on Stuart Sierra’s component library for this.

In this short post, I want to showcase how this library helps structure code around clear functional boundaries and allows testing without having to depend on mocking. This might induce building components for seemingly innocuous code. I will also dive into clojure.spec to show how it helps writing automated tests on top of correct generated inputs.

This article was initially written as a litterate programming org mode file, If you edit the source you can use C-c v t to generate a single file which can be used as an executable *boot* script, which means you will need to have boot installed in order to execute this.

I used *boot* here because it is easy to build a standalone executable script with it. Be sure to have BOOT_CLOJURE_VERSION set to 1.9.0-alpha14, since clojure.spec is only available from 1.9.0 onward.

To start we will add a shebang line to make sure that boot is invoked to run this script.

#!/usr/bin/env boot

For the purpose of this article, we will only use a few dependencies:

(set-env! :dependencies '[[com.stuartsierra/component "0.3.1"]
                          [org.clojure/test.check     "0.9.0"]])

For the purpose of this article, we will be building request signing functionality. Since this is a standalone *boot* project test namespaces are pulled here as well:

(ns request.signing
   (:require [com.stuartsierra.component :as component]
             [clojure.test :refer :all]
             [clojure.test.check.generators :as tgen]
             [clojure.spec :as s]
             [clojure.spec.gen :as gen]
             [clojure.spec.test :as st])
   (:import javax.crypto.Mac javax.crypto.spec.SecretKeySpec))

Our request signing functionality will work on incoming requests which look like this:

{:timestamp     1483805460         ;; UNIX Epoch of request
 :payload       "some-command"     ;; Request payload
 :authorization {:key       "..."
                 :signature "..."}}

Provided each user is given an API key, and an API secret, we can define the request signing mechanism to be:

signature = hexadecimal_string(hmac_256(secret-key, timestamp + payload))

Factoring the request timestamp in the signing mechanism provides a good protection against replay attacks: by ensuring that requests come-in within a reasonable time-delta (let’s say 500ms). To implement this a first implementation could be based on two components:

  • A *keystore* component which maps API keys to API secrets
  • A *signer* component which signs a payload

We can do away with the *keystore* component here, rely on a map, or something that behaves like a map. (If you want to investigate how to build map-like constructs, there is an article describing how to do that). I won’t describe here how to build an alternate implementation which would look-up keys in a database, but it is rather straightforward.

As far as signing is concerned, interacting with the JVM is required. To avoid pulling-in additional dependencies, we use the javax.crypto available classes:

(defn bytes->hex [bytes]
  (reduce str (map (partial format "%02x") bytes)))

(defn sign-string [secret-key payload]
  (let [key (SecretKeySpec. (.getBytes secret-key) "HmacSHA256")]
    (-> (doto (Mac/getInstance "HmacSHA256")
          (.init key))
        (.doFinal (.getBytes payload))
        (bytes->hex))))

We now have all necessary bits to write a first authorization function. Here is a first version without the addition of components for now:

(defn request-signature [keystore request]
  (when-let [secret (get keystore (get-in request [:authorization :api-key]))]
    (sign-string secret (str timestamp payload))))

(defn authorized-request? [keystore equest]
  (when-let [signature (request-signature keystore request)]
    (= (get-in request [:authorization :signature]) signature)))

This already gives us a lot of safety: a stolen secret key does not allow signing arbitrary requests as would a simple key/token validation approach, commonly found in API implementations.

One thing this authorization scheme is subject to though is replay attacks, a stolen signed payload can be replayed at will.

To limit this risk, we can rely on good wall clocks to ensure that requests are sent within a reasonable timeframe, which we can store as an option:

(def max-delta-ms 500)

We can then write our updated auhtorization function. Note how here we made authorized-request? use a Authorizer as its input. This can be safely done, since started component get their depencies provided.

(defn authorized-timestamp? [timestamp]
  (let [now (System/currentTimeMillis)]
    (<= (- timestamp max-delta-ms) now (+ timestamp max-delta-ms))))

(defn request-signature [keystore request]
  (when-let [secret (get keystore (get-in request [:authorization :api-key]))]
    (sign-string secret (str (:timestamp request) (:payload request)))))

(defrecord Authorizer [keystore])

(defn authorized-request? [{:keys [keystore]} request]
  (when-let [signature (request-signature keystore request)]
    (and (= (get-in request [:authorization :signature]) signature)
         (authorized-timestamp? (:timestamp request)))))

This solution will provide a good layer of security while being secure enough for most practical purposes. Going one step further would involve guaranteeing no replay attack can be performed by handing-out a one-time token for each request. We will not describe this scheme in this article.

While complete, the solution is now hard to test, since it relies on a wall clock. There are three approaches to testing we can take:

  • Good old sleep calls which are a safe way of having spurious test errors :-)
  • Mocking wall clock calls
  • Making the clock a component

It does seem overkill to build a specific clock component for the standard behavior of a wall clock which just reaches out to the system.

(defprotocol Clock  (now! [this]))
(defrecord WallClock [] Clock (now! [this] (System/currentTimeMillis)))

With this simple protocol we can now build our complete component system. This will be quite similar to the previous presented implementation, with the exception that the Authorizer component now depends on clock as well and will use both in authorized-request?.

(defn authorized-timestamp? [clock timestamp]
  (<= (- timestamp max-delta-ms) (now! clock) (+ timestamp max-delta-ms)))

(defn request-signature [keystore request]
  (when-let [secret (get keystore (get-in request [:authorization :api-key]))]
    (sign-string secret (str (:timestamp request) (:payload request)))))

(defrecord Authorizer [clock keystore])

(defn authorized-request? [{:keys [keystore clock]} request]
  (when-let [signature (request-signature keystore request)]
    (and (= (get-in request [:authorization :signature]) signature)
         (authorized-timestamp? clock (:timestamp request)))))

Our resulting system will thus be a three-component one:

  • A *clock* component which will give the current time.
  • A *keystore* component to look-up the secret key corresponding to an API key.
  • An *authorizer* component, used to authorize incoming requests, relying on the two above components.

We can then imagine building the system like this:

(defn start-system [secret-keys]
   (-> (component/system-map :keystore   secret-keys
                             :clock      (->WallClock)
                             :authorizer (map->Authorizer {}))
       (component/system-using {:authorizer [:clock :keystore]})
       (component/start-system)))

With this, everything necessary for authorizing requests is available, but there are no tests yet. If we were to rely on this implementation for tests, we would have to play with timing for test purposes:

(deftest simple-signing
  (let [sys (start-system {:foo "ABCDEFGHIJK"})]
    (doseq [cmd ["start-engine" "thrust" "stop-engine"]]
      (let [request {:timestamp (now! (:clock sys))
                     :payload       cmd
                     :authorization {:api-key :foo}}
            signed  (assoc-in request [:authorization :signature]
                              (request-signature (:keystore sys) request))]
        (is (authorized-request? sys signed))
        (Thread/sleep 600)
        (is (not(authorized-request? sys signed)))))))

This is unfortunately brittle and does not lend itself easily to a large number of tests since it relies on sleep.

Thanks to our component-based approach we can now write an alternate clock:

(defrecord RefClock [state] Clock (now! [_] @state))

Once we have our new clock, we can adapt the start system function:

(defn start-system [secret-keys time]
   (-> (component/system-map :keystore   secret-keys
                             :clock      (if time (->RefClock time) (->WallClock))
                             :authorizer (map->Authorizer {}))
       (component/system-using {:authorizer [:clock :keystore]})
       (component/start-system)))

This new clock can then be used for our tests, doing away with brittle sleep calls and paving the way for generative tests.

(deftest simple-signing
  (let [time (atom 0)
        sys  (start-system {:foo "ABCDEFGHIJK"} time)]
    (doseq [cmd ["start-engine" "thrust" "stop-engine"]]
      (let [request {:timestamp (now! (:clock sys))
                     :payload       cmd
                     :authorization {:api-key :foo}}
            signed  (assoc-in request [:authorization :signature]
                              (request-signature (:keystore sys) request))]
        (is (authorized-request? sys signed))
        (swap! time + max-delta-ms 1) 
        (is (not(authorized-request? sys signed)))))))

While this is nice, it only tests a very small subset of input. To go beyond this, we can reach out to clojure.spec to give us compile-time guarantees that we are using correct types for our functions and to allow building generative tests.

In a few instances, we help generators by providing a set of known values. We start off by forcing every generated keystore instance to be:

{:foo "ABCDEFGH"
 :bar "IJKLMNOP"}

Generated api-key instances will also always be either :foo or :bar. Clock instance generation is bound to a RefClock instance as well.

Let’s look at the code in detail. We start by defining a few predicates to make our specs a bit easier to understand:

(def lookup?           #(instance? clojure.lang.ILookup %))
(def clock?            #(satisfies? Clock %))
(def not-empty-string? #(not= "" %))
(def sig-bytes?        #(= 32 (count %))) ;; Number of bytes in a signature
(def valid-sig-width?  #(= 64 (count %)))
(def valid-sig-chars?  #(re-matches #"^[0-9a-f]+$" %))

Next we can define data types for every plain and compound type we have created:

(s/def ::keystore lookup?)
(s/def ::clock clock?)
(s/def ::authorizer (s/keys :req-un [::keystore ::clock]))
(s/def ::signature (s/and string? valid-sig-width? valid-sig-chars?))
(s/def ::api-key keyword?)
(s/def ::authorization (s/keys :req-un [::api-key] :opt-un [::signature]))
(s/def ::timestamp int?)
(s/def ::secret-key (s/and string? not-empty-string?))
(s/def ::payload (s/and string? not-empty-string?))
(s/def ::request (s/keys :req-un [::timestamp ::payload ::authorization]))
(s/def ::bytes (s/and bytes? sig-bytes?))

I like to also provide separate specs for argument lists:

(s/def ::auth-request? (s/cat :authorizer ::authorizer :request ::request))
(s/def ::request-signature (s/cat :keystore ::keystore :request ::request))
(s/def ::auth-timestamp? (s/cat :clock ::clock :timestamp ::timestamp))
(s/def ::sign-string (s/cat :secret-key ::secret-key :payload string?))
(s/def ::bytes->hex (s/cat :bytes ::bytes))
(s/def ::now! (s/cat :block ::clock))

We can now use the above types to specify our functions. Nothing extraordinary here if you have already used spec.

(s/fdef bytes->hex :args ::bytes->hex :ret ::signature)
(s/fdef sign-string :args ::sign-string :ret ::signature)
(s/fdef now! :args ::now! :ret ::timestamp)
(s/fdef authorized-timestamp? :args ::auth-timestamp? :ret boolean?)
(s/fdef request-signature :args ::request-signature :ret ::signature)
(s/fdef authorized-request? :args ::auth-request? :ret boolean?)

We are now fully specified and using instrument will allow verifying functions are called properly.

The complex bit is to go from here to tests which use generators for building sensible data. Relying on the provided generators will not cut it as they would not be able to build clock and keystore instances, nor would they be able to provide sensible timestamp or signature values.

This is most obvious in request which contains co-dependent information, since the :signature field in the :authorization map depends on the payload and timestamp of the request. Likewise, testing authorized-timestamp? relies on having a solid way of generating timestamp, which we built our Clock protocol for.

Fortunately, spec allows overriding generators. We can start by building simple generators for values we want picked from a narrow set, this is for instance the case for our keystore and related api keys:

(def fake-keystore {:foo "ABCDEFGH" :bar "IJKLMNOP"})
(def fake-time     (atom 0))
(def fake-clock    (->RefClock fake-time))

(defn keystore-gen [] (s/gen #{fake-keystore}))
(defn api-key-gen  [] (s/gen (set (keys fake-keystore))))
(defn clock-gen    [] (s/gen #{fake-clock}))

We can test out this generators on the repl:

(gen/sample (s/gen (s/with-gen ::api-key api-key-gen)))
(gen/sample (s/gen (s/with-gen ::clock-gen clock-gen)))

To instrument bytes->hex we will need a way of generating 32 wide byte arrays. Since there is no such generator, we will need to compose the creation of a 32-width vector and its coercion to a byte array:

(defn bytes-gen    [] (gen/fmap byte-array (gen/vector tgen/byte 32)))

In the above we use byte from clojure.test.check.generators since no such generator exists in clojure.spec.gen.

Only the most complex generator remains, request-gen for building request maps. If we look at our base building blocks, here is what we need to build a correct request map:

  • A *keystore* to sign the request
  • A *clock* to get a correct timestamp
  • A random *api-key*
  • A random *payload*

Once we have these elements we can transform them into a correct request. We will use fmap again here, and split out request generation in two functions:

(defn sign-request [[ks req]]
   (assoc-in req [:authorization :signature] (request-signature ks req)))

(defn build-request [{:keys [clock payload keystore api-key]}]
  (vector
    keystore
    {:timestamp     (now! clock)
     :payload       payload
     :authorization {:api-key api-key}}))

(defn request-gen []
  (gen/fmap
    (comp sign-request build-request)
    (s/gen (s/keys :req-un [::clock ::keystore ::api-key ::payload])
           {::clock clock-gen ::keystore keystore-gen ::api-key api-key-gen})))

We now have a solid way of generating requests, we can again test it on the repl:

(gen/sample (s/gen (s/with-gen ::request request-gen)))

Now that we have good generation available, we can write automated testing for all of our functions. We can do this by enumerating all testable symbols in the current namespace and running generative testing on them, supplying our list of generator overrides. This involves checking that the result is true for all test outputs generated by clojure.spec.test/check:

(def gen-overrides {::keystore      keystore-gen
                    ::clock         clock-gen
                    ::api-key       api-key-gen
                    ::bytes         bytes-gen
                    ::request       request-gen})

(deftest generated-tests
  (doseq [test-output (-> (st/enumerate-namespace 'request.signing)
                          (st/check {:gen gen-overrides}))]
    (testing (-> test-output :sym name)
      (is (true? (-> test-output :clojure.spec.test.check/ret :result))))))

To go, one last step further, we can supply a different function spec to our most important function, authorized-request? to make sure that given all provided inputs, our authorizer determined the request to be authorized:

(deftest specialized-tests
   (testing "authorized-request?"
      (is (true? (-> (st/check-fn authorized-request?
                                  (s/fspec :args ::auth-request? :ret boolean?)
                                  {:gen gen-overrides})
                     :clojure.spec.test.check/ret
                     :result)))))

Last, we run all tests:

(run-tests 'request.signing)

I’d like to thank Max Penet and Gary Fredericks for their valuable input while writing this.


          Playing with Clojure core interfaces   

One of Alan Perlis’ famous quote is

It is better to have 100 functions operate on one data structure than 10 functions on 10 data structures.

In a recent talk about reducers (available here), Rich Hickey playfully asserted that it might be even better to have 100 functions operate on anything. This article aims to show the effective way clojure offers to emulate common datastructures to use standard functions on pretend datastructures.

Let’s see how we can leverage the clojure transient interface to provide access to simple key/value stores. For the purpose of this article we’ll use everyone’s favorite outsourced heap: redis hand in hand with the carmine library.

This is what accessing redis looks like from carmine:

(require '[taoensso.carmine :as r :refer [wcar get set del]])

(def server-spec {}) ;; will connect to localhost

(wcar server-spec
  (r/set "a" "b")
  (r/get "a") ;; => "b"
  (r/del "a"))

Ideally, we’d like to be able to treat redis like a standard transient map:

(def redis (instance->transient server-spec))

;; assuming we're starting from an empty redis instance
(pr-str redis)
;; => "{}"
(assoc! redis :a :a)
(:a redis)
;; => :a
(pr-str redis)
;; => "{:a :a}"
(assoc! redis :b {:a 0 :b 1})
;; => {:a :a, :b {:b 1, :a 0}}
(assoc! (:b redis) :c 2)
;; {:b 1, :a 0, :c 2}
(-> redis :b (dissoc! :c :b))
;; {:a 0}
(count redis)
;; => 2
(seq redis)
;; => ([:a :a] [:b {:a 0}])
(dissoc! redis :b)
(dissoc! redis :a)
;; => {}
(assoc! redis :c #{:foo :bar})
;; {:c #{:foo :bar}}

This article will walk you through how to achieve that, on top of the carmine library presented above.

Please note that while this makes for an interesting exercise with protocols, it is not recommended to use it extensively, some of the chosen strategies to make this example easier are suboptimal at best.

Basic building blocks

To achieve homomorphism, clojure relies on interfaces, they provide a uniform way to access resources implementing them.

Looking at clojure’s source code, a mere two interfaces provide the necessary functionality for setting, retrieving and removing keys: clojure.lang.ILookup and clojure.lang.ITransientMap:

/* src/jvm/clojure/lang/ILookup.java */
public interface ILookup{
  Object valAt(Object key);
  Object valAt(Object key, Object notFound);
}

/* src/jvm/clojure/lang/ITransientMap.java */
public interface ITransientMap extends ITransientAssociative, Counted{

  ITransientMap assoc(Object key, Object val);
  ITransientMap without(Object key);
  IPersistentMap persistent();
}

In the above protocols:

  • valAt provides lookups and is shared across transients and persistent structures
  • assoc mutates a transient map to set a key to a value
  • without mutates a transient map to remove a key

The simplest way to implement java interfaces or clojure protocols is to make use of reify which generates anonymous classes implementing a list of provide protocol or interface.

With this, we can go on and write a fake transient:

(ns transient.redis
  (:require [taoensso.carmine :as r :refer [wcarl]]))

(defn instance->transient
  [spec]
  (reify
    clojure.lang.ILookup
    (valAt [this k]
      (wcar spec (r/get k)))
    (valAt [this k default]
      (or (.valAt this k) default))
    clojure.lang.ITransientMap
    (assoc [this k v]
      (wcar spec (r/set k v))
      this) ;; transients always return themselves on mutation.
    (without [this k]
      (wcar spec (r/del k))
      this)))

This gives a nice and clean interface to redis for keys:

(def kv (instance->transient {})) ;; connect to localhost

(assoc! kv "a" "b")
(get kv "a")
(dissoc! kv "a")

Taking advantage of homoiconicity

One of the nice properties of clojure is its homoiconic nature, meaning that all standard data can be printed and read back in by the reader without loss of information. Clojure even now provides a way to add new types to the reader through tagged literals.

A first improvement we can make to our implementation is to use pr-str and read-string as a cheap serializer/deserializer.

(ns transient.redis
  (:refer-clojure :exclude [read-string])
  (:require [taoensso.carmine :as r :refer [wcarl]]
            [clojure.edn :refer [read-string]]))

(defn instance->transient
  [spec]
  (reify
    clojure.lang.ILookup
    (valAt [this k]
      (when-let [res (wcar spec (r/get (pr-str k)))]
         (read-string res)))
    (valAt [this k default]
      (or (.valAt this k) default))
    clojure.lang.ITransientMap
    (assoc [this k v]
      (wcar spec (r/set (pr-str k) (pr-str v)))
      this)
    (without [this k]
      (wcar spec (r/del (pr-str k)))
      this)))

You’ll note that in the above, we’re using clojure.edn/read-string instead of clojure.core/read-string. This is because clojure.core/read-string is not safe for arbitrary inputs since it might end up calling eval on input.

More protocols

We’ve now reached a good first step for our key value interface. We could go a bit further though, since redis supports data-types which resemble clojure’s. If we look at redis sets, lists and hashes, they map to clojure sets, vectors and maps without to much contorsion.

Fortunately, clojure provides transient versions of sets, vectors and maps. To coerce our redis connection instance we will need to implement a variety of interfaces described below.

Counted

This protocol should be implemented by all types and provides a way to yield the length of a collection.

public interface Counted {
    int count();
}

Seqable

This protocol is implemented by any datastructure which can be coerced to a seq:

public interface ISeq {
  ISeq seq();
}

When calling seq on a map, it is expected to receive a list of IMapEntry structures as defined in the following interface:

public interface IMapEntry extends Map.Entry{
  Object key();
  Object val();
}

Map entries also happen to implement Counted, Indexed (see below) and Seqable. This is the protocol that allows you to write:

(map key {:a 0 :b 1})

Indexed

This protocol allows lookup in collections with nth:

public interface Indexed extends Counted{
  Object nth(int i);
  Object nth(int i, Object notFound);
}

ITransientVector

Much like ITransientAssociative, ITransientVector gives a way to mutate on vector like structures:

public interface ITransientVector extends ITransientAssociative, Indexed{
  ITransientVector assocN(int i, Object val);
  ITransientVector pop();
}

ITransientSet

ITransientSet completes the list of transient collections

public interface ITransientSet extends ITransientCollection, Counted{
  public ITransientSet disjoin(Object key) ;
	public boolean contains(Object key);
	public Object get(Object key);
}

Redis Operations

Let’s now look at how the redis world can be mapped to the clojure world.

Redis Instance

The global redis instance can be seen as a map, just like in our first example. If we want it to implement Seqable and Counted, there is no other choice but to issue the redis command KEYS * and count the results for Counted or map them to clojure values for Seqable.

We have already seen how to implement ILookup and ITransientMap above, but we’ll add a twist, when creating values, instead of always using the SET command, we can look at the type of value we’re fed with set?, map? and sequential? to create matching types in redis (set, hash or list) while still defaulting to string keys.

Likewise, when retrieving keys, we can use the redis TYPE command to lookup the key type and yield a transient vector, map or set when we encounter the matching redis types.

without does not need to change, since it works on any key type.

This gives us and updated instance->transient:

clojure.lang.ILookup
(valAt [this k]
  (let [k    (pr-str k)
		type (wcar spec (r/type k))]
	(condp = type
	  "string" (read-string (wcar spec (r/get k)))
	  "hash"   (hash->transient spec k)
	  "list"   (list->transient spec k)
	  "set"    (set->transient spec k)
	  "none"   nil
	  (throw (ex-info "unsupported redis type" {:type type})))))
clojure.lang.ITransientMap
(assoc [this k v]
  (let [k (pr-str k)]
	(cond
	 (set? v)        (doseq [member v]    ;; Call SADD on all members
					   (wcar spec (r/sadd k (pr-str member))))
	 (map? v)        (doseq [[subk v] v]  ;; Call HSET on all entries
					   (wcar spec (r/hset k (pr-str subk) (pr-str v))))
	 (sequential? v) (doseq [e v]         ;; Call LPUSH on all entries
					   (wcar spec (r/lpush k (pr-str e))))
	  ;; Default to a plain SET
	 :else           (wcar spec (r/set k (pr-str v)))))
  this)

As explained above we can now also implement Counted and Seqable:

clojure.lang.Counted
(count [this]
  (count (wcar spec (r/keys "*"))))
clojure.lang.Seqable
(seq [this]
  (let [keys (wcar spec (r/keys "*"))]
	(for [k keys]
	  (->mapentry (read-string k) (.valAt this (read-string k))))))

Beware that calling KEYS * is very suboptimal and should not be done in real life scenarios.

We’re also missing the ->mapentry function above, which can be simply be:

(defn ->mapentry
  [k v]
  (reify
	clojure.lang.Indexed
	(nth [this i]         (nth [k v] i))     ;; carry over
	(nth [this i def]     (nth [k v] i def)) ;; carry over to nth
	clojure.lang.Seqable
	(seq [this]           (list k v))        ;; we know all elems
	clojure.lang.Counted
	(count [this]         2)                 ;; always two elems
	clojure.lang.IMapEntry
	(getKey [this]        k)                 ;; IMapEntry extends Map.Entry
	(getValue [this]      v)                 ;;
	(key [this]           k)                 
	(val [this]           v)))

Redis Hashes

Redis hashes will implement the same interfaces than redis instances: ILookup, ITransientMap, Counted and Seqable. The logic will closely resemble our initial version. Lookups will be done using HGET, removals with HDEL. To count elements or coerce a hash to a seq, we can count on the HGETALL command which yields a list containing keys and values. Since the output list is flattened we can use (partition 2) to obtain the desired structure:

(defn hash->transient
  [spec k]
  (reify
	clojure.lang.ILookup
	(valAt [this subk]
	  (when-let [res (wcar spec (r/hget k (pr-str subk)))]
		(read-string res)))
	(valAt [this subk default]
	  (or (.valAt this subk) default))
	clojure.lang.ITransientMap
	(assoc [this subk v]
	  (wcar spec (r/hset k (pr-str subk) (pr-str v)))
	  this)
	(without [this subk]
	  (wcar spec (r/hdel k (pr-str subk)))
	  this)
	clojure.lang.Counted
	(count [this]
	  (count (partition 2 (wcar spec (r/hgetall k)))))
	clojure.lang.Seqable
	(seq [this]
	  (for [[k v] (partition 2 (wcar spec (r/hgetall k)))]
		(->mapentry (read-string k)
					(read-string v))))))

Redis Sets

Redis sets are very similar to hashes. Additions to the set are done with SADD, deletions with SREM, we have an efficient way of counting the set with SCARD. SISMEMBER will tell us if we have a matching member in our set (it returns either 0 or 1, so we need to coerce it to a boolean with pos?). Last, SMEMBERS will help in implementing seq:

(defn set->transient
  [spec k]
  (reify
	clojure.lang.Counted
	(count [this]
	  (wcar spec (r/scard k)))
	clojure.lang.Seqable
	(seq [this]
	  (map read-string (wcar spec (r/smembers k))))
	clojure.lang.ITransientCollection
	(conj [this v]
	  (wcar spec (r/sadd k (pr-str v)))
	  this)
	clojure.lang.ITransientSet
	(disjoin [this v]
	  (wcar spec (r/srem k (pr-str v)))
	  this)
	(contains [this v]
	  (let [member (wcar spec (r/sismember k (pr-str v)))]
		(pos? member)))
	(get [this v]
	  (when (.contains this v)
		v))))

Redis Lists

To finish off with our tour of structures, vectors and lists will be mapped to redis lists. A list’s length is reported by LLEN, we can retrieve all members with LRANGE 0 -1 while LSET, LPOP and LPUSH will implement mutation operations:

(defn list->transient
  [spec k]
  (reify
	clojure.lang.Counted
	(count [this]
	  (wcar spec (r/llen k)))
	clojure.lang.Seqable
	(seq [this]
	  (map read-string (wcar spec (r/lrange k 0 -1))))
	clojure.lang.ITransientCollection
	(conj [this v]
	  (wcar spec (r/lpush k (pr-str v)))
	  this)
	clojure.lang.ITransientVector
	(assocN [this index v]
	  (wcar spec (r/lset k index v))
	  this)
	(pop [this]
	  (wcar spec (r/lpop k))
	  this)))

Behaving like functions

A property of both sets and maps is to behave like functions which test for membership (on sets) and lookup keys (on maps).

This is done by yet another interface: IFn:

public interface IFn extends Callable, Runnable{
  public Object invoke() ;
  public Object invoke(Object arg1) ;
  public Object invoke(Object arg1, Object arg2) ;
  /* ... */
}

We can add the signature to our set and map implementations:

;; hash->transient
    clojure.lang.IFn
    (invoke [this subk]
      (.valAt this subk))

;; set->transient
    clojure.lang.IFn
    (invoke [this member]
      (when (.contains this member)
        member))

Our transients now fully behave like clojure datastructures!

The cherry on top: pretty printing

Our transient facade is getting there, but we’re still faced with a problem: in doesn’t look good in the repl. Without going any further a redis instance looks like this: #<transient$instance$reify__8580 redis.transient$instance$reify__8580@3850ea4b>. Likewise, when dealing with sets, lists or maps.

By digging around, we find that printing is done with clojure.core/pr which ultimately calls clojure.core/pr-on, defined at https://github.com/clojure/clojure/blob/eccff113e7d68411d60f7204711ab71027dc5356/src/clj/clojure/core.clj#L3532-L3544.

We can rely on print-method’s ability to look either at the class of an object or at its metadata to dispatch to the appropriate pretty printer:

(defmulti print-method (fn [x writer]
                         (let [t (get (meta x) :type)]
                           (if (keyword? t) t (class x)))))

We can now write a dispatch method which expects our transient’s metadata to contain the keys :type, used by print-method’s dispatch function, prefix and suffix specify how to enclose the contents of collections.

(defmethod print-method :redis
  [obj ^java.io.Writer writer]

  ;; extract additional metadata
  (let [{:keys [prefix suffix sep tuple?]} (meta obj)]
    (.write writer prefix)

    ;; ensure we have elements to show
    (when (pos? (count obj))
      (loop [[item & items] (seq obj)]
        ;; handle map tuples differently
        (if tuple?
          (do
            (print-method (key item) writer)
            (.write writer " ")
            (print-method (val item) writer))
          (print-method item writer))

        ;; show separator when there are more elems
        (when (seq items)
          (.write writer (str sep  " "))
          (recur items))))

    (.write writer suffix)))

With this in place we can add metadata to our closures:

(defn ->mapentry
  [k v]
  ^{:type :redis :prefix "[" :suffix "]"}
  ...)

(defn hash->transient
  [k v]
  ^{:type :redis :prefix "{" :suffix "}" :sep "," :tuple? true}
  ...)

(defn set->transient
  [k v]
  ^{:type :redis :prefix "#{" :suffix "}"}
  ...)

(defn list->transient
  [k v]
  ^{:type :redis :prefix "[" :suffix "]"}
  ...)

(defn instance->transient
  [k v]
  ^{:type :redis :prefix "{" :suffix "}" :sep "," :tuple? true}
  ...)

Wrapping up

All the bits are now in place, and the example code shown above works as expected. I’ve posted the output here.

I didn’t publish a library on purpose since I don’t think you should use this for any serious work, but it does make for an interesting playground.

While testing this implementation I found out that contains? cannot be called on transient sets because of a limitation in the runtime, I created a JIRA issue to discuss this here: http://dev.clojure.org/jira/browse/CLJ-1581.


          From Angular.JS to Om: A walk-through   

A while back we did a small introductory talk on angular.js with @brutasse. Our talk was aimed at backend developers looking for a solution to build simple interfaces for REST services. The app used exposed a simplistic job board with no persistence and a mere three views.

Our main user-facing app at exoscale is an angular one and we also have a large internal one. Most of our backend work is done in clojure and python, with the occasional guest language. While not discontent with angular, we kept a close eye on the promise of fast updates with react’s approach.

om came at a time when we were looking for alternatives for building interfaces with workloads involving plenty of updates and interacting with server sent events.

While very happy with om so far, most of the introductory material out there focuses on complex apps and features, and when starting out, we fell like simple introductions were missing. Hopefully the following can help bridge that gap, assuming a familiarity with the clojure language.

Om in 3 minutes.

om provides a thin layer of abstraction on top of facebook’s react.js in clojurescript. om relies on atoms to provide application state and schedules renders on atom changes. This article does not dive in clojure specifics. If you’re new to the language past the basic language elements, to get an understanding of what is going on you will need to understand:

  • How atoms work and how to operate on them
  • How protocols work and how they may be implemented on the fly with reify.

When the global state stored in an atom is changed, the render phase walks through a tree of components which are given all or part of the state as input.

A very simple example would be:

(ns omg.frontend
  (:require [om.core :as om :include-macros true]
            [om.dom :as dom :include-macros true]))

(def app-state
  (atom {:messages ["hello" "hello again" "bye"]}))

(defn message-list
  [app owner]
  (reify
    om/IRender
    (render [this]
      (apply dom/ul {} (for [m (:messages app)] (dom/li {} m))))))

(om/root message-list app-state
         {:target (. js/document (getElementById "app"))})

Three things happen in the above:

  • The app state is initialized to a list of messages.
  • A component is created which displays messages
  • The component is bound to the app state and mounted on the DOM.

The render phase uses available functions to create DOM elements, the use of apply does not help make the component explicit, we will see how to improve this later on.

The accompanying HTML can be as simple as:

<!doctype html>
<html lang="en">
  <body>
    <div id="app">
  </body>

  <script src="//cdnjs.cloudflare.com/ajax/libs/react/0.11.2/react.min.js"></script>
  <script src="/js/out/goog/base.js"></script>
  <script src="/js/app.js"></script>
  <script type="text/javascript">goog.require("omg.frontend");</script>
</html>

Compared to angular, om does not provide any standard way to structure apps. This is in part due to the fact that om is fairly recent, but also to the fact that the clojure community puts a bigger emphasis on libraries than framework, which do not impose as much on their consumers.

Fortunately, there are already plenty of librarie which help dealing with common tasks. This project will use:

  • sablono: provides a form based DSL to generate DOM elements
  • cljs-ajax: a simple AJAX client
  • secretary: a library to help with routes within the frontend application
  • om-tools: a library which provides syntactic sugar for om components

A note on building

In the clojure world, projects are built with leiningen and configured with a project.clj file. To build the above project you would have a project structure like this:

.
├── project.clj
├── resources
│   └── public
│       └── index.html
└── src
    └── omg
        └── frontend.cljs

4 directories, 3 files

Using the following project.clj file:

(defproject omg "0.1.0"
  :description "demo om application"
  :dependencies [[org.clojure/clojure       "1.6.0"]
                 [org.clojure/clojurescript "0.0-2371" :scope "provided"]
                 [om                        "0.7.3"]]

  :plugins [[lein-cljsbuild "1.0.3"]]
  :cljsbuild {:builds
              {:app {:source-paths ["src"]
                     :compiler {:output-to     "resources/public/js/app.js"
                                :output-dir    "resources/public/js/out"
                                :source-map    "resources/public/js/out.js.map"
                                :optimizations :none
                                :pretty-print  true}}}})

Extending our minimal app

To get a feel of the libraries we will be working with, let’s dwell on this example for a while and make it use some of the available libraries. These can be added to the :dependencies vector in the project.clj file:

[secretary                 "1.2.1"]
[sablono                   "0.2.22"]
[cljs-ajax                 "0.3.3"]
[prismatic/om-tools        "0.3.6"]                 

The first thing we can do is use sablono, which gives a familiar DSL for building DOM elements, similar to hiccup:

(ns omg.frontend
  (:require [om.core      :as om :include-macros true]
            [sablono.core :as html :refer-macros [html]]))

(def app-state
  (atom {:messages ["hello" "hello again" "bye"]}))

(defn message-list
  [app owner]
  (reify
    om/IRender
    (render [this]
      (html [:ul (for [m (:messages app)] [:li m])]))))

(om/root message-list app-state
         {:target (. js/document (getElementById "app"))})

The next step is to use the syntactic sugar provided by om-tools to create components:

(ns omg.frontend
  (:require [om.core       :as om]
            [om-tools.core :refer-macros [defcomponent]]
            [sablono.core  :as html :refer-macros [html]]))

(def app-state
  (atom {:messages ["hello" "hello again" "bye"]}))

(defcomponent message-list
  [app owner]
  (render [this] (html [:ul (for [m (:messages app)] [:li m])])))

(om/root message-list app-state
         {:target (. js/document (getElementById "app"))})

Our last step in this short introduction will be to build on the fact that components can be nested and build on sub elements of the application state (referred to as cursors):

(ns omg.frontend
  (:require [om.core       :as om]
            [om-tools.core :refer-macros [defcomponent]]
            [sablono.core  :as html :refer-macros [html]]))

(def app-state
  (atom {:messages ["hello" "hello again" "bye"]}))

(defcomponent message
  [m owner]
  (render [this] (html [:li m])))

(defcomponent message-list
  [app owner]
  (render [this] (html [:ul (om/build-all message (:messages app))])))

(om/root message-list app-state
         {:target (. js/document (getElementById "app"))})

Structure of the app

The basic idea behind this article was to re-build the simple job board we built in angular.js (https://github.com/exoscale/angular-jobs) with om. The following principles were applied:

  • Show-case the use of JSON for interaction.
  • Assume we’re talking to a simple RESTish API, not publishing app state diffs.
  • Try to separate concerns between views, model and router cleanly to recreate a known frontend app structure.

The app is built around 3 simple views:

  • A job listing view which can be filtered.
  • A job detail view.
  • A job post view.

To build this, the following will need to be built

  • A router to correctly dispatch based on location.
  • A service to listen to model changes.
  • Appropriate views to display contents.

As far as routes in the REST api are concerned, the following endpoints are provided:

  • GET /jobs: retrieves a map of job id (a UUID) to a map containing a title, company and desc key to provide details on a job.
  • POST /jobs: expects a JSON body containing a map with the title, company and desc keys and will yield the augmented full map, as for the GET call.
  • DELETE /jobs/:id: will delete the job at key id from the map and return the modified map as for the GET call.

A simple om router

One of the appealing things popular frontend frameworks offer is a simple way to bind routes to controllers and views through a router. This makes diving into an app explicit since the entry point for it contains a collection of routes to look at.

In our equivalent angular.js app, this is what we had:

app.config(function($routeProvider) {
    $routeProvider
        .when('/list',        {templateUrl: 'listing.html', controller: 'Jobs'})
        .when('/details/:id', {templateUrl: 'details.html', controller: 'Jobs'})
        .when('/post',        {templateUrl: 'post.html',    controller: 'Jobs'})
        .otherwise(           {redirectTo:  '/list'});
});

Once you get past the syntax, the intent is clear. We are presented with three routes which point to different templates and a single controller.

The story with om is slightly different, since the concepts of controllers is totally separate from views and is only responsible for modifying the global state atom which will trigger re-renders on views.

A router’s duty will thus only be to map a route to the correct component, and provide a way to jump to a different location within the app programmaticaly.

secretary is a library which helps with routing and understands the ubiquitous keyword based routes. secretary provides two functions which we will be using:

  • add-route!: associates a function with a route path.
  • dispatch!: changes the location.

Since om’s re-renders are only triggered by changes in the state, a simple approach is to make the router be a component which dispatches to the appropriate component based on the parsed route.

We can base our approach on a vector to configure the router’s behavior:

(def routes
  ["/"        views/jobs
   "/job/:id" views/job
   "/post"    views/job-post]

If secretary handles setting a key in the application state designating the current view and params, it becomes simple to build a component which dispatches appropriately:

(defn init
  [routes app]

  ;; walk through provided routes, adding a callback
  ;; which updates the global state
  (doseq [[route view] (partition 2 routes)]
    (add-route! route #(swap! app assoc :router {:view view :params %})))

  ;; Yield a component which dispatches to the appropriate
  ;; component previously stored by our route callback
  (fn [app owner]
    (reify om/IRender
      (render [this] (om/build (get-in app [:router :view]) app)))))

Our job here is not completely done, we will also need to listen on history events. Since om builds on top of google closure, we can use the provided History object, here is the complete namespace with comments eluded:

(ns jobs.router
  (:require [goog.events            :as events]
            [om.core                :as om]
            [goog.history.EventType :as EventType]
            [secretary.core         :refer [add-route! dispatch!]]
            [sablono.core           :refer-macros [html]])
  (:import goog.History))

(defonce history (History.))

(defn init [routes app]
  (doseq [[route view] (partition 2 routes)]
    (add-route! route #(swap! app assoc :router {:view view :params %})))

  (goog.events/listen history EventType/NAVIGATE #(-> % .-token dispatch!))
  (.setEnabled history true)

  (fn [app owner]
    (reify om/IRender
      (render [this] (om/build (get-in app [:router :view]) app)))))

(defn redirect [location]
  (.setToken history location))

The added redirect function will trigger an event type of NAVIGATE which will dispatch to the appropriate route and thus update our global state.

To wire in our router, we can then just build our main namespace by using a router as the main component:

(ns jobs.frontend
  (:require [om.core       :as om]
            [jobs.views    :as views]
            [jobs.router   :as router]))

(defonce app-state (atom {}))

(def routes ["/"        views/jobs
             "/job/:id" views/job
             "/post"    views/job-post])

(let [router (router/init routes app-state)
      target {:target (. js/document (getElementById "app"))}]
  (om/root router app-state target))

With this it’s now trivial to organize the application logically accross several view components.

The model

With dispatching to the appropriate view out of the way, the next concern is building interaction with our API.

om build on top of core.async to provide a flexible API to avoid relying exclusively on callbacks, which we will leverage to build our model service. One of the core components of core.async is it’s channel interface which allows seemingly separate threads of execution to have a simple communication interface.

Our app only needs to be responsible for retrieval, creation and deletion of jobs.

To simplify dealing with queries, we will leverage the cljs-ajax library. Here are two simple examples of the API exposed by cljs-ajax:

(GET "/jobs" {:handler (fn [resp] ... )})

(POST "/jobs" {:params  {:title   "developer"
                         :company "supercorpo"
                         :desc    "..."}
               :handler (fn [resp] ...)
               :format  :json})

The simplest approach is to create a channel, looping on incoming messages and taking the appropriate action.

We will define two message types:

  • delete: based on an ID will delete from
  • post: will expect a map of params and create a job

A map is a great container for these messages and will take either of the following two forms:

;; delete message
{:type :delete :id "307b630c-76d0-4cdb-af3f-79acd135f508"}

;; post message
{:type :post :params {:title "developer" :company "foo" :desc "..."}}

A first version of the service can then be built like this:

(defn jobs [app]
  (let [in (chan)]
    ;; Get an initial state when starting the service.
    (GET "/jobs" {:handler #(swap! app assoc :jobs %)})

    (go-loop [{:keys [type id params]} (<! in)]
      (condp = type
        :delete (DELETE (str "/jobs/" id) {:handler #(swap app assoc :jobs %)})
        :post   (POST "/jobs" {:params  params
                               :handler #(swap app assoc :jobs %)
                               :format :json}))
        (recur (<! in)))
    in))

For each incoming message, based on the :type key within the message, the appropriate action is taken. We can take things a step further and prevent consumers of the model to have to deal with core.async by adding convenience functions within the app state:

(defn sanitize
  [in [id {:strs [title company desc]}]]
  {:id id
   :delete! (fn [& _] (put! in {:type :delete :id id}))
   :title   title
   :company company
   :desc    desc})

(defn updater
  [in app jobs]
  (swap! app assoc :jobs (mapv (partial sanitize in) jobs)))

(defn jobs [app]
  (let [in      (chan)
        update! (partial updater in app)]
    ;; Get an initial state when starting the service.
    (GET "/jobs" {:handler update!})

    (go-loop [{:keys [type id params]} (<! in)]
      (condp = type
        :delete (DELETE (str "/jobs/" id) {:handler update!})
        :post   (POST "/jobs" {:params  params
                               :handler update!
                               :format :json}))
        (recur (<! in)))
    (swap! app assoc :create! #(put! in {:type :post :params %}))
    in))

This way we get nice idiomatic clojure vector of maps for jobs. Each job map will contain keyword keys and contain a delete! function to kill the element.

Wiring up our model in the main namespace is now as simple as:

(ns jobs.frontend
  (:require [om.core       :as om]
            [jobs.views    :as views]
            [jobs.model    :as model]
            [jobs.router   :as router]))

(defonce app-state (atom {}))

(def routes ["/"        views/jobs
             "/job/:id" views/job
             "/post"    views/job-post])

(model/jobs app-state)

(let [router (router/init routes app-state)
      target {:target (. js/document (getElementById "app"))}]
  (om/root router app-state target))

View essentials

Let’s look at how to build view components now. The simplest one is the job detail view:

(defcomponent job [app owner]
  (render [this]
    (let [id  (get-in app [:router :params :id])
          job (first (filter (comp (partial = id) :id) (:jobs app)))]
      (html
        [:h2 (:title job) " at " (:company job)]
        [:p (:desc job)]))))

Likewise, the job list view can be kept simple:

(defcomponent job-line [{:keys [title company url]} owner]
  (render [this]
    (html [:li [:a {:href url} title " at " company]])))

(defcomponent jobs [app owner]
  (render [this]
    (html [:ul (om/build-all job-line (:jobs app))])))

This is unfortunately not too helpful, the first thing that can be added is a call to the delete function in job-line:

(defcomponent job-line [{:keys [title company url delete!]} owner]
  (render [this]
    (html [:li
            [:a {:href url} title " at " company]
            [:button {:on-click delete!} "delete"]])))

Life without two-way bindings

One thing om does not (and cannot, given the re-render approach) is the oft-touted two-way bindings found in angular or ember. This means that to handle input, events will need to be listened on and appropriately propagated.

Let’s first look at a sample filter for the job list, in order to recreate the list filter mechanism found in angular.

It would be a shame to store state that is component-local in the global application state, fortunately, om provides a concept of local component state, the render method use must be changed to render-state and an optional init-state method may be provided.

We can then change our job list component to read:

(defn build-predicate [owner event]
  (let [v (or (-> event .-target .-value) "")]
    (om/set-state! owner [:keep?]
                   (comp (partial re-find (re-pattern v))
                         :title))))
(defcomponent jobs
  [app owner]
  (init-state [this]
   {:keep? identity})
  (render-state [this state]
   (html
    [:div
     [:input {:on-change (partial build-predicate owner)}]
     [:ul
      (om/build-all job-line (filter (:keep? state) (:jobs app)))]])))

In the above, we keep a local predicate function in the component’s state which is initialized to identity to match all jobs.

When changes occur on the text input box, a predicate is built which will be applied on the list for future renders.

The same approach can be taken to implement the form for posting new job entries:

(defn ev->state
  "Helper function to set local component state"
  [owner k event]
  (om/set-state! owner [k] (-> event .-target .-value)))

(defcomponent job-post
  [app owner]
  (render-state
   [this {:keys [title company desc] :as state}]
   (let [submit! (fn [& _]
                   ((:create! @app) state)
                   (redirect "/"))]
     (html
      [:form
       [:label "title"]
       [:input {:value title :on-change (partial ev->state owner :title)}]
       [:label "company"]
       [:input {:value company :on-change (partial ev->state owner :company)}]
       [:label "description"]
       [:textarea {:value desc :on-change (partial ev->state owner :desc)}]
       [:input {:type "submit" :on-click submit!}]]))))

Wrapping up

With this, we conclude our whirlwind tour of om, paving the way for structured apps. The complete application is available at https://github.com/pyr/om-jobs, with the only notable difference being views relying on twitter bootstrap.

While building on om definitely requires a bigger ramp-up than angular, we have been very happy with this simple approach for routing and model services. Once these basic building blocks are out of the way, we’ve found om to be rather more straightforward and composable than angular.

Our biggest public om application is now the frontend for warp, with more coming!


          Real-time Twitter trending on a budget with riemann   

I recently stumbled upon this article http://www.michael-noll.com/blog/2013/01/18/implementing-real-time-trending-topics-in-storm/ by Michael Noll which explains a strategy for computing twitter trends with Storm.

I love Storm, but not everyone has a cluster already, and I think computing tops is a problem that lends itself well to single node computing since datasets often are very simple (in the twitter trend case we store a tuple of hashtag and time of insertion) and thus can fit in a single box’s memory capacity while being able to service many events per second.

It turns out, riemann is a great tool for tackling this type of problem and is able to handle a huge amount of events per second while keeping a small and concise configuration.

It goes without saying that Storm will be a better performer when you are trying to compute a vast amount of data (for instance, the real twitter firehose).

Accumulating tweets

In this example we will compute twitter trends from a sample of the firehose, as provided by twitter. The tweetstream ruby library provides a very easy way to process the “sample hose” and here is a small script which extracts hash tags from tweets and publishes them to a local riemann instance:

require 'tweetstream'
require 'riemann/client'

TweetStream.configure do |config|
  config.consumer_key       = 'xxx'
  config.consumer_secret    = 'xxx'
  config.oauth_token        = 'xxx'
  config.oauth_token_secret = 'xxx'
  config.auth_method        = :oauth
end

riemann = Riemann::Client.new

TweetStream::Client.new.sample do |status|
  status.text.scan(/\s#([[:alnum:]]+)/).map{|x| x.first.downcase}.each do |tag|
    riemann << {service: tag, metric: 1.0, tags: ["twitter"], ttl: 3600}
  end
end

For each tweet in the firehose we emit a riemann event tagged with twitter and a metric of 1.0, the service is the tag which was found.

The rationale for computing trends is as follows:

  • Keep a moving time window of an hour
  • Compute per-tag counts
  • Sort by computed count, then by time
  • Keep the top N events

Riemann provides several facilities out of the box which can be used to implement this, most noticeably:

  • The top stream which separates events in two streams: top & bottom
  • The moving-time-window stream

With recent changes in riemann’s top function we can use this simple configuration to compute trends:

(let [store    (index)
      trending (top 10 (juxt :metric :time) (tag "top" store) store)]
  (streams
    (by :service (moving-time-window 3600 (smap folds/sum trending)))))

Let’s break down what happens in this configuration.

  • We create an index and a trending stream which keeps the top 10 trending hashtags, we’ll get back to this one later.
  • For each incoming event, we split on service (the hashtag), and then sum all occurences in the last hour
  • This generate an event whose metric is the number of occurences in an hour which gets sent to trending

Now let’s look a bit more in-depth at what is provided by the trending stream. We are using the 4-arity version of top, so in this case:

  • We want to compute the top 10 (first argument)
  • We compare and sort events using the (juxt :metric :time) function. juxt yields a vector, which is the result of applying its arguments to its input. For an input event {:metric 1.0 :time 2} our function will yield [1.0 2], we leverage the fact that vectors implement the Comparable interface and thus will correctly sort event by metric, then time
  • We send events belonging to the top 10 to the stream (tag "top" store)
  • We send events not belonging to the top 10 or bumped from the top 10 to the stream store

Fetching results

Running twitter-hose.rb against such a configuration we can now query the index to retrieve. With the ruby riemann-client gem we just retrieve the indexed elements tagged with top:

require 'riemann/client'
require 'pp'

client = Riemann::Client.new
pp client['tagged "top"']

Going further

It might be interesting to play with a better comparison function than (juxt :metric :time), it would be interesting to compute a decay factor from the time and apply it to the metric and let comparisons be done on this output.

The skeleton of such a function could be:

(def decay-factor xxx)

(defn decaying [{:keys [metric time] :as event}]
  (let [ (unix-time)]
    (- metric (* ((unix-time) - time) decay-factor))))

This would allow expiring old trends quicker.

The full code for this example is available at:

/files/2014-01-14-twitter-trending.html

Other applications

When transferring that problem domain to the typical datasets riemann handles, the top stream can be a great way to find outliers in a production environment, in terms of CPU consumption, bursts of log types.

Toy scaling strategies

I’d like to advise implementers to look beyond riemann for scaling top extraction from streams, as tools like Storm are great for these use cases.

But in jest, I’ll mention that since the riemann-kafka plugin - by yours truly - allows producing and consuming to and from kafka queues, intermediate riemann cores could compute local tops and send the aggregated results over to a central riemann instance which would then determine the overall top.

I hope this gives you a good glimpse of what riemann can provide beyond simple threshold alerts.


          Poor man's pattern matching in clojure   

A quick tip which helped me out in a few situations. I’d be inclined to point people to core.match for any matching needs, but the fact that it doesn’t play well with clojure’s ahead-of-time (AOT) compilation requires playing dirty dynamic namespace loading tricks to use it.

A common case I stumbled upon is having a list of homogenous records - say, coming from a database, or an event stream - and needing to take specific action based on the value of several keys in the records.

Take for instance an event stream which would contain homogenous records of with the following structure:

[{:user      "bob"
  :action    :create-ticket
  :status    :success
  :message   "succeeded"
  :timestamp #inst "2013-05-23T18:19:39.623-00:00"}
 {:user      "bob"
  :action    :update-ticket
  :status    :failure
  :message   "insufficient rights"
  :timestamp #inst "2013-05-23T18:19:40.623-00:00"}
 {:user      "bob"
  :action    :delete-ticket
  :status    :success
  :message   "succeeded"
  :timestamp #inst "2013-05-23T18:19:41.623-00:00"}]

Now, say you need do do a simple thing based on the output of the value of both :action and :status.

The first reflex would be to do this within a for or doseq:

(for [{:keys [action status] :as event}]
   (cond
     (and (= action :create-ticket) (= status :success)) (handle-cond-1 event)
     (and (= action :update-ticket) (= status :success)) (handle-cond-2 event)
     (and (= action :delete-ticket) (= status :failure)) (handle-cond-3 event)))

This is a bit cumbersome. A first step would be to use the fact that clojure seqs and maps can be matched, by narrowing down the initial event to the matchable content. juxt can help in this situation, here is its doc for reference.

Takes a set of functions and returns a fn that is the juxtaposition of those fns. The returned fn takes a variable number of args, and returns a vector containing the result of applying each fn to the args (left-to-right).

I suggest you play around with juxt on the repl to get comfortable with it, here is the example usage we’re interested in:

(let [narrow-keys (juxt :action :status)]
   (narrow-keys {:user      "bob"
                 :action    :update-ticket
                 :status    :failure
                 :message   "insufficient rights"
                 :timestamp #inst "2013-05-23T18:19:40.623-00:00"}))
 => [:update-ticket :failure]

Given that function, we can now rewrite our condition handling code in a much more succint way:

(let [narrow-keys (juxt :action :status)]
  (for [event events]
    (case (narrow-keys event)
      [:create-ticket :success] (handle-cond-1 event)
      [:update-ticket :failure] (handle-cond-2 event)
      [:delete-ticket :success] (handle-cond-3 event))))

Now with this method, we have a perfect candidate for a multimethod:

(defmulti handle-event (juxt :action :status))
(defmethod handle-event [:create-ticket :success]
   [event]
   ...)
(defmethod handle-event [:update-ticket :failure]
   [event]
   ...)
(defmethod handle-event [:delete-ticket :success]
   [event]
   ...)

Of course, for more complex cases and wildcard handling, I suggest taking a look at core.match.


          Another year of Clojure   

Clojure at paper.li

I’ve been involved with clojure almost exclusively for a year as smallriver’s lead architect, working on the paper.li product and wanted to share my experience of clojure in the real world.

I had a previous experience with clojure where I put it to work where ruby on rails wasn’t a natural fit, and although smallrivers is a close neighbor of typesafe in Switzerland, my previous experience with the language made it prevail on scala.

Why clojure ?

While working on the backend architecture at a previous company I decided to evaluate three languages which met the needs I was faced with:

  • erlang
  • scala
  • clojure

I decided to tackle the same simple task in all three languages and see how each would fare and how I felt about them. The company’s language at that time was Ruby and JS, and coming from a C background, I wanted a language which provided simplicity, good data structure support and concurrency features, while allowing us to still code quickly.

While naturally drawn to Erlang, I quickly had to set it apart because the stack that was starting to emerge at the time had JVM based parts and would benefit greatly from a language targetting the JVM. I was a bit bummed because some tools in the erlang world were very exciting and the lightweight actors were interesting for a part of our stack.

Scala made a very strong first impression on me, but in practice I was taken aback by some aspects of it: the lack of coherency of open source projects found on the net in terms of style, which made it hard to see which best practices and guidelines would have to be taught to the team, some of the code I found was almost reminiscent of perl a few year back, in the potential it had to become unmaintainable some time later. The standard build tool - SBT - also made a very weak impression. It seemed to be a clear step back from maven which given the fact that maven isn’t a first class citizen in the scala world seemed worrying.

Clojure took the cake, in part because it clicked with the lisper in me, in part because the common idioms that emerged from the code I read bore a lot of similarity with the way we approached ruby. The dynamic typing promised succinct code and the notation for vectors, maps and sets hugely improved the readability of lisp - look at how hashes work in emacs lisp if you want to know what i mean. I was very excited about dosync and a bit worried by the lack of leightweight erlang style actors even though I could see how agent’s could help in that regard. As I’ll point out later on, we ended up not using these features at all anyhow.

The task at hand

When I joined Smallrivers to work on paper.li, it became natural to choose clojure. The team was small and I felt comfortable with it. There was a huge amount of work which needed to be started quickly so a “full-stack” language was necessary to avoid spreading across too many languages and technologies, and another investigation in how the other languages had evolved in the meantime was not possible. The main challenges to tackle were:

  • Being able to aggregate more content
  • Improve the quality of the processing done on content
  • Scaling the storage cluster accordingly
  • Automate the infrastructure

The “hiring” problem

One thing that always pops up in discussions about somewhat marginal languages is the hiring aspect, and the fear that you won’t be able to find people if you “lock” yourself in a language decision that strays from the usual suspects. My experience is that when you tackle big problems, that go beyond simple execution but require actual strong engineers, hiring will be a problem, there’s just no way around it. Choosing people that fit your development culture and see themselves fit to tackle big problems is a long process, integrating them is also time consuming. In that picture, the chosen language isn’t a huge deciding factor.

I see marginal languages as a problem in the following organisations:

  • Companies tackling smaller problems, or problems already solved. These are right in choosing standard languages, if I built a team to build an e-commerce site I wouldn’t go to clojure.
  • Larger companies which want their employees to jump from project to project, which makes sense from a managerial standpoint.

What we built

The bulk of what was done revolves around these functional items:

  • A platform automation tool, built on top of pallet.
  • Clojure facades for the tools relied upon (elastic search, cassandra, redis, kafka).
  • An ORM-type layer on top of cassandra
  • Our backend pipelines
  • A REST API

I won’t go in too much detail on our in-house code, but rather reflect on how things went over.

Coding style and programming “culture”

One of the advantages of lisp, is that it doesn’t have much syntax to go around, so our rules stay simple:

  • the standard 2 space indent
  • we try to stick to 80 columns, because i’m that old
  • we always use require except for: clojure.tools.logging and pallet.thread-expr which are use’d
  • we avoid macros whenever possible
  • we use dynamically rebindable symbols

Of course we embraced non mutable state everywhere possible, which in our case is almost everywhere. Whenever we need to checkpoint state, it usually goes to our storage layer, not to in memory variables.

When compared to languages such as C, I was amazed at how little rules are needed to enforce a consistent code look across projects, with very little time needed to dive into a part written by someone else.

The tools

  1. Local environment

    We didn’t settle on a unique tool-suite at the office, when picking up clojure I made the move from vim to emacs because the integration is better and I fell in love with paredit. Spread amongst the rest of team, textmate, eclipse and intellij were used.

    For building projects, leiningen was an obvious choice. I think leiningen is a great poster child for the greatest in clojure. A small and intelligent facade on top of maven, hiding all the annoying part of maven while keeping the nice distribution part.

    For continuous integration, we wrote a small bridge between leiningen and zi lein-zi which outputs pom.xml for maven, which are then used to build the clojure projects. We still hope to find some time to write a leiningen plugin for jenkins.

  2. Asynchronous programming

    Since a good part of what paper.li does relies on aggregation, async programming is very important. In the pure clojure world, the only real choice for async programming is lamina and aleph. To be honest, aleph turned out to be quite the challenge, a combination of the amount of outbound connections that our work requires and the fact that aleph seems to initially target servers more than clients.

    Fortunately Zach Tellman put a lot of work into the library throughout last year and recent releases are more reliable. One very nice side effect of using a lisp to work with evented code is how readable code becomes, by retaining a sync like look.

    For some parts we still would directly go to a smaller netty facade if we were to start over, but that’s a direct consequence of how much we learned along the way.

  3. Libraries not frameworks

    A common mantra in the clojure development community is that to ease integration the focus should be on libraries, not frameworks. This shows in many widespread projects such as compojure, pallet, and a host of common clojure tools. This proved very useful to us as clients of these libraries, allowing easy composition. I think pallet stands out most in that regard. Where most configuration management solutions offer a complete framework, pallet is just a library offering machine provisioning, configuration and command and control, which allowed us to integrate it with our app and build our abstractions on top of it.

    We tried to stick to that mantra in all of our work, building many small composable libraries, we made some errors at the beginning, by underutilizing some of clojure features, such as protocols but we now have good dynamics for writing these libraries, by writing the core of them with as little dependencies as possible, describing the behavior through protocols, and then writing add-ons which bring in additional dependencies and implement the protocol.

  4. Macros and DSLs

    Another common mantra is to avoid overusing macros. It can’t be overstated how easy they make things though, our entity description library (which we should really prep up for public release, we’ve been talking about it for too long now) allows statements such as these (simplified):

    (defentity :contributors
      (column :identifier (primary-key))
      (column :type (required))
      (column :name)
      (column :screen_name (index))
      (column :description)
      (column :detail (type :compound))
    
      (column :user_url)
      (column :avatar_url)
      (column :statuses_count (type :number))
    
      (has-many :articles)
      (has-many :editions (referenced false) (ttl 172800))
      (has-many :posts (key (timestamp :published_at)) (referenced false)))
    

    The power of DSLs in clojure cannot be understated, with a few macros you can easily build full languages, allowing easy extending of the functionality. Case in point, extracting text from articles, like most people we rely on a generic readability type library, but we also need to handle some sites that need special handling. By using a small DSL you can easily push rules that look like (simplified):

    (defsiterule "some.obscure.site"
       [dom]
       (-> dom
           (pull "#stupid-article-id")))
    

    The great part is that you limit the knowledge to be transfered over to people writing the rules, you avoid intrusive changes to the core of your app and these can safely be pulled from an external location.

    At the end of the day, it seems to me as though the part of the clojure community that came from CL had awful memories of macros making code unreadable, but when sticking to macros with a common look and feel, i.e: with-<resource>, def<resource> type macros, there are huge succintness take aways without hindering readability or maintenance of the code.

  5. Testing

    Every respectable codebase is going to need at least a few test. I’m of the pragmatist church, and straight out do not believe in TDD, neither in crazy coverage ratios. Of course we still have a more that 95% unit test coverage and the decoupled approach preached by clojure’s original developer, rich hickey1 allows for very isolated testing. For cases that require mocking, midge provides a nice framework and using it has created very fruitful throughout our code.

  6. Concurrency, Immutable State and Data Handling

    Funnily, we ended up almost never using any concurrency feature, not a single dosync made it in our codebase, few atom’s and a single agent (in https://github.com/pyr/clj-statsd to avoid recreating a Socket object for each datagram sent). We also banned future usage to more closely control our thread pools. Our usage of atom’s is almost exclusively bound to things that are write once / read many, in some cases we’d be better off with rebindable dynamic symbols.

    We rely on immutable state heavily though, and by heavily I actually mean exclusively. This never was a problem across the many lines of code we wrote, and helped us keep a sane and decoupled code base.

    With facades allowing to represent database fields, queue entries, and almost anything as standard clojure data structures and with powerful functions to work on them, complex handling of a large amount of data is very easily expressed. For this we fell in love with several tools which made things even easier:

    • the threading operators -> and ->>
    • the pallet thread-expr library which brings branching in threaded operations: for->, when->, and so on
    • assoc-in, update-in, seq-utils/index-by and all these functions which allow easy transformation of data structs and retain a procedural look

    I cannot stress how helpful this has been for us in doing the important part of our code right and in a simple manner. This is clearly the best aspect of clojure as far as I’m concerned.

    Moreover, building on top of Java and with the current focus on “Big Data” everywhere, the interaction with large stores and tools to help building batch jobs are simply amazing, especially cascalog.

  7. The case of Clojurescript

    While very exciting we did not have a use for clojurescript, given the size of the existing JS codebase, and the willingness of the frontend developers to stick to a known.

    The simple existence of the project amazes me, especially with the promise of more runtimes, there are various implementations on top of lua, python and gambit (a scheme that compiles to C). With projects like cascalog, pallet, lein, compojure, noir and clojurescript, the ecosystem addresses all parts of almost any stack that you will be tempted to build and we didn’t encounter cases of feeling cornered by the use of clojure - admiteddly, most of the time, a Java library came to the rescue.

  8. The community

    The community is very active, and has not reach critical mass yet, which makes its mailing-list and irc room still usable. There are many influent public figures, some who bring insight, some who bring beautiful code. Most are very open and available to discussion which shaped our approach of the language and our way of coding along the way.

Closing words

It’s been an exciting year and we’re now a full fledged 80% clojure shop. I’m very happy with the result, more so with the journey. I’m sure we could have achieved with other languages as well. As transpires throughout the article, the whole team feels that should we start over, we would do it in clojure again.

It helped us go fast, adapt fast and didn’t hinder us in any way. The language seems to have a bright future ahead of it which is reassuring. I would encourage people coming from python and ruby to consider it as a transition language or as their JVM targetting language, since many habits are still valid in clojure and since it helps slightly change the way we look at problems which can then be reapplied in more “traditional” languages.


  1. Rich hickey’s talk simple made easy and his coining of the term “complecting” illustrates that http://www.infoq.com/presentations/Simple-Made-Easy

    [return]

          Quantifying the Interaction and Contribution of Multiple Datasets in Fusion: Application to the Detection of Schizophrenia   
The extraction of information from multiple sets of data is a problem inherent to many disciplines. This is possible by either analyzing the data sets jointly as in data fusion or separately and then combining as in data integration. However, selecting the optimal method to combine and analyze multiset data is an ever-present challenge. The primary reason for this is the difficulty in determining the optimal contribution of each data set to an analysis as well as the amount of potentially exploitable complementary information among data sets. In this paper, we propose a novel classification rate-based technique to unambiguously quantify the contribution of each data set to a fusion result as well as facilitate direct comparisons of fusion methods on real data and apply a new method, independent vector analysis (IVA), to multiset fusion. This classification rate-based technique is used on functional magnetic resonance imaging data collected from 121 patients with schizophrenia and 150 healthy controls during the performance of three tasks. Through this application, we find that though optimal performance is achieved by exploiting all tasks, each task does not contribute equally to the result and this framework enables effective quantification of the value added by each task. Our results also demonstrate that data fusion methods are more powerful than data integration methods, with the former achieving a classification rate of 73.5 % and the latter achieving one of 70.9 %, a difference which we show is significant when all three tasks are analyzed together. Finally, we show that IVA, due to its flexibility, has equivalent or superior performance compared with the popular data fusion method, joint independent component analysis.
          Computer-Aided Diagnosis of Focal Liver Lesions Using Contrast-Enhanced Ultrasonography With Perflubutane Microbubbles   
This paper proposes an automatic classification method based on machine learning in contrast-enhanced ultrasonography (CEUS) of focal liver lesions using the contrast agent Sonazoid. This method yields spatial and temporal features in the arterial phase, portal phase, and post-vascular phase, as well as max-hold images. The lesions are classified as benign or malignant and again as benign, hepatocellular carcinoma (HCC), or metastatic liver tumor using support vector machines (SVM) with a combination of selected optimal features. Experimental results using 98 subjects indicated that the benign and malignant classification has 94.0% sensitivity, 87.1% specificity, and 91.8% accuracy, and the accuracy of the benign, HCC, and metastatic liver tumor classifications are 84.4%, 87.7%, and 85.7%, respectively. The selected features in the SVM indicate that combining features from the three phases are important for classifying FLLs, especially, for the benign and malignant classifications. The experimental results are consistent with CEUS guidelines for diagnosing FLLs. This research can be considered to be a validation study, that confirms the importance of using features from these phases of the examination in a quantitative manner. In addition, the experimental results indicate that for the benign and malignant classifications, the specificity without the post-vascular phase features is significantly lower than the specificity with the post-vascular phase features. We also conducted an experiment on the operator dependency of setting regions of interest and observed that the intra-operator and inter-operator kappa coefficients were 0.45 and 0.77, respectively.
          Structured and Sparse Canonical Correlation Analysis as a Brain-Wide Multi-Modal Data Fusion Approach   
Multi-modal data fusion has recently emerged as a comprehensive neuroimaging analysis approach, which usually uses canonical correlation analysis (CCA). However, the current CCA-based fusion approaches face problems like high-dimensionality, multi-collinearity, unimodal feature selection, asymmetry, and loss of spatial information in reshaping the imaging data into vectors. This paper proposes a structured and sparse CCA (ssCCA) technique as a novel CCA method to overcome the above problems. To investigate the performance of the proposed algorithm, we have compared three data fusion techniques: standard CCA, regularized CCA, and ssCCA, and evaluated their ability to detect multi-modal data associations. We have used simulations to compare the performance of these approaches and probe the effects of non-negativity constraint, the dimensionality of features, sample size, and noise power. The results demonstrate that ssCCA outperforms the existing standard and regularized CCA-based fusion approaches. We have also applied the methods to real functional magnetic resonance imaging (fMRI) and structural MRI data of Alzheimer’s disease (AD) patients (n = 34) and healthy control (HC) subjects (n = 42) from the ADNI database. The results illustrate that the proposed unsupervised technique differentiates the transition pattern between the subject-course of AD patients and HC subjects with a p-value of less than $1\times 10^{\mathrm {\mathbf {-6}}}$ . Furthermore, we have depicted the brain mapping of functional areas that are most correlated with the anatomical changes in AD patients relative to HC subjects.
          How to Achieve Continuous Container Security for Your CI/CD Pipeline   
Integrate and Automate Security in Your Build, Ship, & Run Processes As enterprises move quickly to deploy containers and microservices with a continuous integration and delivery (CI/CD) pipeline, security often becomes an afterthought. DevOps and security teams should also strive to achieve continuous container security in the pipeline. The starting point for container security is […]
          Can the Linux Stack Clash Vulnerability Affect Containers?   
The recently discovered ‘Stack Clash’ vulnerability in Linux-based systems is another critical security issue like Dirty Cow, but can the stack clash vulnerability affect containers, and what could an attacker do? The short answer is yes, an attacker could exploit the vulnerability to gain root privileges within a container, but not necessarily be able to […]
          インディヴィ スカート ボトムス ミニ丈 ギャザー キャメル 36   
インディヴィ スカート ボトムス ミニ丈 …
現在価格:2,160 円,入札数:-,終了日時:2017/07/02 22:18
          インディヴィ INDIVI スカート ライトベージュ M ボトムス ひざ丈 無地 フレア 38 リネン レーヨン バックジップ ストレッチ   
インディヴィ INDIVI スカート ライトベー…
現在価格:1,721 円,入札数:-,終了日時:2017/07/02 21:54
          インディヴィ INDIVI スカート 膝丈 フレア ソフトプリーツ 総柄 水玉 フリーハンド 大きいサイズ マルチカラー 44 ◆NK-7617 ◆01   
インディヴィ INDIVI スカート 膝丈 フレ…
現在価格:1,944 円,入札数:-,終了日時:2017/07/02 22:45
          Free Lossless Audio Codec   
 


          インディヴィ INDIVI スカート 膝丈 フレア チェック 36 毛 茶   
インディヴィ INDIVI スカート 膝丈 フレ…
現在価格:1,382 円,入札数:-,終了日時:2017/07/02 22:03
          インディヴィ スカート ボトムス ミニ丈 ギャザー 無地 茶 38   
インディヴィ スカート ボトムス ミニ丈 …
現在価格:1,620 円,入札数:-,終了日時:2017/07/02 22:11
          PLANET SOAP - VELVET HE1   
The Italian duo Planet Soap, consisting of Federico "dsm" Monguzzi and Luca "Spectrum" De Giuli, has released today a new EP - "VELVET HE1" on vinyl and in digital format on the French label Cascade Records. This is quite an eclectic selection of contemporary bass music exploring various music genres such as jungle, garage, techno, wonky, nu-beatz or dubstep, dipped in a cosmic sauce. Starting from fantastic and breathtaking, neon synth laden 'Rhynostatic', an ultimate crowdpleaser which would even make your mom dance :) Through my favorite tune of this EP - 'I'm approaching you tonight' reminding me of the spacefaring productions by the Russian duo Demokracy (actually, Planet Soap has released a super duper evil EP with Damscracy from Democracy under the nickname of Planet Terror) and more stomping cosmic beats in 'SYFY' and 'Virus' to jungle experiments in 'Thrialine'. The title track 'Velvet He1' takes the listener on a deep-space sonic trip, where you can meet an 8-bit 'Alien from KooleYay' playing on his nintendo to the friends. Classic techno 'Vectorama' sounds old-schoolish, but thanks to the all-time classic sample and good button work delivers quite a powerful experience. All in all Planet Soap has managed to create their unique sound, though comprising elements you all probably heard many times in the past. Definitely worth checking.



Bonus Free Track:

CR003 - Planet Soap "Rhynostatic" interview + free download + video by cascade records
          PENCEMARAN AIR   
Nama :M Dwi Kurniyarto
No :15
Kelas :XI ips 4-2012

PENCEMARAN AIR :
SUMBER, DAMPAK DAN PENANGGULANGANNYA


PENGERTIAN PENCEMARAN AIR

1. Apa yang disebut Pencemaran Air ?
Istilah pencemaran air atau polusi air dapat dipersepsikan berbeda oleh satu orang dengan orang lainnya mengingat banyak pustaka acuan yang merumuskan definisi istilah tersebut, baik dalam kamus atau buku teks ilmiah. Pengertian pencemaran air juga didefinisikan dalam Peraturan Pemerintah, sebagai turunan dari pengertian pencemaran lingkungan hidup yang didefinisikan dalam undang-undang. Dalam praktek operasionalnya, pencemaran lingkungan hidup tidak pernah ditunjukkan secara utuh, melainkan sebagai pencemaraan dari komponen-komponen lingkungan hidup, seperti pencemaran air, pencemaran air laut, pencemaran air tanah dan pencemaran udara. Dengan demikian, definisi pencemaran air mengacu pada definisi lingkungan hidup yang ditetapkan dalam UU tentang lingkungan hidup yaitu UU No. 23/1997.
Dalam PP No. 20/1990 tentang Pengendalian Pencemaran Air, pencemaran air didefinisikan sebagai : “pencemaran air adalah masuknya atau dimasukkannya mahluk hidup, zat, energi dan atau komponen lain ke dalam air oleh kegiaan manusia sehingga kualitas air turun sampai ke tingkat tertentu yang menyebabkan air tidak berfungsi lagi sesuai dengan peruntukannya” (Pasal 1, angka 2). Definisi pencemaran air tersebut dapat diuraikan sesuai makna pokoknya menjadi 3 (tga) aspek, yaitu aspek kejadian, aspek penyebab atau pelaku dan aspek akibat (Setiawan, 2001).
Berdasarkan definisi pencemaran air, penyebab terjadinya pencemaran dapat berupa masuknya mahluk hidup, zat, energi atau komponen lain ke dalam air sehingga menyebabkan kualitas air tercemar. Masukan tersebut sering disebut dengan istilah unsur pencemar, yang pada prakteknya masukan tersebut berupa buangan yang bersifat rutin, misalnya buangan limbah cair. Aspek pelaku/penyebab dapat yang disebabkan oleh alam, atau oleh manusia. Pencemaran yang disebabkan oleh alam tidak dapat berimplikasi hukum, tetapi Pemerintah tetap harus menanggulangi pencemaran tersebut. Sedangkan aspek akibat dapat dilihat berdasarkan penurunan kualitas air sampai ke tingkat tertentu. Pengertian tingkat tertentu dalam definisi tersebut adalah tingkat kualitas air yang menjadi batas antara tingkat tak-cemar (tingkat kualitas air belum sampai batas) dan tingkat cemar (kualitas air yang telah sampai ke batas atau melewati batas). Ada standar baku mutu tertentu untuk peruntukan air. Sebagai contoh adalah pada UU Kesehatan No. 23 tahun 1992 ayat 3 terkandung makna bahwa air minum yang dikonsumsi masyarakat, harus memenuhi persyaratan kualitas maupun kuantitas, yang persyaratan kualitas tettuang dalam Peraturan Mentri Kesehatan No. 146 tahun 1990 tentang syarat-syarat dan pengawasan kualitas air. Sedangkan parameter kualitas air minum/air bersih yang terdiri dari parameter kimiawi, fisik, radioaktif dan mikrobiologi, ditetapkan dalam PERMENKES 416/1990 (Achmadi, 2001).

2.2. Indikator Pencemaran Air
Indikator atau tanda bahwa air lingkungan telah tercemar adalah adanya perubahan atau tanda yang dapat diamati yang dapat digolongkan menjadi :
- Pengamatan secara fisis, yaitu pengamatan pencemaran air berdasarkan tingkat kejernihan air (kekeruhan), perubahan suhu, warna dan adanya perubahan warna, bau dan rasa
- Pengamatan secara kimiawi, yaitu pengamatan pencemaran air berdasarkan zat kimia yang terlarut, perubahan pH
- Pengamatan secara biologis, yaitu pengamatan pencemaran air berdasarkan mikroorganisme yang ada dalam air, terutama ada tidaknya bakteri pathogen.
Indikator yang umum diketahui pada pemeriksaan pencemaran air adalah pH atau konsentrasi ion hydrogen, oksigen terlarut (Dissolved Oxygen, DO), kebutuhan oksigen biokimia (Biochemiycal Oxygen Demand, BOD) serta kebutuhan oksigen kimiawi (Chemical Oxygen Demand, COD).
Oksigen terlarut (DO)
Tanpa adanya oksegen terlarut, banyak mikroorganisme dalam air tidak dapat hidup karena oksigen terlarut digunakan untuk proses degradasi senyawa organic dalam air. Oksigen dapat dihasilkan dari atmosfir atau dari reaksi fotosintesa algae. Oksigen yang dihasilkan dari reaksi fotosintesa algae tidak efisien, karena oksigen yang terbentuk akan digunakan kembali oleh algae untuk proses metabolisme pada saat tidak ada cahaya. Kelarutan oksigen dalam air tergantung pada temperature dan tekanan atmosfir. Berdasarkan data-data temperature dan tekanan, maka kalarutan oksigen jenuh dalam air pada 25o C dan tekanan 1 atmosfir adalah 8,32 mg/L (Warlina, 1985).
Kadar oksigen terlarut yang tinggi tidak menimbulkan pengaruh fisiologis bagi manusia. Ikan dan organisme akuatik lain membutuhkan oksigen terlarut dengan jumlah cukup banyak. Kebutuhan oksigen ini bervariasi antar organisme. Keberadaan logam berta yang berlebihan di perairan akan mempengaruhi system respirasi organisme akuatik, sehingga pada saat kadar oksigen terlarut rendah dan terdapat logam berat dengan konsentrasi tinggi, organisme akuatik menjadi lebih menderita (Tebbut, 1992 dalam Effendi, 2003).
Pada siang hari, ketika matahari bersinar terang, pelepasan oksigen oleh proses fotosintesa yang berlangsung intensif pada lapisan eufotik lebih besar daripada oksigen yang dikonsumsi oleh proses respirasi. Kadar oksigen terlarut dapat melebihi kadar oksigen jenuh, sehingga perairan mengalami supersaturasi. Sedangkan pada malam hari, tidak ada fotosintesa, tetapi respirasi terus berlangsung. Pola perubahan kadar oksigen ini mengakibatkan terjadinya fluktuasi harian oksigen pada lapisan eufotik perairan. Kadar oksigen maksimum terjadi pada sore hari dan minimum pada pagi hari.
Kebutuhan Oksigen Biokimia (BOD)
Dekomposisi bahan organic terdiri atas 2 tahap, yaitu terurainya bahan organic menjadi anorganik dan bahan anorganik yang tidak stabil berubah menjadi bahan anorganik yang stabil, misalnya ammonia mengalami oksidasi menjadi nitrit atau nitrat (nitrifikasi). Pada penentuan nilai BOD, hanya dekomposisi tahap pertama ynag berperan, sedangkan oksidasi bahan anorganik (nitrifikasi) dianggap sebagai zat pengganggu.
Dengan demikian, BOD adalah banyaknya oksigen yang dibutuhkan oleh mikroorganisme dalam lingkungan air untuk memecah (mendegradasi) bahan buangan organic yang ada dalam air menjadi karbondioksida dan air. Pada dasarnya, proses oksidasi bahan organic berlangsung cukup lama. Menurut Sawyer dan McCarty, 1978 (Effendi, 2003) proses penguraian bahan buangan organic melalui proses oksidasi oleh mikroorganisme atau oleh bakteri aerobic adalah :
CnHaObNc + (n + a/4 – b/2 – 3c/4) O2 → n CO2 + (a/2 – 3c/2) H2O + c NH3
Bahan organic oksigen bakteri aerob

Untuk kepentingan praktis, proses oksidasi dianggap lengkap selama 20 hari, tetapi penentuan BOD selama 20 hari dianggap masih cukup lama. Penentuan BOD ditetapkan selam 5 hari inkubasi, maka biasa disebut BOD5. Selain memperpendek waktu yang diperlukan, hal ini juga dimaksudkan untuk meminimumkan pengaruh oksidasi ammonia yang menggunakan oksigen juga. Selama 5 hari masa inkubasi, diperkirakan 70% - 80% bahan organic telah mengalami oksidasi. (Effendi, 2003).
Jumlah mikroorganisme dalam air lingkungan tergantung pada tingkat kebersihan air. Air yang bersih relative mengandung mikroorganisme lebih sedikit dibandingkan yang tercemar. Air yang telah tercemar oleh bahan buangan yang bersifat antiseptic atau bersifat racun, seperti fenol, kreolin, detergen, asam cianida, insektisida dan sebagainya, jumlah mikroorganismenya juga relative sedikit. Sehingga makin besar kadar BOD nya, maka merupakan indikasi bahwa perairan tersebut telah tercemar, sebagai contoh adalah kadar maksimum BOD5 yang diperkenankan untuk kepentingan air minum dan menopang kehidupan organisme akuatik adalah 3,0 – 6,0 mg/L berdasarkan UNESCO/WHO/UNEP, 1992. Sedangkan berdasarkan Kep.51/MENKLH/10/1995 nilai BOD5 untuk baku mutu limbah cair bagi kegiatan industri golongan I adalah 50 mg/L dan golongan II adalah 150 mg/L.

Kebutuhan Oksigen Kimiawi (COD)
COD adalah jumlah oksigen yang diperlukan agar bahan buangan yang ada dalam air dapat teroksidasi melalui reaksi kimia baik yang dapat didegradasi secara biologis maupun yang sukar didegradasi. Bahan buangan organic tersebut akan dioksidasi oleh kalium bichromat yang digunakan sebagai sumber oksigen (oxidizing agent) menjadi gas CO2 dan gas H2O serta sejumlah ion chrom. Reaksinya sebagai berikut :
HaHbOc + Cr2O7 2- + H + → CO2 + H2O + Cr 3+
Jika pada perairan terdapat bahan organic yang resisten terhadap degradasi biologis, misalnya tannin, fenol, polisacharida dansebagainya, maka lebih cocok dilakukan pengukuran COD daripada BOD. Kenyataannya hampir semua zat organic dapat dioksidasi oleh oksidator kuat seperti kalium permanganat dalam suasana asam, diperkirakan 95% - 100% bahan organic dapat dioksidasi.
Seperti pada BOD, perairan dengan nilai COD tinggi tidak diinginkan bagi kepentingan perikanan dan pertanian. Nilai COD pada perairan yang tidak tercemar biasanya kurang dari 20 mg/L, sedangkan pada perairan tercemar dapat lebih dari 200 mg/L dan pada limbah industri dapat mencapai 60.000 mg/L (UNESCO,WHO/UNEP, 1992).

III. SUMBER PENCEMARAN AIR

Banyak penyebab sumber pencemaran air, tetapi secara umum dapat dikategorikan menjadi 2 (dua) yaitu sumber kontaminan langsung dan tidak langsung. Sumber langsung meliputi efluen yang keluar dari industri, TPA sampah, rumah tangga dan sebagainya. Sumber tak langsung adalah kontaminan yang memasuki badan air dari tanah, air tanah atau atmosfir berupa hujan (Pencemaran Ling. Online, 2003). Pada dasarnya sumber pencemaran air berasal dari industri, rumah tangga dan pertanian. Tanah dan air tanah mengandung sisa dari aktivitas pertanian misalnya pupuk dan pestisida. Kontaminan dari atmosfir juga berasal dari aktifitas manusia yaitu pencemaran udara yang menghasilkan hujan asam.
Pengaruh bahan pencemar yang berupa gas, bahan terlarut, dan partikulat terhadap lingkungan perairan dan kesehatan manusia dapat ditunjukkan secara skematik sebagai berikut :

Gambar : Bagan Pengaruh Beberapa Jenis Bahan Pencemar terhadap
Lingkungan Perairan


3.1. Komponen Pencemaran Air
Saat ini hampir 10 juta zat kimia telah dikenal manusia, dan hampir 100.000 zat kimia telah digunakan secara komersial. Kebanyakan sisa zat kimia tersebut dibuang ke badan air atau air tanah. Sebagai contoh adalah pestisida yang biasa digunakan di pertanian, industri atau rumah tangga, detergen yang biasa digunakan di rumah tangga atau PCBs yang biasa digunakan pada alat-alat elektronik.
Erat kaitannya dengan masalah indikator pencemaran air, ternyata komponen pencemaran air turut menentukan bagaimana indikator tersebut terjadi. Menurut Wardhana (1995), komponen pencemaran air dapat dikelompokkan sebagai bahan buangan:
1. padat
2. organic dan olahan bahan makanan
3. anorganik
4. cairan berminyak
5. berupa panas
6. zat kimia.

3.1.1. Bahan buangan padat
Yang dimaksud bahan buangan padat adalah adalah bahan buangan yang berbentuk padat, baik yang kasar atau yang halus, misalnya sampah. Buangan tersebut bila dibuang ke air menjadi pencemaran dan akan menimbulkan pelarutan, pengendapan ataupun pembentukan koloidal.
Apabila bahan buangan padat tersebut menimbulkan pelarutan, maka kepekatan atau berat jenis air akan naik. Kadang-kadang pelarutan ini disertai pula dengan perubahan warna air. Air yang mengandung larutan pekat dan berwarna gelap akan mengurangi penetrasi sinar matahari ke dalam air. Sehingga proses fotosintesa tanaman dalam air akan terganggu. Jumlah oksigen terlarut dalam air menjadi berkurang, kehidupan organisme dalam air juga terganggu.
Terjadinya endapan di dasar perairan akan sangat mengganggu kehidupan organisme dalam air, karena endapan akan menutup permukaan dasar air yang mungkin mengandung telur ikan sehingga tidak dapat menetas. Selain itu, endapan juga dapat menghalangi sumber makanan ikan dalam air serta menghalangi datangnya sinar matahari.
Pembentukan koloidal terjadi bila buangan tersebut berbentuk halus, sehingga sebagian ada yang larut dan sebagian lagi ada yang melayang-layang sehingga air menjadi keruh. Kekeruhan ini juga menghalangi penetrasi sinar matahari, sehingga menghambat fotosintesa dan berkurangnya kadar oksigen dalam air.

3.1.2. Bahan buangan organic dan olahan bahan makanan
Bahan buangan organic umumnya berupa limbah yang dapat membusuk atau terdegradasi oleh mikroorganisme, sehingga bila dibuang ke perairan akan menaikkan populasi mikroorganisme. Kadar BOD dalam hal ini akan naik. Tidak tertutup kemungkinan dengan berambahnya mikroorganisme dapat berkembang pula bakteri pathogen yang berbahaya bagi manusia. Demikian pula untuk buangan olahan bahan makanan yang sebenarnya adalah juga bahan buangan organic yang baunya lebih menyengat. Umumnya buangan olahan makanan mengandung protein dan gugus amin, maka bila didegradasi akan terurai menjadi senyawa yang mudah menguap dan berbau busuk (misal. NH3).

3.1.3. Bahan buangan anorganik
Bahan buangan anorganik sukar didegradasi oleh mikroorganisme, umumnya adalah logam. Apabila masuk ke perairan, maka akan terjadi peningkatan jumlah ion logam dalam air. Bahan buangan anorganik ini biasanya berasal dari limbah industri yag melibatkan penggunaan unsure-unsur logam seperti timbal (Pb), Arsen (As), Cadmium (Cd), air raksa atau merkuri (Hg), Nikel (Ni), Calsium (Ca), Magnesium (Mg) dll.
Kandungan ion Mg dan Ca dalam air akan menyebabkan air bersifat sadah. Kesadahan air yang tinggi dapat merugikan karena dapat merusak peralatan yang terbuat dari besi melalui proses pengkaratan (korosi). Juga dapat menimbulkan endapan atau kerak pada peralatan.
Apabila ion-ion logam berasal dari logam berat maupun yang bersifat racun seperti Pb, Cd ataupun Hg, maka air yang mengandung ion-ion logam tersebut sangat berbahaya bagi tubuh manusia, air tersebut tidak layak minum.

3.1.4. Bahan buangan cairan berminyak
Bahan buangan berminyak yang dibuang ke air lingkungan akan mengapung menutupi permukaan air. Jika bahan buangan minyak mengandung senyawa yang volatile, maka akan terjadi penguapan dan luas permukaan minyak yang menutupi permukaan air akan menyusut. Penyusutan minyak ini tergantung pada jenis minyak dan waktu. Lapisan minyak pada permukaan air dapat terdegradasi oleh mikroorganisme tertentu, tetapi membutuhkan waktu yang lama.
Lapisan minyak di permukaan akan mengganggu mikroorganisme dalam air. Ini disebabkan lapisan tersebut akan menghalangi diffusi oksigen dari udara ke dalam air, sehingga oksigen terlarut akan berkurang. Juga lapisan tersebut akan menghalangi masuknya sinar matahari ke dalam air, sehingga fotosintesapun terganggu. Selain itu, burungpun ikut terganggu, karena bulunya jadi lengket, tidak dapat mengembang lagi akibat kena minyak.

3.1.5. Bahan buangan berupa panas (polusi thermal)
Perubahan kecil pada temperatur air lingkungan bukan saja dapat menghalau ikan atau spesies lainnya, namun juga akan mempercepat proses biologis pada tumbuhan dan hewan bahkan akan menurunkan tingkat oksigen dalam air. Akibatnya akan terjadi kematian pada ikan atau akan terjadi kerusakan ekosistem. Untuk itu, polusi thermal inipun harus dihindari. Sebaiknya industri-industri jika akan membuang air buangan ke perairan harus memperhatikan hal ini.

3.1.6. Bahan buangan zat kimia
Bahan buangan zat kimia banyak ragamnya, tetapi dalam bahan pencemar air ini akan dikelompokkan menjadi :
a. Sabun (deterjen, sampo dan bahan pembersih lainnya),
b. Bahan pemberantas hama (insektisida),
c. Zat warna kimia,
d. Zat radioaktif
a. Sabun
Adanya bahan buangan zat kimia yang berupa sabun (deterjen, sampo dan bahan pembersih lainnya) yang berlebihan di dalam air ditandai dengan timbulnya buih-buih sabun pada permukaan air. Sebenarnya ada perbedaan antara sabun dan deterjen serta bahan pembersih lainnya. Sabun berasal dari asam lemak (stearat, palmitat atau oleat) yang direaksikan dengan basa Na(OH) atau K(OH), berdasarkan reaksi kimia berikut ini :
C17H35COOH + Na(OH) → C17H35COONa + H2O
Asam stearat basa sabun
Sabun natron (sabun keras) adalah garam natrium asam lemak seperti pada contoh reaksi di atas. Sedangkan sabun lunak adalah garam kalium asam lemak yang diperoleh dari reaksi asam lemak dengan basa K(OH). Sabun lemak diberi pewarna yang menarik dan pewangi (parfum) yang enak serta bahan antiseptic seperti pada sabun mandi. Beberapa sifat sabun antara lain adalah sebagai berikut :
a. Larutan sabun mempunyai sifat membersihkan karena dapat mengemulsikan
kotoran yang melekat pada badan atau pakaian
b. Sabun dengan air sadah tidak dapat membentuk busa, tapi akan membentuk
endapan :
2 (C17H35COONa) + CaSO4 → (C17H35COO)2Ca + Na2SO4
endapan
c. Larutan sabun bereaksi basa karena terjadi hidrolisis sebagian.
Sedangkan deterjen adalah juga bahan pembersih sepeti halnya sabun, akan tetapi dibuat dari senyawa petrokimia. Deterjen mempunyai kelebihan dibandingkan dengan sabun, karena dapat bekerja pada air sadah. Bahan deterjen yang umum digunakan adalah dedocylbenzensulfonat. Deterjen dalam air akan mengalami ionisassi membentuk komponen bipolar aktif yang akan mengikat ion Ca dan/atau ion Mg pada air sadah. Komponen bipolar aktif terbentuk pada ujung dodecylbenzen-sulfonat. Untuk dapat membersihkan kotoran dengan baik, deterjen diberi bahan pembentuk yang bersifat alkalis. Contoh bahan pembentuk yang bersifat alkalis adalah natrium tripoliposfat.
Bahan buangan berupa sabun dan deterjen di dalam air lingkungan akan mengganggu karena alasan berikut :
a. Larutan sabun akan menaikkan pH air sehingga dapat menggangg kehidupan
organisme di dalam air. Deterjen yang menggunakan bahan non-Fosfat akan
menaikkan pH air sampai sekitar 10,5-11
b. Bahan antiseptic yang ditambahkan ke dalam sabun/deterjen juga mengganggu
kehidupan mikro organisme di dalam air, bahkan dapat mematikan
c. Ada sebagian bahan sabun atau deterjen yang tidak dapat dipecah (didegradasi)
oleh mikro organisme yang ada di dalam air. Keadaan ini sudah barang tentu
akan merugikan lingkungan. Namun akhir-akhir ini mulai banyak digunakan
bahan sabun/deterjen yang dapat didegradsi oleh mikroorganisme

b. Bahan pemberantas Hama
Pemakaian bahan pemberantas hama (insektisida) pada lahan pertanian seringkali mekiputi daerah yang sangat luas, sehingga sisa insektisida pada daerah pertanian tersebut cukup banyak. Sisa bahan insektisida tersebut dapat sampai ke air lingkungan melalui pengairan sawah, melalui hujan yang jatuh pada daerah pertanian kemudian mengalir ke sungai atau danau di sekitarnya. Seperti halnya pada pencemaran udara, semua jenis bahan insektisida bersifat racun apabila sampai kedalam air lingkungan.
Bahan insektisida dalam air sulit untuk dipecah oleh mikroorganisme, kalaupun biasanya hal itu akan berlangsung dalam waktu yang lama. Waktu degradasi oleh mikroorganisme berselang antara beberapa minggu sampai dengan beberapa tahun. Bahan insektisida seringkali dicampur dengan senyawa minyak bumi sehingga air yang terkena bahan buangan pemberantas hama ini permukaannya akan tertutup lapisan minyak
c. Zat Warna Kimia
Zat warna dipakai hampir pada semua industri. Tanpa memakai zat warna, hasil atau produk industri tidak menarik. Oleh karena itu hampir semua produk memanfaatkannya agar produk itu dapat dipasarkan dengan mudah.
Pada dasarnya semua zat warna adalah racun bagi tubuh manusia. Oleh karena itu pencemaran zat warna ke air lingkungan perlu mendapat perhatian sunggh-sungguh agar tidak sampai masuk ke dalam tubuh manusia melalui air minum. Ada zat warna tertentu yang relatif aman bagi manusia, yaitu zat warna yang digunakan pada industri bahan makanan dan minuman, industri farmasi/obat-obatan.
Zat warna tersusun dari chromogen dan auxochrome. Chromogen merupakan senyawa aromatic yang berisi chromopore, yaitu zat pemberi warna yang berasal dari radikal kimia, misal kelompok nitroso (-NO), kelompok azo (-N=N-), kelompok etilen (>C=C<) dan lain lain. Macam-macam warna dapat diperoleh dari penggabungan radikal kimia tersebut di atas dengan senyawa lain. Sedangkan auxochrome adalah radikal yang memudahkan terjadinya pelarutan, sehingga zat warna dapat mudah meresap dengan baik ke dalam bahan yang akan diberi warna. Contoh auxochrome adalah –COOH atau –SO3H atau kelompok pembentuk garam –NH2 atau –OH.
Zat warna dapat pula diperoleh dari senyawa anorganik dan mineral alam yang disebut dengan pigmen. Ada pula bahan tambahan yang digunakan sesuai dengan fungsinya, misalnya bahan pembentuk lapisan film (misal, bahan vernis, emulsi lateks), bahan pengencer (misal, terpentin, naftalen), bahan pengering (missal, Co, Mn, naftalen), bahan anti mengelupas (missal, polihidroksi fenol) dan bahan pembentuk elastic (misal, minyak).
Berdasarkan bahan susunan zat warna dan bahan-bahan yang ditambahkan, dapat dimengerti bahwa hampir semua zat warna kimia adalah racun. Apabila masuk ke dalam tubuh manusia dapat bersifat cocarcinogenik, yaitu merangsang tumbuhnya kanker. Oleh sebab itu, pembuangan zat kimia ke air lingkungan sangatlah berbahaya. Selain sifatnya racun, zat warna kimia juga akan mempengaruhi kandungan oksigen dalam air mempengaruhi pH air lingkungan, yang menjadikan gangguan bagi mikroorganisme dan hewan air.
d. Zat radioaktif
Tidak tertutup kemungkanan adanya pembuangan sisa zat radioaktif ke air lingkungan secara langsung. Ini dimungkinkan karena aplikasi teknologi nuklir yang menggunakan zat radioaktif pada berbagai bidang sudah banyak dikembangkan, sebagai contoh adalah aplikasi teknologinuklir pada bidang pertanian, kedokteran, farmasi dan lain lain. Adanya zat radioaktif dalam air lingkungan jelas sangat membahayakan bagi lingkungan dan manusia. Zat radioaktif dapat menimbulkan kerusakan biologis baik melalui efek langsung atau efek tertunda.

IV. DAMPAK PENCEMARAN AIR

Pencemaran air dapat berdampak sangat luas, misalnya dapat meracuni air minum, meracuni makanan hewan, menjadi penyebab ketidak seimbangan ekosistem sungai dan danau, pengrusakan hutan akibat hujan asam dsb.
Di badan air, sungai dan danau, nitrogen dan fosfat dari kegiatan pertanian telah menyebabkan pertumbuhan tanaman air yang di luar kendali yang disebut eutrofikasi (eutrofication). Ledakan pertumbuhan tersebut menyebabkan oksigen yang seharusnya digunakan bersama oleh seluruh hewan/tumbuhan air, menjadi berkurang. Ketika tanaman air tersebut mati, dekomposisinya menyedot lebih banyak oksigen. Akibatnya ikan akan mati dan aktivitas bakteri akan menurun.
Dampak pencemaran air pada umumnya dibagi dalam 4 kategori (KLH, 2004)
- dampak terhadap kehidupan biota air
- dampak terhadap kualitas air tanah
- dampak terhadap kesehatan
- dampak terhadap estetika lingkungan


4.1. Dampak terhadap kehidupan biota air
Banyaknya zat pencemar pada air limbah akan menyebabkan menurunnya kadar oksigen terlarut dalam air tersebut. Sehingga akan mengakibatkan kehidupan dalam air yang membutuhkan oksigen terganggu serta mengurangi perkembangannya. Selain itu kematian dapat pula disebabkan adanya zat beracun yang juga menyebabkan kerusakan pada tanaman dan tumbuhan air.
Akibat matinya bakteri-bakteri, maka proses penjernihan air secara alamiah yang seharusnya terjadi pada air limbah juga terhambat. Dengan air limbah menjadi sulit terurai. Panas dari industri juaga akan membawa dampak bagi kematian organisme, apabila air limbah tidak didinginkan dahulu.
4.2. Dampak terhadap kualitas air tanah
Pencemaran air tanah oleh tinja yang biasa diukur dengan faecal coliform telah terjadi dalam skala yang luas, hal ini telah dibuktikan oleh suatu survey sumur dangkal di Jakarta. Banyak penelitian yang mengindikasikan terjadinya pencemaran tersebut.
4.3. Dampak terhadap kesehatan
Peran air sebagai pembawa penyakit menular bermacam-macam antara lain :
- air sebagai media untuk hidup mikroba pathogen
- air sebagai sarang insekta penyebar penyakit
- jumlah air yang tersedia tak cukup, sehingga manusia bersangkutan tak dapat membersihkan diri
- air sebagai media untuk hidup vector penyakit
Ada beberapa penyakit yang masuk dalam katagori water-borne diseases, atau penyakit-penyakit yang dibawa oleh air, yang masih banyak terdapat di daerah-daerah. Penyakit-penyakit ini dapat menyebar bila mikroba penyebabnya dapat masuk ke dalam sumber air yang dipakai masyarakat untuk memenuhi kebutuhan sehari-hari. Sedangkan jenis mikroba yang dapat menyebar lewat air antara lain, bakteri, protozoa dan metazoa.
4.4. Dampak terhadap estetika lingkungan
Dengan semakin banyaknya zat organic yang dibuang ke lingkungan perairan, maka perairan tersebut akan semakin tercemar yang biasanya ditandai dengan bau yang menyengat disamping tumpukan yang dapat mengurangi estetika lingkungan. Masalah limbah minyak atau lemak juga dapat mengurangi estetika. Selain bau, limbah tersebut juga menyebabkan tempat sekitarnya menjadi licin. Sedangkan limbah detergen atau sabun akan menyebabkan penumpukan busa yang sangat banyak. Inipun dapat mengurangi estetika.

V. PENANGGULANGANGAN PENCEMARAN AIR

Pengendalian/penanggulangan pencemaran air di Indonesia telah diatur melalui Peraturan Pemerintah Nomor 82 tahun 2001 tentang Pengelolaan Kualitas dan Pengendalian Pencemaran Air. Secara umum hal ini meliputi pencemaran air baik oleh instansi ataupun non-instansi. Salah satu upaya serius yang telah dilakukan Pemerintah dalam pengendalian pencemaran air adalah melalui Program Kali Bersih (PROKASIH). Program ini merupakan upaya untuk menurunkan beban limbah cair khususnya yang berasal dari kegiatan usaha skala menengah dan besar, serta dilakukan secara bwertahap untuk mengendalikan beban pencemaran dari sumber-sumber lainnya. Program ini juga berusaha untuk menata pemukiman di bantaran sungai dengan melibatkan masyarakat setempat (KLH, 2004).
Pada prinsipnya ada 2 (dua) usaha untuk menanggulangi pencemaran, yaitu penanggulangan secara non-teknis dan secara teknis. Penanggulangan secara non-teknis yaitu suatu usaha untuk mengurangi pencemaran lingkungan dengan cara menciptakan peraturan perundangan yang dapat merencanakan, mengatur dan mengawasi segala macam bentuk kegiatan industri dan teknologi sehingga tidak terjadi pencemaran. Peraturan perundangan ini hendaknya dapat memberikan gambaran secara jelas tentang kegiatan industri yang akan dilaksanakan, misalnya meliputi AMDAL, pengaturan dan pengawasan kegiatan dan menanamkan perilaku disiplin. Sedangkan penanggulangan secara teknis bersumber pada perlakuan industri terhadap perlakuan buangannya, misalnya dengan mengubah proses, mengelola limbah atau menambah alat bantu yang dapat mengurangi pencemaran.
Sebenarnya penanggulangan pencemaran air dapat dimulai dari diri kita sendiri. Dalam keseharian, kita dapat mengurangi pencemaran air dengan cara mengurangi produksi sampah (minimize) yang kita hasilkan setiap hari. Selain itu, kita dapat pula mendaur ulang (recycle) dan mendaur pakai (reuse) sampah tersebut.
Kitapun perlu memperhatikan bahan kimia yang kita buang dari rumah kita. Karena saat ini kita telah menjadi masyarakat kimia, yang menggunakan ratusan jenis zat kimia dalam keseharian kita, seperti mencuci, memasak, membersihkan rumah, memupuk tanaman, dan sebagainya. Kita harus bertanggung jawab terhadap berbagai sampah seperti makanan dalam kemasan kaleng, minuman dalam botol dan sebagainya, yang memuat unsur pewarna pada kemasannya dan kemudian terserap oleh air tanah pada tempat pembuangan akhir. Bahkan pilihan kita untuk bermobil atau berjalan kaki, turut menyumbangkan emisi asam atu hidrokarbon ke dalam atmosfir yang akhirnya berdampak pada siklus air alam.
Menjadi konsumen yang bertanggung jawab merupakan tindakan yang bijaksana. Sebagai contoh, kritis terhadap barang yang dikonsumsi, apakah nantinya akan menjadi sumber bencana yang persisten, eksplosif, korosif dan beracun atau degradable (dapat didegradasi alam)? Apakah barang yang kita konsumsi nantinya dapat meracuni manusia, hewan, dan tumbuhan aman bagi makhluk hidup dan lingkungan ?
Teknologi dapat kita gunakan untuk mengatasi pencemaran air. Instalasi pengolahan air bersih, instalasi pengolahan air limbah, yang dioperasikan dan dipelihara baik, mampu menghilangkan substansi beracun dari air yang tercemar. Dari segi kebijakan atau peraturanpun mengenai pencemaran air ini telah ada. Bila kita ingin benar-benar hal tersebut dapat dilaksanakan, maka penegakan hukumnya harus dilaksanakan pula. Pada akhirnya, banyak pilihan baik secara pribadi ataupun social (kolektif) yang harus ditetapkan, secara sadar maupun tidak, yang akan mempengaruhi tingkat pencemaran dimanapun kita berada. Walaupun demikian, langkah pencegahan lebih efektif dan bijaksana.
Melalui penanggulangan pencemaran ini diharapkan bahwa pencemaran akan berkurang dan kualitas hidup manusia akan lebih ditingkatkan, sehingga akan didapat sumber air yang aman, bersih dan sehat.
          Pixologic ZBrush 4R8 Win Fixed..   
Pixologic ZBrush 4R8 Win Fixed Keyshot now working, also some other minor bugs fixed ZBrush is the 3D industry's standard digital sculpting application. Use customizable brushes to shape, texture, and paint virtual clay, while getting instant feedback. Work with the same tools used by film studios, game developers and artists the world over. Dynamesh is ZBrush's digital clay. It rebuilds the topology of your model as you sculpt, creating a smooth, even surface for you to add fine details. Step between different resolutions of your model, and changes on any level will be applied to each one. This enables you to create complex models, but still be able to make big changes when you need to. If you're a concept artist or illustrator, you'll find that ZBrush bridges the gap between 2D and 3D. Compose 2D images where you can make real-time changes, while maintaining accurate lighting and depth. Paint models with pixel-by-pixel control using customizable brushes. Use GoZ to create complex textures in PhotoShop and see them applied to your scene as you work. ZBrush 4R8 introduces multi-language support, as well as many other enhancements such as a new transformation tool, the Gizmo 3D and a new text generator that will allow the artist to create text and logos with real-time adjustments. And these are only the beginning! Live Boolean For all their power, Boolean systems have historically required a lot of trial and error before finally getting a satisfying result. With Live Boolean, artists gain the ability to combine multiple sculptures together and see in real-time what the resulting mesh will look like. Any model can be subtracted from another, regardless of their polygon counts. You can even use Live Boolean with the existing instancing systems in ZBrush such as NanoMesh and ArrayMesh. While Live Boolean is active, you can even sculpt on your models while previewing the Boolean results. All of these options can be combined together to provide new sculpting workflows that are unique to ZBrush. Real-Time Preview Live Boolean is also excellent for creating hard surface models. Live Boolean makes it possible for you to preview any addition and subtraction operations between your source models, allowing adjustments to be made on the fly. There is no guesswork, since you are able to dynamically see the end result before committing to the operation. You can adjust any part on a mesh and see it instantly impact the model. It's 100% interactive, non-destructive and works with any sculpt. Using Live Boolean for 3D Printing Live Boolean is perfect for creating models for manufacturing, toy design, product design, collectibles, and more. Use any sculpt to create articulated joints, keys for 3D printing, hollowing, or even to create molds for production. Converting Your Live Booleans The Live Boolean function is not only a preview system inside ZBrush but can also be converted to true geometry to allow export for use in other applications. When it comes time to finalize a Live Boolean creation, simply click a single button and the Live Boolean process will be converted to geometry. The structure of your models will change as little as possible, with topology changes only taking place where the source models connect to each other. Even with models that are comprised of several million polygons, the result can be generated in just a few seconds. Vector Displacement Mesh Feature Expand your Alpha arsenal with a new library of Vector Displacement Meshes (VDM). These are 3D sculpts used as brush building blocks that will allow undercutting when drawing on a model's surface. As an example, you can draw a nose complete with nostrils in a single brush stroke. Or an ear with complete front and back sides. Or a bent finger, scales with a raised angle or even an open mouth. All of this without lost depth or detail. DOWNLOAD: http://nitroflare.com/view/42709C56B761764/Pixologic.ZBrush.4R8.Win.Fixed.part1.rar http://nitroflare.com/view/3DB4E6E0CB215E4/Pixologic.ZBrush.4R8.Win.Fixed.part2.rar http://nitroflare.com/view/D4D3FEBBBFBD624/Pixologic.ZBrush.4R8.Win.Fixed.part3.rar http://nitroflare.com/view/5C60AF3B7F7892A/Pixologic.ZBrush.4R8.Win.Fixed.part4.rar http://nitroflare.com/view/54B14ECE149FC09/Pixologic.ZBrush.4R8.Win.Fixed.part5.rar http://nitroflare.com/view/D3DC04E9FF2764C/Pixologic.ZBrush.4R8.Win.Fixed.part6.rar
          Vector Dogs   
none
          Surprise !   
Source: istockphoto


It was Christmas eve. All houses down the lane were studded with X'mas lights in their balconies. One couldn’t see many Christmas trees around here, Christians being scarce in the vicinity. In one of these homes were a little girl who found the absence of Christmas trees and Santa Clause deeply upsetting.
She wished for a Christmas like they showed in the movies; with all the gifts and surprises, get-togethers and decorations! She sure couldn’t do it all on her own. But she knew she at least had to try.

So here she was, peeping out the window to make sure her family wasn’t back from work yet. Rushing back to the bedroom, she sat sewing slim sponge slices into cones to make a tiny Christmas tree. She had all of half an hour every day to secretly make the gifts; when no one else was home. Couldn’t spoil the surprise now could she?
It was almost done by Christmas eve; a three layered thermocol Christmas cake for her mom, a snowman made of tissue paper for her dad, and that sponge X'mas tree for her sister.  A neat drawing, as she liked to believe, of Santa’s face was to be her mask. She’d also gotten a red top, red pants and a red belt ready. All that was left was to get a bag to tuck in the gifts and a tummy for Santa. That evening she tried stuffing every pillow in the house under her top. Sadly, all pillows were the size of her own torso and just wouldn’t stay. Much to her dismay, the tummy idea had to be chucked.

Finally, the D-day arrived. All set, she waited for her family to end up together in the living room, which proved to be a herculean task. She ended up dragging everyone into the same place in the name of a ‘something’ she couldn’t tell them. So much for a small surprise!

Keeping them put, she rushed ‘backstage’ to the bedroom and got dressed up in a jiffy. And off she went with a sweet and meek ‘Ho ho ho!’ that resembled nothing like a Santa’s laugh. But who cared after all, this was family. And surprised they were! Very pleased too, she could say. For they made her go back and come again so they could shoot a video of it and remember it forever.

Years later, she sat watching the video of once upon a time. Oh, the things they did as kids. She’d forgotten the last time she’d given such a surprise to her family. Had life kept her so very busy since then? Talk about resolutions and goals by the year’s end, now she had hers too. Pulling out her diary, she wrote it down,

“This holiday season I promise to give a surprise to my family.”


***
Linking with FTSF

          Spirals   
JPGby KAHD © 08-03-2013:
I kind of liked a little doodle I did while at a meeting the other day, so I expanded on it then vectored it. Spiral and curve fun. :P Cat, snail, flower, frog, moutain, butterfly, dragonfly, fish, cattail.

          Cloud Server System Architect - Intel (Hudson, MA)   
Leads the system architecture definition, development, and deployment strategy for new Cloud Server Systems. Leads a multi-disciplinary team of architects driving innovation across multiple vectors to realize significant performance and total cost of ownership advances. Functions as the xgroup decision maker across all architecture disciplines to ensure system design objectives are met.
          On This Day in Math - July 1   

Mathematics, rightly viewed, possesses not only truth, but supreme beauty
a beauty cold and austere, like that of sculpture, 
without appeal to any part of our weaker nature,
without the gorgeous trappings of painting or music, 
yet sublimely pure, and capable of a stern perfection such as only the greatest art can show. 
 The true spirit of delight, the exaltation, 
the sense of being more than Man, 
which is the touchstone of the highest excellence, 
is to be found in mathematics as surely as in poetry.
--BERTRAND RUSSELL,


The 182nd day of the year; there are 182 connected bipartite graphs with 8 vertices. *What's So Special About This Number

The 182nd prime (1091) is the smaller of a pair of twin primes (the 40th pair, actually) *Math Year-Round ‏@MathYearRound(Students might convince themselves that it was not necessary to say it was the smaller of the pair.)

Language time:
182 is called a pronic, promic, or heteromecic and even an oblong number. Pronic Numbers are numbers that are the product of two consecutive integers; 2, 6, 12, 20, ..(doubles of triangular numbers).  Pronic seems to be a misspelling of promic, from the Greek promekes, for rectangular, oblate or oblong. Neither pronic nor promic seems to appear in most modern dictionaries. Richard Guy pointed out to the Hyacinthos newsgroup that pronic had been used by Euler in series one, volume fifteen of his Opera, so the mathematical use of the "n" form has a long history.

Oblong is from the Latin ob (excessive) + longus (long). The word oblong is also commonly used as an alternate name for a rectangle. In his translation of Euclid's "Elements", Sir Thomas Heath translates the Greek word eteromhkes[hetero mekes - literally "different lengths"] in Book one, Definition 22 as oblong. . "Of Quadrilateral figures, a square is that which is both equilateral and right-angled; an oblong that which is right angled but not equilateral...". (note that with this definition, a square is not a subset of rectangles.)


EVENTS

1349 Sometimes, a little astronomical knowledge can be a dangerous thing, even to those who possess it. A tale from medieval England is passed down from the chronicles of the scholar Thomas Bradwardine of a witch who attempted to force her will on the people through knowledge of an impending eclipse. Bradwardine, who had studied astronomical predictions of Arabian astronomers, saw through the ruse, and matched the prediction of the July 01, 1349 A.D. lunar eclipse with a more precise one of his own. No word survives as to the fate of the accused, but one can only suspect banishment or worse.*listosaur.com

1694 Opening of the University of Halle in Germany. Georg Cantor later taught there. *VFR

1770 – Lexell's Comet passed closer to the Earth than any other comet in recorded history, approaching to a distance of 0.0146 a.u. *OnThisDay & Facts ‏@NotableHistory discovered by astronomer Charles Messier

1798 Napoleon’s fleet reached Alexandria, bearing Monge and Fourier.*VFR

1819 William George Horner’s (1786–1837) method of solving equations is presented to the Royal Society.*VFR In numerical analysis, the Horner scheme (also known as Horner algorithm), named after William George Horner, is an algorithm for the efficient evaluation of polynomials in monomial form. Horner's method describes a manual process by which one may approximate the roots of a polynomial equation. The Horner scheme can also be viewed as a fast algorithm for dividing a polynomial by a linear polynomial with Ruffini's rule. Student's often learn this process as synthetic division.  *Wik

1847 The United States issued its first two postage stamps. They pictured Benjamin Franklin and George Washington respectively [Scott #1-2]. *VFR

1852 Dirichlet delivers a memorial lecture at the Berlin Academy in honor of his close friend Jacobi, calling him the greatest member of the Academy since Lagrange. *VFR

1856 Weierstrass appointed Professor of Mathematics at the Royal Polytechnic School in Berlin. *VFR

In 1858, the Wallace-Darwin theory of evolution was first published at the Linnaean Society in London*. The previous month Charles Darwin received a letter from Alfred Wallace, who was collecting specimens in the East Indies. Wallace had independently developed a theory of natural selection - which was almost identical to Darwin's. The letter asked Darwin to evaluate the theory, and if worthy of publication, to forward the manuscript to Charles Lyell. Darwin did so, almost giving up his clear priority for he had not yet published his masterwork The Origin of Species. Neither Darwin nor Wallace were present for the oral presentation at the Linnaean Society, where geologist Charles Lyell and botanist Joseph Hooker presented both Wallace's paper and excerpts from Darwin's unpublished 1844 essay.*TIS
In his annual report the following May, society president Thomas Bell wrote, “The year which has passed has not, indeed, been marked by any of those striking discoveries which at once revolutionize, so to speak, the department of science on which they bear.” *Futility Closet

1873 From a letter dated July 1, 1873, in the Coast Survey files in the National Archives in Washington. Peirce writes, "Newcomb, in a paper .... says he finds that pendulums hung by springs twist and untwist as they oscillate and says this will affect the time of oscillation."The Charles S. Peirce-Simon Newcomb Correspondence by Carolyn Eisele.

1894 The New York Mathematical Society changed its name to the American Mathematical Society to reflect its national charter. [AMS Semicentennial Publications, vol. 1, p. 74]. *VFR

1908 International agreement to use SOS for distress signal signed. An International Radiotelegraphic Convention, ... met in Berlin in 1906. This body signed an international agreement on November 3, 1906, with an effective date of July 1, 1908. An extensive collection of Service Regulations was included to supplement the Convention, and in particular Article XVI adopted Germany's Notzeichen distress signal as the international standard, stating: "Ships in distress shall use the following signal: · · · — — — · · · repeated at brief intervals". *Citizens Compendium

1918 Florian Cajori (1859–1930) appointed professor of the history of mathematics at the University of California, Berkeley, one of the few such chairs in the the world. During the next twelve years he published 159 papers on the history of mathematics. *VFR

1948 The Bell System Technical Journal publishes the first part of Claude Shannon's "A Mathematical Theory of Communication", regarded as a foundation of information theory, introducing the concept of Shannon entropy and adopting the term Bit. *Wik

1964 The New York Times, in a full page ad, announced that Paul Newman and Joanne Woodward would play a game on an elliptical pool table. It had a pocket at one focus so that if the ball passed over the other focus it would bank off the rail into the pocket. [UMAP Journal, 4(1983), p. 176; Recreational Mathematics Magazine, no. 14, January-February 1964] *VFR

1980 A method of trisecting any given acute angle Origami is demonstrated. Hisashi Abe invented this idea and published in July, 1980 edition of the Japanese journal "Suugaku Seminar"(Mathematics Seminar). For this method, and more ways to trisect the angle, see this post.
*Takaya Iwamoto

2001 The last occurrence that there were 3 eclipses in one month, and of which two solar eclipses. For July 2000 being on 1st a partial solar eclipse, 16th a total lunar eclipse, and 31st a partial solar eclipse. The next occurrence with a month with 3 eclipses will be December 2206 with a partial solar eclipse on 1st and 30th and a total lunar eclipse on 16th. Ref. Fred Espenak 06/00 SEML. *NSEC

2010 Grigori Yakovlevich Perelman turned down the Clay Millineum prize of one million dollars, saying that he considers his contribution to proving the Poincaré conjecture to be no greater than that of Richard Hamilton, who introduced the theory of Ricci flow with the aim of attacking the geometrization conjecture. On March 18 It had been announced that he had met the criteria to receive the first Clay Millennium Prize for resolution of the Poincaré conjecture. *Wik

2015 Michael Elmhirst Cates, becomes the 19th Lucasian Professor of Mathematic at the University of Cambridge. Professor Cates is a physicist and Professor of Natural Philosophy and Royal Society Research Professor at the University of Edinburgh. Previous recognitions for Prof. Cates include Maxwell Medal and Prize (1991), the Paul Dirac Medal and Prize (2009), and the Weissenberg Award (2013). He will assume the chair from another Physicist, Michael Green. He follows a line that began with Isaac Barrow and Isaac Newton and includes Charles Babbage, Paul Dirac, and Stephen Hawking


BIRTHS

1646 Gottfried Wilhelm Leibniz (July 1, 1646 – November 14, 1716) born in Leipzig, Germany. Leibniz occupies a prominent place in the history of mathematics and the history of philosophy. He developed the infinitesimal calculus independently of Isaac Newton, and Leibniz's mathematical notation has been widely used ever since it was published. He became one of the most prolific inventors in the field of mechanical calculators. While working on adding automatic multiplication and division to Pascal's calculator, he was the first to describe a pinwheel calculator in 1685[4] and invented the Leibniz wheel, used in the arithmometer, the first mass-produced mechanical calculator. He also refined the binary number system, which is at the foundation of virtually all digital computers. In philosophy, Leibniz is mostly noted for his optimism, e.g. his conclusion that our Universe is, in a restricted sense, the best possible one that God could have created. Leibniz, along with René Descartes and Baruch Spinoza, was one of the three great 17th century advocates of rationalism. The work of Leibniz anticipated modern logic and analytic philosophy, but his philosophy also looks back to the scholastic tradition, in which conclusions are produced by applying reason to first principles or a priori definitions rather than to empirical evidence. Leibniz made major contributions to physics and technology, and anticipated notions that surfaced much later in biology, medicine, geology, probability theory, psychology, linguistics, and information science. He wrote works on politics, law, ethics, theology, history, philosophy, and philology. Leibniz's contributions to this vast array of subjects were scattered in various learned journals, in tens of thousands of letters, and in unpublished manuscripts. As of 2010, there is no complete gathering of the writings of Leibniz.*Wik

1779 John Farrar (July 1, 1779 – May 8, 1853) born at Lincoln, Massachusetts. As Hollis professor of mathematics and natural philosophy at Harvard, he was responsible for a sweeping modernization of the science and mathematics curriculum, including the change from Newton’s to Leibniz’s notation for the calculus. *VFR

1788 Jean Victor Poncelet (July 1, 1788 – December 22, 1867) born in Metz, France. He taught engineering and mechanics, but had a hobby of much greater interest—projective geometry. *VFR French mathematician and engineer whose study of the pole and polar lines associated with conic led to the principle of duality. While serving as an engineer in Napoleon's 1812 Russian campaign as an engineer, he was left for dead at Krasnoy, but then captured. During his imprisonment he studied projective geometry and wrote a treatise on analytic geometry. Released in 1814, he returned to France, and in 1822 published Traité des propriétés projectives des figures in which he presented his fundamental ideas of projective geometry such as the cross-ratio, perspective, involution and the circular points at infinity. As a professor of mechanics (1825-35), he applied mechanics to improve waterwheels and was able to double their efficiency.*TIS

1848 Emil Weyr (1 July 1848 in Prague, Bohemia (now Czech Republic) - 25 Jan 1894 in Vienna, Austria) His father Frantisek Weyr, was a professor of mathematics at a realschule (secondary school) in Prague from 1855. Emil was four years older than his brother Eduard Weyr who also became a famous mathematician. Emil attended the realschule in Prague where his father taught, then studied at the Prague Polytechnic from 1865 to 1868 where he was taught geometry by Vilém Fiedler.
He studied in Italy with Cremona and Casorati during the academic year 1870-71 returning to Prague where he continued to teach. In 1872 he was elected to be Head of the Union of Czech Mathematicians and Physicists. In 1875 he was appointed as professor of mathematics at the University of Vienna. He, together with his brother Eduard Weyr, were the main members of the Austrian geometric school. They were interested in descriptive geometry, then in projective geometry and their interests turned towards algebraic and synthetic methods in geometry. Among many works Emil Weyr published were Die Elemente der projectivischen Geometrie and Über die Geometrie der alten Aegypter.
Emil Weyr led the geometry school in Vienna throughout the 1880's up until his death. Together with Gustav von Escherich, Emil Weyr founded the important mathematical journal Monatshefte fuer Mathematik und Physik in 1890. The first volumes of the journal contain papers written by his brother Eduard. In 1891 Emil Weyr became one of the first 19 founder members of the Royal Czech Academy of Sciences. *SAU

1906 Jean Dieudonn´e (1 July 1906 – 29 November 1992) born. *VFR French mathematician and educator known for his writings on abstract algebra, functional analysis, topology, and his theory of Lie groups. Dieudonné was one of the two main contributors to the Bourbaki series of texts. He began his mathematical career working on the analysis of polynomials. He worked in a wide variety of mathematical areas including general topology, topological vector spaces, algebraic geometry, invariant theory and the classical groups. *TIS



DEATHS


1957 Donald McIntosh (Banffshire, 13 January 1868 – Invernesshire, 1 July 1957) graduated from the University of Aberdeen and taught at George Watson's Ladies College in Edinburgh. He was appointed a Director of Education. He became Secretary of the EMS in 1899 and President in 1905. *SAU

1963 Bevan Braithwaite Baker (1890 in Edinburgh, Scotland - 1 July 1963 in Edinburgh, Scotland) graduated from University College London. After service in World War I he became a lecturer at Edinburgh University and was Secretary of the EMS from 1921 to 1923. He left to become Professor at Royal Holloway College London. *SAU

1971 Sir William Lawrence Bragg (31 Mar 1890; 1 Jul 1971 at age 81) was an Australian-English physicist and X-ray crystallographer who at the early age of 25, shared the Nobel Prize for Physics in 1915 (with his father, Sir William Bragg). Lawrence Bragg formulated the Bragg law of X-ray diffraction, which is basic for the determination of crystal structure: nλ = 2dsinθ which relates the wavelength of x-rays, λ, the angle of incidence on a crystal, θ, and the spacing of crystal planes, d, for x-ray diffraction, where n is an integer (1, 2, 3, etc.). Together, the Braggs worked out the crystal structures of a number of substances. Early in this work, they showed that sodium chloride does not have individual molecules in the solid, but is an array of sodium and chloride ions. *TIS

1983 Richard Buckminster Fuller (July 12, 1895 – July 1, 1983) was a U.S. engineer and architect who developed the geodesic dome, the only large dome that can be set directly on the ground as a complete structure, and the only practical kind of building that has no limiting dimensions (i.e., beyond which the structural strength must be insufficient). Fuller also invented a wide range of other paradigm-shifting machines and structural systems. He was especially interested in high-strength-to-weight designs, with a maximum of utility for minimum of material. His designs and engineering philosophy are part of the foundation of contemporary high-tech design aesthetics. He held over 2000 patents.*TIS
This is another one who died within two weeks of his date of birth. I must organize data on this...



Credits :
*CHM=Computer History Museum
*FFF=Kane, Famous First Facts
*NSEC= NASA Solar Eclipse Calendar
*RMAT= The Renaissance Mathematicus, Thony Christie
*SAU=St Andrews Univ. Math History
*TIA = Today in Astronomy
*TIS= Today in Science History
*VFR = V Frederick Rickey, USMA
*Wik = Wikipedia
*WM = Women of Mathematics, Grinstein & Campbell
          Sebastian Pölsterl: Announcing scikit-survival – a Python library for survival analysis build on top of scikit-learn   

I've meant to do this release for quite a while now and last week I finally had some time to package everything and update the dependencies. scikit-survival contains the majority of code I developed during my Ph.D.

About Survival Analysis

Survival analysis – also referred to as reliability analysis in engineering – refers to type of problem in statistics where the objective is to establish a connections between a set of measurements (often called features or covariates) and the time to an event. The name survival analysis originates from clinical research: in many clinical studies, one is interested in predicting the time to death, i.e., survival. Broadly speaking, survival analysis is a type of regression problem (one wants to predict a continuous value), but with a twist. Consider a clinical study, which investigates coronary heart disease and has been carried out over a 1 year period as in the figure below.

Patient A was lost to follow-up after three months with no recorded cardiovascular event, patient B experienced an event four and a half months after enrollment, patient D withdrew from the study two months after enrollment, and patient E did not experience any event before the study ended. Consequently, the exact time of a cardiovascular event could only be recorded for patients B and C; their records are uncensored. For the remaining patients it is unknown whether they did or did not experience an event after termination of the study. The only valid information that is available for patients A, D, and E is that they were event-free up to their last follow-up. Therefore, their records are censored.

Formally, each patient record consists of a set of covariates $x \in \mathbb{R}^d$ , and the time $t > 0$ when an event occurred or the time $c > 0$ of censoring. Since censoring and experiencing and event are mutually exclusive, it is common to define an event indicator $\delta \in \{0; 1\}$ and the observable survival time $y > 0$. The observable time $y$ of a right censored sample is defined as
\[ y = \min(t, c) =
\begin{cases}
t & \text{if } \delta = 1 , \\
c & \text{if } \delta = 0 ,
\end{cases}
\]

What is scikit-survival?

Recently, many methods from machine learning have been adapted for these kind of problems: random forest, gradient boosting, and support vector machine, many of which are only available for R, but not Python. Some of the traditional models are part of lifelines or statsmodels, but none of those libraries plays nice with scikit-learn, which is the quasi-standard machine learning framework for Python.

This is exactly where scikit-survival comes in. Models implemented in scikit-survival follow the scikit-learn interfaces. Thus, it is possible to use PCA from scikit-learn for dimensionality reduction and feed the low-dimensional representation to a survival model from scikit-survival, or cross-validate a survival model using the classes from scikit-learn. You can see an example of the latter in this notebook.

Download and Install

The source code is available at GitHub and can be installed via Anaconda (currently only for Linux) or pip.

conda install -c sebp scikit-survival

pip install scikit-survival

The API documentation is available here and scikit-survival ships with a couple of sample datasets from the medical domain to get you started.


          Sebastian Pölsterl: Announcing scikit-survival – a Python library for survival analysis build on top of scikit-learn   

I've meant to do this release for quite a while now and last week I finally had some time to package everything and update the dependencies. scikit-survival contains the majority of code I developed during my Ph.D.

About Survival Analysis

Survival analysis – also referred to as reliability analysis in engineering – refers to type of problem in statistics where the objective is to establish a connections between a set of measurements (often called features or covariates) and the time to an event. The name survival analysis originates from clinical research: in many clinical studies, one is interested in predicting the time to death, i.e., survival. Broadly speaking, survival analysis is a type of regression problem (one wants to predict a continuous value), but with a twist. Consider a clinical study, which investigates coronary heart disease and has been carried out over a 1 year period as in the figure below.

Patient A was lost to follow-up after three months with no recorded cardiovascular event, patient B experienced an event four and a half months after enrollment, patient D withdrew from the study two months after enrollment, and patient E did not experience any event before the study ended. Consequently, the exact time of a cardiovascular event could only be recorded for patients B and C; their records are uncensored. For the remaining patients it is unknown whether they did or did not experience an event after termination of the study. The only valid information that is available for patients A, D, and E is that they were event-free up to their last follow-up. Therefore, their records are censored.

Formally, each patient record consists of a set of covariates $x \in \mathbb{R}^d$ , and the time $t > 0$ when an event occurred or the time $c > 0$ of censoring. Since censoring and experiencing and event are mutually exclusive, it is common to define an event indicator $\delta \in \{0; 1\}$ and the observable survival time $y > 0$. The observable time $y$ of a right censored sample is defined as
\[ y = \min(t, c) =
\begin{cases}
t & \text{if } \delta = 1 , \\
c & \text{if } \delta = 0 ,
\end{cases}
\]

What is scikit-survival?

Recently, many methods from machine learning have been adapted for these kind of problems: random forest, gradient boosting, and support vector machine, many of which are only available for R, but not Python. Some of the traditional models are part of lifelines or statsmodels, but none of those libraries plays nice with scikit-learn, which is the quasi-standard machine learning framework for Python.

This is exactly where scikit-survival comes in. Models implemented in scikit-survival follow the scikit-learn interfaces. Thus, it is possible to use PCA from scikit-learn for dimensionality reduction and feed the low-dimensional representation to a survival model from scikit-survival, or cross-validate a survival model using the classes from scikit-learn. You can see an example of the latter in this notebook.

Download and Install

The source code is available at GitHub and can be installed via Anaconda (currently only for Linux) or pip.

conda install -c sebp scikit-survival

pip install scikit-survival

The API documentation is available here and scikit-survival ships with a couple of sample datasets from the medical domain to get you started.


          Veicoli industriali: Aventics acquisisce Vector Horizon Technology   
Con l’acquisizione di Vector Horizon Technology, azienda americana leader nella meccatronica avanzata applicata al settore dei veicoli industriali e dei grandi motori, Aventics espande il proprio business oltre la pneumatica, rafforzando la sua posizione nel business globale dei veicoli commerciali con l’obiettivo di rispondere al meglio alle esigenze di un mercato in costante evoluzione. Vector […]

L'articolo Veicoli industriali: Aventics acquisisce Vector Horizon Technology sembra essere il primo su Automazione News.


          The Earth is Flat: Implementing A Concatenative Language in Gazelle   
flat-in-gazelle-pt-01

The Earth is Flat

(Edit: I forgot to explain how to install and set up Gazelle. Please see my previous post to that effect.)
Hi everyone - work at my startup, Agri-Esprit, has been brisk lately but I've nevertheless made some progress on Gazelle. I am getting very close to porting Gazelle into itself, which will me a major milestone for the language. The layer which handles modules and macro-expansion is still a bit messy, but at this stage a complete rewrite in Gazelle itself is the better refactoring strategy. Plus, I don't want to accumulate any more macro-expansion code in the standard libraries, because that all needs a serious rewrite, as it is written in Emacs Lisp.
But, to whet your appetites and to exercise Gazelle a bit in preparation2, I thought I would write a multi-part series about building a tiny concatenative language using Gazelle. This language will be called flat, because concatenative code is at least superficially flat2.

The Semantics of Flat

Flat programs look like this:
3 3 +
Which results in 3.
[add-one 1 +] define-word
Which defines a word, which is the flat version of a function, which adds one to a value.
10 add-one message
Which calls that word.

10 my-words:times-3

looks up the word times-3 in the package my-words and calls it on 10.
flat, like most concatenative languages, operates with respect to a stack3 (two, actually) and the above programs can't be understood without reference to it. The first program pushes 3 onto the stack twice and then adds the result. The second program pushes a quotation onto the stack and then uses it to define a new word, and the third pushes 10 onto the stack and calls the word.
flat is a homoiconic language. Which is to say that a flat program is itself a piece of data that can be manipulated by stack and, given that flat lives in Javascript, via Gazelle, flat programs are also Javascript objects. But what sort of objects?

Representing Flat Programs

A flat program is a Javascript array. Furthermore, it is a Javascript array which contains any of the following:
literal numbers
that is, things denoted by 10, 13, 33.2 and so on
literal strings
that is, `test flight`, `pancakes`, "swords"
symbols
of which more later
keywords
ditto
and
flat programs
that is, things which satisfy this definition.
The two literal types, strings and numbers, and the flat programs themselves are rather transparently represented by the equivalent Javascript objects. Only symbols and keywords require elaboration.
symbols and keywords are roughly similar to the objects in Common Lisp which share their names4. That is, symbols will be used to denote things and keywords will be used to denote themselves. Further elaborating, symbols will eventually be resolved into words during interpretation of flat programs, while keywords will provide a convenient way to refer to a set of objects which have no role but to denote themselves.
How might we implement these objects using Gazelle?

Unambitiously

Gazelle provides some tiny wrappers over a pretty standard Javascript class system, so we could implement our symbols and keywords thusly:

(module
 (("hooves/hooves" :all)
  ("hooves/class-utils" :all))

 (define-class+ keyword Object
   (name)
   (this.set-name name)
   this)

 (define-method keyword set-name (name)
   (if (string? name)
       (set! this.name name)
     (throw (new Error "Keywords can only have names which are strings."))))

 (define-method keyword get-name ()
   (this.name))

 (define-class+ symbol Object
   (name :- (opt package undefined))
   (this.set-name name)
   (this.set-package package)
   this)

 (define-method symbol set-name (name)
   (if (string? name)
       (set! this.name name)
     (throw (new Error "Symbols can only have names which are strings."))))

 (define-method symbol set-package (name)
   (if (|| (string? name)
           (undefined? name))
       (set! this.package name)
     (throw (new Error "Symbols only have package names which are undefined or strings."))))

 (define-method symbol get-name ()
   (this.name))

 (define-method symbol get-package ()
   (this.package)))

More Ambitiously

However, this is somewhat underambitious, in my opinion. I'm interested in eventually letting people construct flat programs using a DOM based graphical user interface. As a consequence, I'm building the entire flat system on top of the Maria Model View Controller framework. I've used Maria for a lot of things lately, and so I've built a nice set of wrappers based on the underlying Javascript framework. The above class definitions look like this, using Gazelle's maria+ library:

(module
 (("hooves/hooves" :all)
  ("maria+/maria+" :all))

 (define-maria-model+ keyword-model
   maria.Model
   (external-properties name)
   (constructor (name)
                (this.set-name name)
                this))

 (define-maria-model+ symbol-model
   maria.Model
   (external-properties package name)
   (constructor (name :- (opt package undefined))
                (this.set-package package)
                (this.set-name name)
                this)))

You'll note this is much more succinct definition. The framework's define-maria-model macros automatically define getters and setters for properties which are listed in the external-properties sub-form of the class definition5.
One creates symbols and keywords in Gazelle/Javascript with new:

...
(var s1 (new symbol-model "some-name" "some-package"))
(var k1 (new keyword-model "some-keyword-name"))

So far, so easy. The entire reason we want to implement symbols and keywords is because Javascript has no convenient representation of identifiers that we can piggyback on while writing new languages. So it isn't really enough just to have models that denote symbols and keywords, we need to have a succinct way of indicating that we want to construct symbols. That is, we want to write somewhere something like:

a b c 10 11 +

and have it denote the Javascript/Gazelle object:

[:
 (new symbol-model "a")
 (new symbol-model "b")
 (new symbol-model "c")
 10
 11
 (new symbol-model "+")]

Denoting flat programs at Compile/Transcode Time

Easy things first. If we are satisfied with denoting all of our flat programs statically, then we can use the macro-expansion environment, that is Emacs Lisp, and its representation of symbols and keywords, and a macro, to translate something like (program a b +) into [: (new symbol-model "a") (new symbol-model "b") (new symbol-model "+")]
This is easy using a Gazelle macro:

 (define-macro+ program ((tail terms))
   (let ((-keyword `(from "flat/flat" keyword-model))
         (-symbol `(from "flat/flat" symbol-model)))
     (coerce
      (cons : (loop for term in terms collect
                    (match term
                           ((or (string item)
                                (number item))
                            item)
                           ((keyword k)
                            `(new ,-keyword ,(substring (symbol-name k) 1)))
                           ((symbol (funcall #'symbol-name name))
                            (let ((parts (split-string name ":")))
                              (match parts
                                     ((list package-name name)
                                      `(new ,-symbol ,name ,package-name))
                                     ((list name)
                                      `(new ,-symbol ,name)))))
                           ((p #'vectorp v)
                            `(program ,@(coerce v 'list))))))
      'vector)))

Here we define an external macro named locally program, which loops through its body, bound to terms by the pattern matching expression that constitutes macro arguments in Gazelle, and checks the type of each thing, expanding it to the proper Gazelle expression. Note here that we bind local versions of -keyword and -symbol because we want our macro to expand to the versions of these values which are bound in this package, not in the macro-expansion environment. The only slightly tricky aspect is that we have to choose a representation for the user to enter package qualified symbols, package:symbol, which expands to a new symbol-model with a name and package argument.
Note that it is possible in flat, apparently, to have symbols which are in no package and that these symbols are not keywords. They do have a special meaning, however, of which more later.

Denoting flat programs at Run Time

We'd like flat to be liberated from the Emacs Lisp/Gazelle environment. One good reason for this is that it could then be easily used by Javascript programmers who are not using Gazelle. Gazelle does aim to be a good citizen of the Javascript ecosystem, after all.
However, if we want to make using flat at run time, when the macro-expansion and Lisp reader are fond, but distant, memories, then we need to implement a flat reader. This is excellent practice for eventually implementing a Lisp reader, which must, after all, read symbols, numbers, and sub-expressions.

Parsing!

Javascript is a sad place for a Lisp to live, since it lacks a good, simple programmatic representation of source code and a reader to translate text to this representation. These two things are a major benefit of Lisp, but even Lisp's simple syntax isn't so easy to write a parser for. As we'll see, even flat, which is simpler than Lisp in a lot of ways, presents a modest task when it comes to parsing.
Luckily, I have a method of writing parsers which I feel makes them easy to denote, test and use: a parsing monad.
During the creation of flat, I also constructed a an implementation of monadic parsers and a variety of parser combinators called parseltonge, since it constitutes a domain specific language for parsers.
I want to go into the implementation of parseltongue because otherwise the parser for flat will seem like magic and because parseltongue constitutes a particularly nice example of why I programmed Gazelle. It enables access to abstractions which would otherwise be impossible in Javascript.

Parsers

At the heart of parseltongue is the notion of a parser. A parser is a just a function which accepts an input and produces either a Success, of which more later, which contains the result of the parser and the new input state (monadic parsers are purely functional), or a Failure, in which case a reason of some kind is enclosed6.

Success and Failure

Parsers either succeed or fail, and so we provide an abstract representation of this condition that we can easily construct and pattern match against. Success and Failure are represented by Javascript classes called Success* and Failure*. They have constructors that one can use without new called Success and Failure and custom pattern matchers called Success and Failure, so that pattern matching and construction of instance is symmetric.
Here is how we define this range of things:

 (define-class+ Success* Object (value)
   (set! this.value value)
   this)

 (define+ (Success val)
   (new Success* val))

 (define-class+ Failure* Object (reason)
   (set! this.reason reason)
   this)

 (define+ (Failure reason)
   (new Failure* reason))

 (define-pattern+ Success (value-pattern)
   `(instance (from "parseltongue/parseltongue" Success*)
              { value ,value-pattern}))

 (define-pattern+ Failure (reason-pattern)
   `(instance (from "parseltongue/parseltongue" Failure*)
              { reason ,reason-pattern}))

Now we can say something like:

(define (maybe-first-character string)
 (if (< string.length 1)
   (Failure "String too small.")
  (Success [string 0])))

(match (maybe-first-character "something")
  ((Success val) val)
  ((Failure reason) (throw (new Error reason))))

Of course in this case, it hardly affords us anything more that using throw, try, and catch. But I find this strategy is easier to understand when you want to handle unusual circumstances and/or combine and enhance error messages, or even resume a computation.

The parser state

To efficiently represent the state of a parser, we implement the following class:

(define-class+ Parse-State Object (string :- (opt cursor 0))
   (set! this.string string)
   (set! this.cursor cursor))

 (define-method Parse-State head ()
   [this.string this.cursor])

 (define-method Parse-State rest ()
   (if (< this.cursor this.string.length)
       (new Parse-State this.string (_+ this.cursor 1))
     this))

 (define-method Parse-State nth-rest-unsafe (n)
   (new Parse-State this.string (_+ this.cursor n)))

 (define-method Parse-State parsed ()
   (this.string.substring 0 this.cursor))

 (define-method Parse-State unparsed ()
   (this.string.substring this.cursor this.string.length))

 (define-method Parse-State length-left ()
   (_- this.string.length this.cursor))

 (define-method Parse-State take (n)
   (if (< n (this.length-left))
       (Success
        [: (this.string.substring this.cursor
            (_+ this.cursor n))
           (new Parse-State this.string (_+ this.cursor n))])
     (Failure (_+ "Cannot take "
               n " items from "
             (JSON.stringify
               { parsed (this.parsed)
                 unparsed  (this.unparsed)})))))

The main idea here is that we add a cursor to a string, and parsing advances the cursor rather than chopping the string up. This way our parsing doesn't involve the creation and chopping up of a lot of strings. Plus, this way our error messages can describe both the parsed and unparsed part of an input, which sometimes is more informative than just the latter.
So, each of our parsers will take such an object, do something with it, and return either a Failure with a reason or a Success, with a value and a new Parse-State.

Baby's First Parser

Here is a parser:

 (define+ (p-item input)
   (new Success
        [: (input.head) (input.rest)]))

It is handy to keep straight, in one's head, writing parseltongue code, whether a value is a parser or a parser-producer, that is, whether it is a function which is a parser or a function which takes some arguments, possibly parsers, and returns a parser. By convention, then, parsers are prefixed with p- and parser producers are prefixed, rather uncreatively, with pp-, which is a bit ugly but helps keep one's thinking straight.
We can use the above parser to write new parser that only parses the letter "a" in the following way:

 (define+ (p-a input)
  (match (p-item input)
    ((and success (Success [: "a" rest]))
     (comment "The pattern matching ensures that only `a` matches.")
     success)
    ((instance Failure* failure)
     (comment "Given that p-item doesn't appear to ever fail, this
  shouldn't really happen.")
     failure)))

(7)
Here we are using the pattern matcher to assert that we only match against a Successful parse of an item which, furthermore, must be the string "a". This is the great utility of pattern matching in Gazelle: extremely succinct and expressive denotations of program flow.
One can write parsers in this style, but one rapidly encounters bottlenecks that require lots of code to perform simple parsings. For instance, suppose we want to parse "[", then "a" or "b" then "]". To write such a parser by hand, in the style above, is cumbersome. We can write it in parseltongue quite simply:

 (define+ p-bracketed-a
  (parser
    (pp-str "["))
    (:bind character (pp-or (pp-str "a")
                            (pp-str "b")))
    (pp-str "]")
    (pp-return character))

(8)
But how does this work?

Magical Macros

If you haven't already guessed, it is quite difficult to expose the functionality above in pure Javascript because parser, which is a Gazelle macro, performs meta-programmatic transformations which are difficult to simulate using the usual tricks Javascript allows for meta-programming9.
However, underlying the macro magic is one function, called pp-bind, since it produces a parser, which accepts two arguments: a parser and a function which accepts a value of some kind and returns a new parser. pp-bind allows the programmer to create a new parser which expresses a chain between the value parsed by the first parser and the subsequent parsing behavior. Here is the implementation from parseltongue:

 (define+ (pp-bind mv mf)
   (lambda (input)
     (match (mv input)
      ((Success [: rval new-input])
       ((mf rval) new-input))
      ((Failure reason)
       (Failure
        (_+ "Parse failed with reason: " reason ", parse state: "
        (JSON.stringify { parsed (input.parsed)
            unparsed  (input.unparsed)})))))))

If you've thought about monads a lot, this is a fairly straightforward implementation of bind for parsers10. The function returns a closure over the values passed in, mv here is the parser, or the monadic value, and mf is the function which returns a new parser, or the monadic-function. The parser is applied to the input of the anonymous function, the value is extracted with a pattern match, and then that value is passed to mf, which results in a new parser, which is passed the input. Hence, mf can represent a block of code which constructs the next parser in a chain depending on the result of a previous parser.
This function is called pp-bind because it represents an extension of the programming-language level notion of binding. That is, mf, which is a function of a single argument, represents a value dependent on a variable which is unbound (denoted by the argument to the function), and pp-bind modifies the behavior of a standard function application by changing the process that relates expressions to bindings in such an expression.
The macro parser just makes chaining many pp-binds easier. Here is what it looks like:

 (define-macro+ parser ((tail body))
   (let ((pp-bind `(from "parseltongue/parseltongue" pp-bind))
         (pp-return `(from "parseltongue/parseltongue" pp-return))
         (pp-and `(from "parseltongue/parseltongue" pp-and)))
     (match body
            ((list* (list :bind pattern expr) body0 body)
             `(,pp-bind ,expr
                        (lambda (,pattern)
                          (parser ,body0 ,@body))))
            ((list* (list :let pattern expr) body0 body)
             `(_let ((,pattern ,expr))
                    `(,pp-bind ,body0 ,@body)))
            ((list (list* :aside aside-body) body0 body)
             `(progn ,@aside-body
                     (,pp-bind ,body0 ,@body)))
            ((list* expr body0 body)
             `(,pp-and ,expr
                      (parser ,body0 ,@body)))
            ((list expr)
             expr))))

The body of a parser consists of either
  • expressions which evaluate to parsers
  • :bind expressions, which bind a variables via pattern matching to the values produced by a parser
  • :let expressions, which bind values via patterns using regular binding semantics
or
  • :aside expressions, which just evaluate code but don't insert or bind things (useful for debugging)
:bind expressions just expand to calls to pp-bind which pass the expression on the rhs of the expression through pp-bind to a function which takes one argument and matches it, and then performs the rest of the pp-bind. As such, a parser expression always results in a parser.
When an expression which isn't a :bind, :let, or :aside is encountered, it is processed as though through :bind with a hidden variable. It produces no binding, but does pass through pp-bind.
Using parseltongue, it is pretty easy to write naive parsers for flat that we can call at run-time, in the Javascript only environment, to parse a string denoting a flat program in a Javascript representation that is easy to interpret:

The Flat Parser

parseltongue makes this pretty anti-climactic:

 (define+ p-unqualified-symbol
   (parser
    (:bind symbol-name (pp-rx "[-+0-9a-zA-Z-+=*/_~!@$%^&<>{}?]*[-+a-zA-Z-+=*/_~!@$%^&<>{}?]+[-+0-9a-zA-Z-+=*/_~!@$%^&<>{}?]*"))
    (pp-return (new symbol-model symbol-name))))
 (define+ p-qualified-symbol
   (parser
    (:bind symbol-package (pp-rx "[-+0-9a-zA-Z-+=*/_~!@$%^&<>{}?]+"))
    (pp-str ":")
    (:bind symbol-name (pp-rx "[-+0-9a-zA-Z-+=*/_~!@$%^&<>{}?]+"))
    (pp-return (new symbol-model symbol-name symbol-package))))
 (define+ p-keyword
   (parser
    (pp-str ":")
    (:bind keyword-name (pp-rx "[-+0-9a-zA-Z-+=*/_~!@$%^&<>{}?]+"))
    (pp-return (new keyword-model keyword-name))))

 (define+ p-symbol
   (pp-or p-qualified-symbol p-unqualified-symbol))

 (define+ p-program
   (lambda (input)
     (.. (parser
          p-whitespaces
          (:bind result
                 (pp-seq-of-whitespace-separated
                  (pp-or p-keyword p-symbol p-number p-doublequote-string p-singlequote-string
                         (parser
                          (pp-str "[")
                          (:bind program p-program)
                          (pp-str "]")
                          (pp-return program)))))
          p-whitespaces
          (pp-return result))
         (call this input))))

The only wrinkle here is that p-program is a recursive parser, so we wrap it into an explicit lambda expression so that the recursive reference to p-program is sure to be defined by the time we actually invoke the code. Note the use of handy parser producers from parseltongue. pp-rx parses anything which matches the regular expression passed in (string denotation only) that also appears at the beginning of the input. pp-str matchers only the indicated string. pp-seq-of-whitespace-separated takes a parser and produces a new parser which parses a sequence of the input parsers, separated by whitespaces. Using these terms, we easily construct a parser for flat, which is just a sequence of literals, symbols or keywords or programs in brackets separated by whitespaces.

Next Time

Next time I'll write the flat interpreter and introduce how I do really dumb unit tests in Gazelle. Until then, I hope this is meaningful to someone out there!


1. The actual origin of flat is I am working on a project where I want an easy to serialize representation of certain kinds of logic, for instance, whether a player is allowed to enter a room given the contents of her inventory.
2. flat is not actually flat because there is special syntax for denoting quotations (the flat equivalent of anonymous functions), for simplicity's sake, and because people find it odd to use a language with words named things like [ and ]. It turns out to be a matter of some esoteric interest and non-trivial complexity to produce a language that is truly flat, but such things, or at least elaborations on such things, exist. See, for instance, The XY Language, which implements a version of itself which is really flat.
3. See Om for a noteworthy counterexample.
4. I've never been entirely happy with the relationship between the things we call symbols in Common Lisp and the things we call Keywords. Indeed, keywords are symbols which reside in the keyword
package and which have the special property that they denote themselves. But this makes writing code over symbols and keywords somewhat cumbersome because one cannot method dispatch between the two things, even though they really do have different meanings.
5. maria+ has lots of fun features that allow you to specify the types of properties such that the setters check them for you. But this is for another blog post.
6. For the egg-heads, parsers return values in a Maybe-like monad.
7. Note that Gazelle supports multiline strings.
8. For those familiar with Haskell do syntax, :bind pattern expr above corresponds to = pattern <- expr = in Haskell.
9. namely using anonymous and higher-order-functions to control evaluation of blocks of code. I have some vague ideas about exposing the interface implied by parser in pure Javascript, but none are satisfactory. If any Javascript wizard out there has any suggestions, do tell.
10. For performance reasons and for simplicity, this parsing monad is deterministic. That is, it is just the state monad, untransformed by the multiple options monad transformer. See Drew Crampsie's SMUG or my kind of undermaintained Parseltongue (both for Common Lisp) for non-deterministic parsers. The primary reason I did not make Gazelle's parseltongue non-deterministic is because pp-or and pp-zero-or-more are very hard to get right in a non-deterministic context.

          New Gazelle Stuff   

The Select Button game jam is happening this month, and I want to use Gazelle to develop my entry. That means I needed the following features.

Multi-body Functions

define and lambda now support a multi-body syntax so that different patterns can be used to produce different effects. Consider:

(gazelle:essentials)

(define (vocalize [
         (([: :cat name])
          (+ name " says: meow"))
         (([: :dog name])
          (+ name " says: woof"))
        ]))

Then,

(vocalize [: :cat "Garfield"])

evaluates to:

"Garfield says: meow"

While

(vocalize [: :dog "Bowzer"])

to

"Bowzer says: woof"

The syntax is:

(define [(<argument-pattern1> body10 body1 ...)
         (<argument-pattern2> body20 body2 ...)
         ...])

Where each <argument-pattern> is a shadchen-style, array pattern with the array head removed.

Simple function definitions are still supported. I don't want to show the generated code because the pattern matcher generates large nested structures. I'm working on it, although some optimizations are in place for simple situations, like vectors of symbols with a symbol tail, etc. It should be possible to write a flat pattern matcher, but that is some work.

Macros support a similar interface. eg:

(define-macro let* [((nil (tail body)) (progn ,@body)) (((list (list symbol value) (tail binders)) (tail body)) (let ((,symbol ,value)) (let* ,binders ,@body)))])

Is an implementation of a let* like macro.

Self Recursion in Functions

Functions can recur to themselves using recur in tail positions. It is, at the moment, an unchecked error if recur occurs somewhere else. Given the underlying language implementation, it might be hard to check this statically. One can write filter like this, then:

(define (filter [
         ((fun [:] acc)
          acc)
         ((fun [: hd (tail tl)] acc)
          (if (fun hd)
              (recur fun tl (acc.concat [: hd]))
              (recur fun tl acc)))
          ]))

This sort of mock recursion doesn't grow the stack. Cute.

Changes to the define syntax apply to define+ as well.

I really need to use git more responsibly, all these changes, including lots of regressions, have been happening on the master branch, frequently updated on github. Sorry!


          More Updates to Shadchen   

Since I created Shadchen, I've been lucky enough that the following, sometimes related, things have happened:

  1. I got a job programming in Common Lisp full time.
  2. I got married.
  3. I am/will be moving to France.

Understandably, this has resulted in a significant decrease in the frequency with which I have written things for this blog. Sorry - if anyone was itching for updates.

Shadchen News

Shadchen is a pattern matching library which I've been developing simultaneously in Emacs and Common Lisp - an interesting experience. Shadchen has been a big hit at my new company, and you might imagine that this would mean that the Common Lisp version of the library would be developing rapidly while the Emacs Lisp version would struggle to catch up. This turns out not to be the case for business process reasons: developing shadchen.lisp is now "work" and so must compete with other work related responsibilities, whereas shadchen.el primarily subserves my personal projects, many of which still live in Emacs Lisp.

So, defun-match

As a consequence, it has long been possible to write:

(defun-match- product ((list (tail tl)))
 (recur tl 1))
(defun-match product ((list) acc)
 acc)
(defun-match product ((list (must-match (number hd)) (tail tl)) acc)
 (recur tl (* acc hd)))

Using shadchen.el, to define a dynamically type checked tail recursive product function. In fact, this system has been torn down and rebuilt at least once in shadchen.el but never appeared in Common Lisp's version of the library1.

I've finally gotten around to implementing some of these new features in shadchen.lisp. Because most (all?) Common Lisp implementations support tail call optimization in some form, and because supporting recur in Emacs Lisp Shadchen is a considerably complex problem, shadchen.lisp depends on the implementation's recursion, so the above would be written:

(defun-match- product ((list (tail tl)))
 (product tl 1))
(defun-match ((list) acc)
 acc)
(defun-match product 
  ((list (must-match (number hd)) (tail tl))
    acc)
 (product tl (* acc hd)))

New Patterns

In both Emacs Lisp and Common Lisp, one may write a must-match pattern, as either

(must-match ...)

or

(! ...)

Which, when encountered in the course of regular matching produces an error if it fails to match. Generally, this is only useful when you want to ensure that when one particular match succeeds and another fails, that you find out about it immediately. In the above product function, if you pass a list like (1 2 a 3 4) you will get an error to the effect of

"must-match pattern ((number hd)) failed against: a"

Without must-match, the error would be the less informative match failed for product: (list a 3 4) 2 (or something like it).

Sometimes you want an even nicer error message, in which case you can write:

(! (number x) error-value 
   (format nil "product only works on lists of
    numbers, but encountered ~S" error-value))

In this form, if the pattern fails, the failed value is bound to error-value and then the final form is evaluated to produce a value to pass to error, in a lexical context with error-value. You can use any shadchen pattern for error-value but since its an error condition, you usually don't know what to expect.

One can also match against the tail of a list using the list pattern like so:

(list a b c (tail some-tail-pattern))

This is identical to the syntax

(list-rest a b c some-tail-pattern)

Since defun-match argument lists are syntactically identical to a list match, you can use tail to match against the tail the arguments passed in.

Vectors

In the Emacs Lisp version of the library only, you can match against vectors using Emacs Lisp's vector syntax, eg:

(match [1 2 3]
  ([a b c] (list a b c)))

Evaluates to (1 2 3). One can use the tail pattern in a vector to capture the end of a vector, but in that case the tail value will be coerced to a list.

Common Lisp users must match using vector.

Notes

Perhaps not intuitively, I think of shadchen.el as significantly better stress tested than shadchen.lisp. This has to do with the fact that I've used the Emacs Lisp version to implement several large projects (including this Lisp to Matlab transcoder) and that Emacs Lisp has simpler semantics. In particular, Common Lisp shadchen has some problems with multiple-values, which I am working on resolving.

On the other hand, its much better to have pattern matching than not to have it.

  • The Emacs Lisp shadchen is available here.
  • The Common Lisp shadchen is available here.

1 Another issue is that CLOS and defun-match are not really orthogonal language features, and so it was less necessary and useful to have defun-match in Common Lisp.


          Parenlab Updates!   

Nothing makes software grow like using it every day. I've been doing all my Matlab coding in Parenlab (read about it here and get it here) for the past few weeks and the code base has developed significantly. Now that there is a functioning "require" system its time to document some of the developments.

setq extensions

Matlab is not very functional, whereas Lisp is. In Lisp I've come to see the use of setq as code smell, but its hard to avoid in Matlab. In fact, lots of my Matlab code involves long stretches of assignment. Parenlab lets me escape some of this by allowing more functional idioms, but I decided it would be best to add better support for assignment. To that end, setq can now be written as either:

(setq x 10)

or

(:= x 10)

And can contain an arbitrary number of name/value pairs, eg:

(:= x 10 y 11 z 13)

Setting occurs sequentially, from left to right. Matlab provides the deal function for parallel setting, eg:

(:= [x y z] (deal 10 11 12))

Sets x,y and z "at the same time" with respect to the evaluation environment.

Implicit Single Return Value Functions

Matlab highly encourages functions with multiple return values, and part of that idiom is forcing all returned values from a function, even if there is only one, to have a name. The function interface definition on the first line of a function file, eg:

[a,b,c] = function someFunction(q,r,s)

Specifies the names of the output arguments (a, b, and c, in thsi case), and setting their values in the function body determines how they are returned.

In parenlab, therefore, one writes defuns like this:

(defun (a b c) some-function (q r s) ...)

And in the body, uses setq to assign return values. This is fine, but feels a bit odd coming from Lisp. So now, if you write:

(defun some-function (a b c) ...)

and the last expression in the body of the function is a value producing expression, rather than a statement, parenlab automatically handles assigning a single return value, the last value in the body. That last qualifier about value producing statements is a bit of a drag, since many Matlab and parenlab forms don't produce values, but I am working on resolutions to this issue. Of which more later!

Nested function definitions

At the top level, defun creates a new function in a new .m file, which is the idiom for defining functions in Matlab. Inside functions, however, one can define internal functions using the same defun syntax. These internal functions are not subject to the restrictions of regular anonymous functions: they can have full bodies and side-effect the lexically scoped environments they are created in. Parenlab now supports such nested function definitions and, via this feature, much more functional anonymous functions in this context.

For instance, using the single-return value feature above and this new capability, the following code:

(defun demo-nested (a)
 (defun add-a (b)
  (+ a b)))

transcodes to:

function [o111218] = demoNested(a)
%
o111218 = @addA;

function [o111219] = addA(b)
%
  o111219 = plus(a, b);

  end

end

Inside a function definition, a defun can appear anywhere. It is transcoded as a reference to the function to be defined, which is transcoded at the bottom of the enclosing function, where it can capture the lexical scope. Anonymous functions inside other functions are expanded into defun's rather than @ style anonymous functions, eg we could write instead:

(defun demo-nested (a)
  (lambda (b)
    (+ a b)))

And get the same effect. Parenlab will assign a gensymed name to internal anonymous functions.

Better let, let* and progn support inside functions

Parenlab used to always expand let and its brethren in terms of matlab lambda (@) expressions, which can only contain in their body a single value producing expression, and which capture a static copy of their lexical scope, which forbids side effects. Inside functions, this is no longer the case, and lambda, and all the terms that depend on it, like let and let* now expand into full function calls, which means they can have arbitrary bodies with side effects on their lexical scope.

To remind people of this distinction, lest they be surprised that this doesn't work at top-level, the bodies of lambda expressions and lets still require a progn to express the intent for multiple expressions. Matlab's somewhat onerous restrictions on using value-bearing expressions anywhere a value needs to be still apply, however. You can't say:

(lambda (a)
  (setq b a))

Because setq doesn't have a return value. This turns out not to be something you frequently want to do, but bear it in mind.

require expressions.

Parenlab now allows you to express simple project dependencies via require. For instance, the expression:

(require
"~/src/elisp/parenlab/monadic-parser-combinators.parenlab")

Causes parenlab to transcode the contents of the specified file and add its location to the Matlab path. The file is not executed, however. Parenlab maintains a dictionary of hashes for each require file and only recompiles a file when its been changed since the last invokation for require on it. This means that require statements are cheap, generally, as compilation is only induced when needed.

direct execution of Emacs Lisp

Parenlab macros are defined in Emacs Lisp, rather than in Parenlab itself. Complex macros often require a library of utility functions to do their work. Parenlab lets you define these Elisp functions inline via the elisp form. elisp executes its body in Emacs Lisp during compilation, so you can write:

(elisp 
  (defun valid-bindingp (o)
    (and (listp o)
         (= 2 (length o))
         (symbolp (car o)))))

(defmacro my-with (binding &rest body)
   (assert (valid-bindingp binding)
           () "Binding must be a 2 el list whose car is symbol.")
   `(funcall 
      (lambda 
        (,(car binding)) (progn ,@body)) ,(cadr binding)))

Stupid Language Tricks:

Keywords, which ordinarily transcode to strings, now behave specially if they are in the function location during an application or in a (function :x) form. When this happens, they are transcoded to struct access expressions. So, you can say:

(:x (struct :x 10)) -> 10

Or

(funcall #':x (struct :x 10)) -> 10

I admit, this is a silly feature, but remarkably convenient.

Mostly arbitrary expressions in the function position:

If a non-symbol or non-keyword is encountered in the function position of an expression, it is evaluated and its value is used as a function, which you can't do in Matlab. So:

((lambda (x) (+ x 1)) 10) -> 11

All Sorts of Awesome Standard Macros

There a lots of iteration related macros, for instance forcell

(forcell (index value) cell-array 
         ...)

Takes some of the pain out of working with cell arrays with the Matlab loop feature, which gives you a one element cell array for each value in the array by default. Poke around in the code for other iteration expressions that make life more pleasant.

The macro capture collects the current environment into a struct and returns it as a value. This is handy for debugging functions. There is also now support for try and catch

Extended standard library.

Lots of handy little functions like directory-files, and the like.

Further refinements to parenlab-aux.el

This is still specific to my Matlab setup, but parenlab-aux now does a better job of simulating the Lisp experience. For instance, parenlab-eval-last-sexp now makes an honest attempt to print the result to the mini-buffer if that makes sense. If anyone actually wants to work with parenlab, contact me and I'll help set things up.

Monadic Parser Combinators

Part of my long term plan is to eventually make parenlab self hosting, the largest obstacle to which is a good Lisp reader. I like writing parsers in a monadic style, so now parenlab comes with a parser combinator library, which you can use by saying:

(require
"~/src/elisp/parenlab/monadic-parser-combinators.parenlab")

This builds the library and adds it to the path. You can then write a simple vector parser like this:

(:= =vector
     (parser ((ignore (=>string "["))
              (numbers (=>zero-or-more #'=number))
              (ignore (=>string "]")))
         (cell2mat numbers)))

There is rudimentary support for parsing a subset of Lisp via the =sexpression parser in this library. S-expressions are parsed into nested cell arrays. There isn't support for quotation or sharp quotation yet. And the error messages aren't useful. Might eventually move to a different monad for better error reporting.

Conclusions

Parenlab is definitely a usable Lisp, for me - I'm already a lot more productive in Matlab than I would be in the base language, and I haven't run into any performance issues, though your mileage will vary if you use this with Octave. Please let me know if anyone starts using the library. Criticism, suggestions and contributions are more than welcome!



          Shadchen: A pattern Matching Library for Elisp   

A pattern matching library for Emacs Lisp

One of the things I like most about Racket (and other functional programming languages) is that they have good support for pattern matching, which is a great way to simultaneously dispatch on structure type, enforce constraints on values held in a data structure, and bind variables. A tremendous amount of code is devoted to these activities, and pattern matching combines them all in a succinct, easy to read form.

It's been my intent for some time to write a complete pattern matching library for Emacs Lisp, since it is a Lisp which I use very frequently. Shadchen is the first time any attempt to do so has resulted in a reasonable product. Shadchen is a Yiddish word for matchmaker, in case you were wondering about the title. The library is available in my elisp repository. Even though it comes in a giant directory full of junk, it runs standalone.

[EDIT: Here it is in a standalone repo.]

How it Works

Shadchen's interface consists of just three forms. match is the work horse - it actually performs a pattern match. match has the syntax:

(match <VALUE>
 (<PATTERN1> FORMS ...)
 (<PATTERN2> FORMS ...)
 ...
 (<PATTERNN> FORMS ...))

The <VALUE> expression is evaluated, and then each pattern attempts to match against it. If a pattern succeeds, it's associated FORMS are evaluated, in a context where the environment has been extended by the pattern's bindings. If a match fails, the next pattern is tried. If no patterns succeed, an error occurs.

Here is an example:

(match (list 1 2 3)
  ((list x y z) (+ x y z)))

The expression (list x y z) is the pattern in the above expression. Patterns are such that they resemble the code which creates the data structure in question, in this case a three element list. The pattern (list x y z) basically specifies that a match occurs when the input value is a three element list. When a match occurs, x is bound to the first element, y to the second and so on. Hence this form evaluates to 6.

Here is another example: summing a list:

(defun* dummy-sum (lst &optional (acc 0))
 (match lst
  (nil acc)
  ((cons hd tl)
   (dummy-sum tl (+ acc hd)))))

First we specify the pattern nil, which matches only nil. When the input is nil, we return the accumulator. Then we match against (cons hd tl) which matches a cons pair, binding hd to the car and tl to the cdr. We then recur, adding to the accumulator.

The pattern matching language is rich. There are patterns for matching against literals, applying functions to values, matching against arbitrary conditions, matching against structs.

Eg:

(defstruct a-struct f1 f2)

With this struct defined, the pattern:

(struct a-struct (f1 (? #'numberp x)) (f2 (? #'stringp y)))

Matches only a struct whose field f1 is a number, and whose field f2 is a string. When that is true, x and y are bound.

Extending Shadchen

The pattern matcher is user extensible using defpattern. Defpattern defines a function which receives the pattern's arguments, and returns a new pattern which effects the desired match. For instance, the struct pattern is defined thusly:

(defun cl-struct-prepend (s)
  (intern (format "cl-struct-%s" s)))

(defun make-cl-struct-accessor (struct-name slot) 
  (intern (format "%s-%s" struct-name slot)))


(defpattern struct (struct-name &rest fields)
  `(and
    (? #'vectorp)
    (? #'(lambda (x) (> (length x) 0)))
    (? #'(lambda (o)
           (eq (elt o 0) ',(cl-struct-prepend struct-name))))
    ,@(loop for f in fields collect
            `(funcall 
              #',(make-cl-struct-accessor struct-name (car f))
              ,(cadr f)))))

Note that the defpattern body must return a valid pattern in terms of previously defined patterns (or itself, patterns can be recursive). In this case we use the patterns and, ?, and funcall to create a new matcher.

Supported Patterns:

Shadchen supports the following patterns:

Shadchen supports the following built-in patterns.

<SYMBOL>

Matches anything, binding to that value in the body expressions.

<KEYwORD-LITERAL>

Matches only when the value is the same keyword.

<NUMBER-LITERAL>

Matches only when the value is the same number.

<STRING-LITERAL>

Matches only when the value is string= is the same string.

(CONS <PATTERN1> <PATTERN2>)

Matches any CONS cell, or NIL, then matches <PATTERN1> and <PATTERN2>, executing the body in a context where their matches are bound. If the match value is NIL, then each PATTERN matches against NIL.

(LIST <P1> ... <PN>)

Matches a list of length N, then matches each pattern <PN> to the elements of that list.

(LIST-REST <P1> ... <PN> <REST-PATTERN)

Matches - to elements in at list, as in the LIST pattern. The final <REST-PATTERN> is matched against the rest of the list.

(QUOTE DATUM)

Only succeeds when DATUM is EQUALP to the match-value. Binds no values.

 (AND <P1> .. <PN>)

Tests all <PN> against the same value, succeeding only when all patterns match, and binding all variables in all patterns.

 (? PREDICATE <PATTERN>)

Succeeds when (FUNCALL PREDICATE MATCH-VALUE) is true and when <PATTERN> matches the value. Body has the bindings of <PATTERN>.

 (FUNCALL FUN <PATTERN>)

Applies FUN to the match value, then matches <PATTERN> against the result.

 (BQ EXPR)

Matches as if by BACKQUOTE. If EXPR is an atom, then this is equivalent to QUOTE. If EXPR is a list, each element is matches as in QUOTE, unless it is an (UQ <PATTERN>) form, in which case it is matched as a pattern. Eg:

(match (list 1 2 3)
  ((BQ (1 (UQ x) 2)) x))

Will succeed, binding X to 2.

(match (list 10 2 20)
   ((BQ (1 (UQ x) 2)) x))

Will fail, since 10 and 1 don't match.

(values <P1> ... <PN>)

Will match multiple values produced by a (values ...) form.

(struct struct-name (field-name <P1>)
                    (field-name <P2>)
                    ...
                    (field-name <P3>))

Which matches when the input is a struct of type struct-name, whose fields match <P1> ... <PN>.

Conclusions

If you are an elisp hacker like me, now you don't have to envy those snooty Racket, ML and Haskell programmers. Happy Hacking!

(PS - the library is also available in Common Lisp, check my github).

(PPS - I love Racket, ML and Haskell programmers and they aren't at all snooty.



          Random Access Lists for Emacs   

Here is a quick post: I've added an implementation of random access lists to my Emacs Lisp library. These are a persistent data structure which supports fast persistent list operations (O(1)) as well as pretty fast random-access and persistent update (O(log(n))). These data structures are someplace between a list and a vector, but have the benefit of persistence - update to a random-access-list returns a new list and leaves the old one unmodified. These are similar to Clojure's vector datatype.

You can read about these structures in srfi-101. My implementation is a cargo-cult port of the reference implementation of that srfi to Emacs Lisp.

Examples:

Creation:

(setq r (ra:list 1 2 3 4 5)) ; -> [cl-struct-pl-cons 1 1 [cl-struct-pl-cons 1 2 [cl-struct-pl-cons 3 [cl-struct-pl-node 3 4 5] nil]]]

List operations are prefixed with ra::

(ra:car r) ;-> 1
(ra:cdr r) ;-> [cl-struct-pl-cons 1 2 [cl-struct-pl-cons 3
[cl-struct-pl-node 3 4 5] nil]]
(ra:map (lambda (x) (+ x 1)) r) ;-> [cl-struct-pl-cons 1 2
[cl-struct-pl-cons 1 3 [cl-struct-pl-cons 3 [cl-struct-pl-node 4 5
6] nil]]]
(ra:cons 100 r) ; ->[cl-struct-pl-cons 3 [cl-struct-pl-node 100 1 2] [cl-struct-pl-cons 3 [cl-struct-pl-node 3 4 5] nil]]

And so on.

Random access and update are accomplished with:

(ra:list-ref r 1) ;-> 2
(ra:list-set r 1 1000) [cl-struct-pl-cons 1 1 [cl-struct-pl-cons 1
1000 [cl-struct-pl-cons 3 [cl-struct-pl-node 3 4 5] nil]]]

Note that indexing is zero based.

Once can convert between ra:lists and lists via:

(ra:random-access-list->linear-access-list r) ;-> (1 2 3 4 5)
(ra:linear-access-list->random-access-list '(1 2 3)) ;->
[cl-struct-pl-cons 3 [cl-struct-pl-node 1 2 3] nil]

Conclusion:

I wrote this library by porting over the reference implementation. There are many places where very large random access lists will blow the stack. There are also probably bugs and places where efficiency can be improved. Please let me know if you find any!

They are available from my github account.



          Geometrical View of Differential Equation dy/dx=f(x, y)   
Geometrical View of Differential Equation dy/dx=f(x, y)This worksheet gives you geometrical view of differential equations dy/dx=f(x, y). Direction vectors on all lattice points in a defined range are displayed. This shows direction field of a differential equation. If you try to draw direction field by hand, it is convenient to draw direction vectors on isoclines. The isoclines are lines defined as f(x, y)=C and all vectors on the same isocline have same dirrection. This worksheet illustrates how to draw vector fields on isoclines.
          Solution of a System of Differential Equations   
Solution of a System of Differential Equations

In this worksheet, we show some examples of behavior of solutions of a system of differential equations and if you put DEs and an initial condition, an orbit of a solution with a vector field are shown. All parameters input by you are recorded and they can be easily reused. Note: There are some features in this application that are new to Maple 12 and will not work in older versions. To see the Maple 11 version, follow this link.


          Solution of a System of Differential Equations   
Solution of a System of Differential EquationsIn this worksheet, we show some examples of behavior of solutions of a system of differential equations and if you put DEs and an initial condition, an orbit of a solution with a vector field are shown. All parameters input by you are recorded and they can be easily reused. Note: If you would like to see the application using new features available in Maple 12, follow this link.
          Solar panel vectorized   
The original posting by oldifluff was a raster image. So here is a vector version.
          Comment on Vector obtains $21 million in funding by Edward   
That is the beautiful part of free market capitalism. The companies that provide a better service or a more desirable price are the ones that are efficient enough to survive. The others either have to improve their efficiency or get out of the business. This means that the investors (like those investing $21 million) are eager that the company do well. Lockheed Martin recently announced the end of their Athena rocket business, which launched small satellites to orbit as well as the Lunar Prospector probe. Athena couldn't compete with the new rockets coming on the market, and was so expensive that it only launched half a dozen times over the past two decades. Congratulations to Vector for making it this far -- it isn't easy -- and I wish Vector continued success in the future.
          RasterVect 24.5   
Vectorizer RasterVect can transform any raster images into a vector format. Raster drawing can be imported by scanning original paper drawings. There is TWAIN support for importing from scanners. Images can be acquired from any scanner.
          Comment on Stiefel-Whitney cycles as intersections by ranicki   
Worse: there was a typo in the original reply. It should have been the "mod 2 reduction of the Chern classes of a complex vector bundle"
          Comment on Stiefel-Whitney cycles as intersections by Anonymous   
The notes http://www.maths.ed.ac.uk/~aar/euler.pdf use Kreck's derivation of the Chern and Stiefel-Whitney classes from the Euler class to prove the (well-known) identification of the mod 2 reduction of a complex vector bundle with the Stiefel-Whitney classes of the underlying real vector bundle.
          クイーンズコート QUEENS COURT クルーネック ボーダーニット セーター ウール 長袖 2 ベージュ 薄茶 秋冬 レディース   
クイーンズコート QUEENS COURT クルーネ…
現在価格:3,240 円,入札数:-,終了日時:2017/07/02 22:56
          エル ELLE レーヨン混 Vネック 長袖 ニットセーター 38 グレー 春夏   
エル ELLE レーヨン混 Vネック 長袖 ニッ…
現在価格:1,242 円,入札数:-,終了日時:2017/07/02 22:10
          未使用品 エル ELLE ナイロン混 チュール切替 長袖 ニット セーター 40 ピンクベージュ系 春秋   
未使用品 エル ELLE ナイロン混 チュール…
現在価格:490 円,入札数:-,終了日時:2017/07/02 22:56
          エル ELLE ワンピース ニット セーター 長袖 タートル アルパカ混 紺 40 ※SH 170519 レディース   
エル ELLE ワンピース ニット セーター 長…
現在価格:2,052 円,入札数:-,終了日時:2017/07/02 22:04
          Microphone Free Flat Vector Icon   

Microphone Free Flat Vector Icon – flat style mike vector illustration isolated on white background. Download free vector mic icon as AI and EPS. Powered by Shutterstock

The post Microphone Free Flat Vector Icon appeared first on SuperAwesomeVectors.


          iPod Classic Flat Vector Icon   

iPod Classic Flat Vector Icon – simple flat style illustration of a famous music player by Apple. Download free vector iPod as AI and EPS. Powered by Shutterstock

The post iPod Classic Flat Vector Icon appeared first on SuperAwesomeVectors.


          A Convenient Reusable Water Bottle   
A Convenient Reusable Water Bottle
          A Pretty Daffodil Flower   
A Pretty Daffodil Flower
          A Chrysanthemum Plant With Flowers   
A Chrysanthemum Plant With Flowers
          A Man Doing The Twist   
A Man Doing The Twist
          A Man Roasting Chicken While Camping   
A Man Roasting Chicken While Camping
          A Cute Reusable Water Bottle With Strap   
A Cute Reusable Water Bottle With Strap
          A Blonde Girl Dancing The Dab   
A Blonde Girl Dancing The Dab
          Women Dancing Collection 2   
Women Dancing Collection 2
          Women Camping Collection 2   
Women Camping Collection 2
          Trees Collection   
Trees Collection
          Reusable Water Bottles Collection   
Reusable Water Bottles Collection
          Summer Beach Shore Background   
Summer Beach Shore Background
          Men Dancing Collection 2   
Men Dancing Collection 2
          Luxury Cabanas On A Beach Background   
Luxury Cabanas On A Beach Background
          Men Camping Collection 2   
Men Camping Collection 2
          A Vegetable Garden Background   
A Vegetable Garden Background
          Kids Dancing Collection   
Kids Dancing Collection
          Kids Camping Collection   
Kids Camping Collection
          An Airport Baggage Carousel Background   
An Airport Baggage Carousel Background
          Daffodils Collection   
Daffodils Collection
          Chrysanthemums Collection   
Chrysanthemums Collection
          A Boy Doing Oops Upside Your Head   
A Boy Doing Oops Upside Your Head
          ギャップ GAP ニット Vネック 長袖 ウール混 グレー L   
ギャップ GAP ニット Vネック 長袖 ウール…
現在価格:1,080 円,入札数:-,終了日時:2017/07/02 22:53
          ギャップ サマニ ボーダー 柄 綿 Vネック 長袖 M ホワイト 白   
ギャップ サマニ ボーダー 柄 綿 Vネック …
現在価格:1,620 円,入札数:-,終了日時:2017/07/02 22:58
          ギャップ GAP ニット セーター Vネック ボーダー柄 長袖 ウール グレー オレンジ L メンズ レディース   
ギャップ GAP ニット セーター Vネック ボ…
現在価格:1,080 円,入札数:-,終了日時:2017/07/02 22:31
          未使用品 ギャップ GAP ボーダー コットン 長袖ニット S   
未使用品 ギャップ GAP ボーダー コット…
現在価格:800 円,入札数:-,終了日時:2017/07/02 22:30
           Agilent 8719C Sale price: $8,998.00    

Agilent-Keysight 8719C


Sale price
$14,772.00
$8,998.00


Network Analyzer, 50MHz-13.5GHz The 8719C vector network analyzer characterizes RF and microwave components down to 50 MHz and up to 13.5 GHz. This analyzer includes a fast-sweeping synthesized source, S-parameter test set, tuned receiver, and larg...(Continue to site)

          RasterVect 24.5   
RasterVect can transform raster images (BMP,TIFF,JPEG...) into a vector format. Raster drawings can be imported by scanning paper drawings. Output vector formats (DXF,EMF,WMF,AI and EPS) are used by most CAD / vector programs (AutoCAD, Corel Draw).
          Ilustración Digital.   
Ilustración Digital. Affinity Designer. Dibujo digitales con tableta Wacom.
Ilustración Digital. Affinity Designer. Dibujo digitales con tableta Wacom.
Los pinceles empleados son:
Concept detailer+Concept Smooth Almost Squared.
Affinity Designer, es una aplicación de dibujo vectorial con la que no solo se pueden diseñar logotipos o material de marketing, sino que también con el modo "pixel"  puedes hacer ilustraciones digitales similares a las que puedes hacer en PS.
Enlaces de interés: Clases de pintura en Las Palmas. Retratos por encargo. Cómo pintar retratos al óleo.

          Scientific Data Scientist: VECTOR RECRUITMENT LIMITED   
£Excellent + Benefits package + Relocation package + Bonus: VECTOR RECRUITMENT LIMITED
For more latest jobs and jobs in East of England visit brightrecruits.com
          West Nile virus detected in Larimer County   
A mosquito carrying West Nile virus has been found in a trap in Berthoud, according to Vector Disease Control International, formerly known as Colorado Mosquito Control.
          Vector Space Systems Gain $21 Million Funding to Build Cheaper Rockets   
While Elon Musk was starting his new venture SpaceX, he had asked experts of aviation field during his series of salons in Silicon Valley and around Los Angeles to suggest ideas regarding the new generation rocket. Most of those who made credible suggestions, related to the development of smaller, cheaper, and yet efficient rockets, which can take something into the orbit at a much lower price than the present cost of about $100 million. In the past few years, Space Technologies Corp. has indeed managed to reduce the launch prices drastically, although the size of the spaceships have not reduced as much as desired by some of the advisers. Equal Focus on Increasing Launch Efficiency Among those who made the suggestions and helped Space X get off the ground, have collaborated to ignite a start-up of themselves, called Vector Space Systems, which now has gained $21 million funding from some of the most prominent venture capitalists in the Silicon Valley, including Sequoia Capital, Lightspeed Venture Partners, and Shasta Ventures. This funding is expected to go a long way in Vector Space Systems’ ambitious goals to make $1.5 million rockets that can carry small satellites into the orbit, and aspire to increase the efficiency to over 100 launches per year. Currently, the entire aerospace industry manage to launch so many spacecraft collectively. As per the co-founder and CEO of Vector Space Systems, the company has poured equal efforts onto fixing the launch problem as they did on building advanced rockets, something Elon Musk’s company ignored. As Jim Cantrell puts it, his company is trying to make the simplest of rockets, building them like sausages, and launching by the hundreds.  

Original Post Vector Space Systems Gain $21 Million Funding to Build Cheaper Rockets source Twease
          【QT】深入qt信号与槽实现原理   

1、先上示例代码

先上示例代码直观地感受一下qt信号与槽的用法,后面再详细解释。通过QtCreator创建一个Qt Widget工程(没有创建ui文件,其它选项为默认值),工程名为SS,最后在SS目录下会生成5个文件:main.cpp、mainwindow.cpp、mainwindow.h、SS.pro和SS.pro.user,然后对这几个文件稍作修改,最终的源码如下。

SS.pro——

QT += core gui
QT += widgets

TARGET = SS
TEMPLATE = app

SOURCES += main.cpp\
        mainwindow.cpp

HEADERS  += mainwindow.h

SS.pro.user——
这是一个xml文件,保存了SS工程在QtCreator中的相关配置信息,不是我们关注的对象。

main.cpp——

#include "mainwindow.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}

mainwindow.h——

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();

protected:
    void mousePressEvent(QMouseEvent *event);

//Q_SIGNALS:
signals:
    void mousePressed();

//private Q_SLOTS:
private slots:
    void onMousePressed();
};

#endif // MAINWINDOW_H

mainwindow.cpp——

#include "mainwindow.h"

#include <QDebug>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
//    connect(this, &MainWindow::mousePressed, this, &MainWindow::onMousePressed);
    connect(this, SIGNAL(mousePressed()), this, SLOT(onMousePressed()));

    setGeometry(100, 100, 360, 360);
}

MainWindow::~MainWindow()
{
    disconnect(this, SIGNAL(mousePressed()), this, SLOT(onMousePressed()));
}

void MainWindow::mousePressEvent(QMouseEvent *event)
{
    Q_UNUSED(event)

    emit mousePressed(); // Q_EMIT
}

void MainWindow::onMousePressed()
{
    qDebug() << "[SLOT] MainWindow::onMousePressed";
}

接着,通过QtCreator编译SS工程,在形如build-SS-XXX-XXX的目录下产生编译结果,共6个文件:Makefile、SS、main.o、mainwindow.o、moc_mainwindow.o和moc_mainwindow.cpp,且不管这些文件是如何生成的,有什么作用。

最后,通过QtCreator运行SS工程,在弹出的窗口上按下鼠标就会输出“[SLOT] MainWindow::onMousePressed”,这个log就是通过信号与槽实现的。

2、信号与槽简介

信号(signal)与槽(slot)是qt的一大特色,由元对象系统(meta object system)提供,用于对象间的通信,类似的还有借助于函数指针的回调机制,理论上,信号与槽比回调的反应速度要慢,但前者用起来更灵活。下面以SS工程为例,简单介绍一下信号与槽的用法。SS.pro为工程文件,main.cpp文件实现了必需的main函数,这两个文件不作更多解释,重点在于mainwindow.h和mainwindow.cpp。

使用信号与槽,首先,类必须直接或间接继承自QObject,如示例中的MainWindow继承自QMainWindow,而QMainWindow间接继承自QObject;然后,在类入口处使用O_OBJECT宏,这是必须的;接着,使用signals或Q_SIGNALS声明信号,如示例中的mousePressed,信号类似于成员函数,只不过其返回类型一般为void,但可以有参数,而且只有声明不需定义,使用private、protected或public slots或Q_SLOTS声明槽并定义槽,如示例中的onMousePressed,槽就是个普通的成员函数,只不过声明时多了个slots或Q_SLOTS而已;最后使用connect连接信号与槽,信号与信号也可以连接,当信号发送时,就会触发与之连接的槽,使用disconnect断开连接,两者连接时它们的参数列表必须相同,示例中在构造函数中connect,析构函数中disconnect,重写了虚函数mousePressEvent,当有鼠标按下事件时就会调到这个函数,函数中通过emit发送mousePressed信号,进而触发与之连接的onMousePressed槽,输出log。connect和disconnect有多个重载函数,这里不作详细介绍,其中connect连接的信号与槽可以通过取地址符直接取对应的地址,或者使用SIGNAL与SLOT进行包装,但后者更好用。

3、编译过程分析

上面提到了编译结果,有两个文件比较奇怪,moc_mainwindow.cpp和moc_mainwindow.o。首先,通过qmake及其默认配置和SS.pro生成Makefile,然后,通过这个Makefile继续编译。接下来,使用g++编译main.cpp生成main.o,使用g++编译mainwindow.cpp生成mainwindow.o,使用元对象编译器moc编译mainwindow.h生成moc_mainwindow.cpp,使用g++编译moc_mainwindow.cpp生成moc_mainwindow.o,最后使用g++链接main.o、mainwindow.o和moc_mainwindow.cpp和生成SS,over。重点在于moc,我们来看一下由moc生成的moc_mainwindow.cpp是如何保存信号与槽相关信息的。

qt_meta_stringdata_MainWindow变量——

struct qt_meta_stringdata_MainWindow_t {
    QByteArrayData data[4];
    char stringdata[40];
};
#define QT_MOC_LITERAL(idx, ofs, len) \
    Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \
    qptrdiff(offsetof(qt_meta_stringdata_MainWindow_t, stringdata) + ofs \
        - idx * sizeof(QByteArrayData)) \
    )
static const qt_meta_stringdata_MainWindow_t qt_meta_stringdata_MainWindow = {
    {
QT_MOC_LITERAL(0, 0, 10), // "MainWindow"
QT_MOC_LITERAL(1, 11, 12), // "mousePressed"
QT_MOC_LITERAL(2, 24, 0), // ""
QT_MOC_LITERAL(3, 25, 14) // "onMousePressed"

    },
    "MainWindow\0mousePressed\0\0onMousePressed"
};
#undef QT_MOC_LITERAL

qt_meta_stringdata_MainWindow是一个只读的静态变量,变量名中qt_meta_stringdata_为固定字段,MainWindow为对应的类名。qt_meta_stringdata_MainWindow的类型为qt_meta_stringdata_MainWindow_t,是个结构体,有两个数组成员,每个数组的长度是都是动态的。数组data有4个元素,元素排列顺序为当前类、第一个信号、占位符、其它信号、其它槽,信号在槽前面,信号和槽各自的顺序以声明的顺序排列,示例中MainWindow有1个信号和1个槽,所以加上类和占位符共4个元素,至少有1个信号或槽时后面就有1个占位符,否则只有当前类1个元素;每个元素都使用了QT_MOC_LITERAL参数宏,第一个参数表示元素索引,第二个参数表示元素在stringdata中的偏移量,第三个参数表示元素对应的字符串长度,实际上就是对QByteArrayData进行初始化,详细分析见下面的“QByteArrayData初始化”。stringdata是个字符数组,长度与data数组中的元素有关,顺序保存了data数组中各元素对应的字符串表示,即类名、信号名和槽名,占位符不占据任何长度,各个字段之间以空(null)字符分隔,示例中这个值为"MainWindow\0mousePressed\0\0onMousePressed"

QByteArrayData初始化——
下面深挖QByteArrayData结构及初始化方式,顺便学习下C++强大的模板用法,如下层层展开的代码所示。

// 1. QByteArrayData is QArrayData with 5 data members
typedef QArrayData QByteArrayData;
struct Q_CORE_EXPORT QArrayData
{
    QtPrivate::RefCount ref; // see below
    int size; // int
    uint alloc : 31; // unsigned int with 31 bits
    uint capacityReserved : 1; // unsignet int with 1 bit
    qptrdiff offset; // in bytes from beginning of header // see below
    // others ...
};
// 2. What is QtPrivate::RefCount
namespace QtPrivate
{
class RefCount
{
public:
    // others ...
    QBasicAtomicInt atomic; // typedef QBasicAtomicInteger<int> QBasicAtomicInt;
};
}
// 2.1 QBasicAtomicInteger
template <typename T>
class QBasicAtomicInteger
{
public:
    typedef QAtomicOps<T> Ops;
    typename Ops::Type _q_value; // >> ref of QArrayData stored here (type is int) <<
    // others ...
};
// 2.2 QAtomicOps
template <typename T> struct QAtomicOps : QBasicAtomicOps<sizeof(T)>
{
    typedef T Type;
};
// 2.3 QBasicAtomicOps
template <int size> struct QBasicAtomicOps : QGenericAtomicOps<QBasicAtomicOps<size> >
{
    // something ...
};
// 2.4 QGenericAtomicOps
template <typename BaseClass> struct QGenericAtomicOps
{
    // something ...
};
// 3. What is qptrdiff
typedef QIntegerForSizeof<void*>::Signed qptrdiff; // qint32(int - 32 bit signed) or qint64(long long - 64 bit signed)
template <class T> struct QIntegerForSizeof: QIntegerForSize<sizeof(T)> { };
template <int> struct QIntegerForSize;
template <>    struct QIntegerForSize<1> { typedef quint8  Unsigned; typedef qint8  Signed; };
template <>    struct QIntegerForSize<2> { typedef quint16 Unsigned; typedef qint16 Signed; };
template <>    struct QIntegerForSize<4> { typedef quint32 Unsigned; typedef qint32 Signed; };
template <>    struct QIntegerForSize<8> { typedef quint64 Unsigned; typedef qint64 Signed; };
// 4. What is QT_MOC_LITERAL
#define QT_MOC_LITERAL(idx, ofs, len) \
    Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \
    qptrdiff(offsetof(qt_meta_stringdata_MainWindow_t, stringdata) + ofs \
        - idx * sizeof(QByteArrayData)) \
    )
// 4.1 macro definations
#define Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(size, offset) \
    Q_STATIC_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(size, offset)
#define Q_STATIC_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(size, offset) \
    { Q_REFCOUNT_INITIALIZE_STATIC, size, 0, 0, offset } \
#define Q_REFCOUNT_INITIALIZE_STATIC { Q_BASIC_ATOMIC_INITIALIZER(-1) }
#  define Q_BASIC_ATOMIC_INITIALIZER(a) { (a) }
// 4.2 What is offsetof
// offsetof from sqlite3.c
#ifndef offsetof
#define offsetof(STRUCTURE,FIELD) ((int)((char*)&((STRUCTURE*)0)->FIELD))
#endif
// offsetof from stddef.h
#define offsetof(TYPE, MEMBER) __builtin_offsetof (TYPE, MEMBER)

qt_meta_data_MainWindow变量——

static const uint qt_meta_data_MainWindow[] = {

 // content:
       7,       // revision 7 is Qt 5
       0,       // classname
       0,    0, // classinfo count and data
       2,   14, // methods count and data
       0,    0, // properties count and data
       0,    0, // enums/sets count and data
       0,    0, // constructors count and data
       0,       // flags since revision 3
       1,       // signalCount since revision 4

 // signals: name, argc, parameters, tag, flags
       1,    0,   24,    2, 0x06 /* Public */,

 // slots: name, argc, parameters, tag, flags
       3,    0,   25,    2, 0x08 /* Private */,

 // signals: parameters
    QMetaType::Void,

 // slots: parameters
    QMetaType::Void,

       0        // eod
};

qt_meta_data_MainWindow变量中数据类型为unit,有几个关键的地方,content中methods为2表示共有2个信号和槽,signalCount为1表示共有1个信号,接着是信号和槽的相关信息,最后一个元素为0标记结束。

4、有用的宏

示例中的宏Q_OBJECT、signals、Q_SIGNALS、slots、Q_SLOTS、emit等是非常有用的,在头文件qobjectdefs.h中定义,根据是否为moc编译而分为两个版本,源码如下。

// The following macros are our "extensions" to C++
// They are used, strictly speaking, only by the moc.
#ifndef Q_MOC_RUN
#ifndef QT_NO_META_MACROS
# if defined(QT_NO_KEYWORDS)
#  define QT_NO_EMIT
# else
#   ifndef QT_NO_SIGNALS_SLOTS_KEYWORDS
#     define slots
#     define signals public
#   endif
# endif
# define Q_SLOTS
# define Q_SIGNALS public
# define Q_EMIT
#ifndef QT_NO_EMIT
# define emit
#endif
// others ...
#endif // QT_NO_META_MACROS
/* qmake ignore Q_OBJECT */
#define Q_OBJECT \
public: \
    Q_OBJECT_CHECK \
    static const QMetaObject staticMetaObject; \
    virtual const QMetaObject *metaObject() const; \
    virtual void *qt_metacast(const char *); \
    QT_TR_FUNCTIONS \
    virtual int qt_metacall(QMetaObject::Call, int, void **); \
private: \
    Q_DECL_HIDDEN_STATIC_METACALL static void qt_static_metacall(QObject *, QMetaObject::Call, int, void **); \
    struct QPrivateSignal {};
#else // Q_MOC_RUN
#define slots slots
#define signals signals
#define Q_SLOTS Q_SLOTS
#define Q_SIGNALS Q_SIGNALS
#define Q_OBJECT Q_OBJECT
#endif //Q_MOC_RUN

关键在于上面的Q_OBJECT,其中声明的函数由moc编译时实现,另外还实现了信号,前面提到了信号只声明不定义,其实信号也是函数,只不过由moc实现,示例中的moc_mainwindow.cpp相关源码及分析如下。

// qt_static_metacall函数从其名字来看是一个调用函数的方法
// 参数_c值为InvokeMetaMethod时说明将调用函数
// 然后根据参数_id值去调用对应的信号或槽
// 参数_c值为IndexOfMethod时通过成员指针对信号地址进行检查
// 返回值为信号对应的_id
void MainWindow::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a)
{
    if (_c == QMetaObject::InvokeMetaMethod) {
        MainWindow *_t = static_cast<MainWindow *>(_o);
        switch (_id) {
        case 0: _t->mousePressed(); break;
        case 1: _t->onMousePressed(); break;
        default: ;
        }
    } else if (_c == QMetaObject::IndexOfMethod) {
        int *result = reinterpret_cast<int *>(_a[0]);
        void **func = reinterpret_cast<void **>(_a[1]);
        {
            typedef void (MainWindow::*_t)();
            if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&MainWindow::mousePressed)) {
                *result = 0;
            }
        }
    }
    Q_UNUSED(_a);
}
// staticMetaObject变量保存了所有的元数据
const QMetaObject MainWindow::staticMetaObject = {
    { &QMainWindow::staticMetaObject, qt_meta_stringdata_MainWindow.data,
      qt_meta_data_MainWindow,  qt_static_metacall, Q_NULLPTR, Q_NULLPTR}
};
// metaObject函数用于获取QMetaObject
const QMetaObject *MainWindow::metaObject() const
{
    return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject;
}
// qt_metacast函数用于提取参数_clname对应类的信号与槽的名字
// 因为qt_meta_stringdata_MainWindow.stringdata的第一个数据段保存的是类名
// 所以可以通过strcmp进行类名比较
void *MainWindow::qt_metacast(const char *_clname)
{
    if (!_clname) return Q_NULLPTR;
    if (!strcmp(_clname, qt_meta_stringdata_MainWindow.stringdata))
        return static_cast<void*>(const_cast< MainWindow*>(this));
    return QMainWindow::qt_metacast(_clname);
}
// qt_metacall函数根据参数_id及_c执行不同的动作
// 当_id<2且-c==InvokeMetaMethod时
// 执行前面介绍的qt_static_metacall
// 这里的数字2表示的是信号和槽的总数为2
int MainWindow::qt_metacall(QMetaObject::Call _c, int _id, void **_a)
{
    _id = QMainWindow::qt_metacall(_c, _id, _a);
    if (_id < 0)
        return _id;
    if (_c == QMetaObject::InvokeMetaMethod) {
        if (_id < 2)
            qt_static_metacall(this, _c, _id, _a);
        _id -= 2;
    } else if (_c == QMetaObject::RegisterMethodArgumentMetaType) {
        if (_id < 2)
            *reinterpret_cast<int*>(_a[0]) = -1;
        _id -= 2;
    }
    return _id;
}
// SIGNAL 0
// 发送信号其实调用的就是这个信号函数
// 信号函数由moc通过QMetaObject::activate实现
// 第一个参数为当前对象指针this
// 第二个参数为上面介绍的staticMetaObject
// 第三个参数为从0开始的信号索引
// 第四个参数为空指针NULL
void MainWindow::mousePressed()
{
    QMetaObject::activate(this, &staticMetaObject, 0, Q_NULLPTR);
}

示例中的connect函数用到了SIGNAL与SLOT宏,它们分debug和非debug两个版本,非debug版本就是在参数前面添加一个数字,信号为2,槽为1,源码如下。

// qglobal.h
/* These two macros makes it possible to turn the builtin line expander into a
 * string literal. */
#define QT_STRINGIFY2(x) #x
#define QT_STRINGIFY(x) QT_STRINGIFY2(x)
// qobjectdefs.h
Q_CORE_EXPORT const char *qFlagLocation(const char *method);

#ifndef QT_NO_META_MACROS
#ifndef QT_NO_DEBUG
# define QLOCATION "\0" __FILE__ ":" QT_STRINGIFY(__LINE__)
# ifndef QT_NO_KEYWORDS
#  define METHOD(a)   qFlagLocation("0"#a QLOCATION)
# endif
# define SLOT(a)     qFlagLocation("1"#a QLOCATION)
# define SIGNAL(a)   qFlagLocation("2"#a QLOCATION)
#else
# ifndef QT_NO_KEYWORDS
#  define METHOD(a)   "0"#a
# endif
# define SLOT(a)     "1"#a
# define SIGNAL(a)   "2"#a
#endif

#define QMETHOD_CODE  0                        // member type codes
#define QSLOT_CODE    1
#define QSIGNAL_CODE  2
#endif // QT_NO_META_MACROS

5、connect

使用信号前,首先要进行connect,示例中的connect代码如下。

connect(this, SIGNAL(mousePressed()), this, SLOT(onMousePressed()));

connect有多个重载函数,下面以示例中的用法为例展开说明,源码如下。

QMetaObject::Connection QObject::connect(const QObject *sender, const char *signal,
                                     const QObject *receiver, const char *method,
                                     Qt::ConnectionType type)
{
    // 先判断函数参数是否有效
    if (sender == 0 || receiver == 0 || signal == 0 || method == 0) {
        qWarning("QObject::connect: Cannot connect %s::%s to %s::%s",
                 sender ? sender->metaObject()->className() : "(null)",
                 (signal && *signal) ? signal+1 : "(null)",
                 receiver ? receiver->metaObject()->className() : "(null)",
                 (method && *method) ? method+1 : "(null)");
        return QMetaObject::Connection(0);
    }
    QByteArray tmp_signal_name;

    // 检查信号对应的宏SIGNAL是否正确使用
    // SIGNAL在信号前面添加了数字2
    // check_signal_macro通过这个数字2进行检查
    // 是否正确使用了SIGNAL
    if (!check_signal_macro(sender, signal, "connect", "bind"))
        return QMetaObject::Connection(0);
    const QMetaObject *smeta = sender->metaObject();
    const char *signal_arg = signal;
    ++signal; // 跳过SIGNAL宏中的数字2
    QArgumentTypeArray signalTypes;
    Q_ASSERT(QMetaObjectPrivate::get(smeta)->revision >= 7); // moc设置了revision为7
    // 提取信号名signalName和参数列表signalTypes
    // decodeMethodSignature函数使用了strchr函数定位左、右括号在signal字符串中的位置
    QByteArray signalName = QMetaObjectPrivate::decodeMethodSignature(signal, signalTypes);
    // 提取信号索引signal_index
    // 从当前类到父类查找signalName对应的索引
    // 失败时返回-1
    int signal_index = QMetaObjectPrivate::indexOfSignalRelative(
            &smeta, signalName, signalTypes.size(), signalTypes.constData());
    if (signal_index < 0) {
        // check for normalized signatures
        tmp_signal_name = QMetaObject::normalizedSignature(signal - 1);
        signal = tmp_signal_name.constData() + 1;

        signalTypes.clear();
        signalName = QMetaObjectPrivate::decodeMethodSignature(signal, signalTypes);
        smeta = sender->metaObject();
        signal_index = QMetaObjectPrivate::indexOfSignalRelative(
                &smeta, signalName, signalTypes.size(), signalTypes.constData());
    }
    if (signal_index < 0) {
        err_method_notfound(sender, signal_arg, "connect");
        err_info_about_objects("connect", sender, receiver);
        return QMetaObject::Connection(0);
    }
    signal_index = QMetaObjectPrivate::originalClone(smeta, signal_index);
    signal_index += QMetaObjectPrivate::signalOffset(smeta);

    // 同理下面获取槽的名字和索引
   // 因为信号可以连接到槽和另外一个信号
   // 所以对槽进行处理时还要判断是否为信号
    QByteArray tmp_method_name;
    int membcode = extract_code(method);

    if (!check_method_code(membcode, receiver, method, "connect"))
        return QMetaObject::Connection(0);
    const char *method_arg = method;
    ++method; // skip code

    QByteArray methodName;
    QArgumentTypeArray methodTypes;
    const QMetaObject *rmeta = receiver->metaObject();
    int method_index_relative = -1;
    Q_ASSERT(QMetaObjectPrivate::get(rmeta)->revision >= 7);
    switch (membcode) {
    case QSLOT_CODE:
        method_index_relative = QMetaObjectPrivate::indexOfSlotRelative(
                &rmeta, methodName, methodTypes.size(), methodTypes.constData());
        break;
    case QSIGNAL_CODE:
        method_index_relative = QMetaObjectPrivate::indexOfSignalRelative(
                &rmeta, methodName, methodTypes.size(), methodTypes.constData());
        break;
    }
    if (method_index_relative < 0) {
        // check for normalized methods
        tmp_method_name = QMetaObject::normalizedSignature(method);
        method = tmp_method_name.constData();

        methodTypes.clear();
        methodName = QMetaObjectPrivate::decodeMethodSignature(method, methodTypes);
        // rmeta may have been modified above
        rmeta = receiver->metaObject();
        switch (membcode) {
        case QSLOT_CODE:
            method_index_relative = QMetaObjectPrivate::indexOfSlotRelative(
                    &rmeta, methodName, methodTypes.size(), methodTypes.constData());
            break;
        case QSIGNAL_CODE:
            method_index_relative = QMetaObjectPrivate::indexOfSignalRelative(
                    &rmeta, methodName, methodTypes.size(), methodTypes.constData());
            break;
        }
    }

    if (method_index_relative < 0) {
        err_method_notfound(receiver, method_arg, "connect");
        err_info_about_objects("connect", sender, receiver);
        return QMetaObject::Connection(0);
    }
    // 检查信号与槽的参数列表是否一致
    if (!QMetaObjectPrivate::checkConnectArgs(signalTypes.size(), signalTypes.constData(),
                                              methodTypes.size(), methodTypes.constData())) {
        qWarning("QObject::connect: Incompatible sender/receiver arguments"
                 "\n        %s::%s --> %s::%s",
                 sender->metaObject()->className(), signal,
                 receiver->metaObject()->className(), method);
        return QMetaObject::Connection(0);
    }
    // 对connect的类型进行处理
    int *types = 0;
    if ((type == Qt::QueuedConnection)
            && !(types = queuedConnectionTypes(signalTypes.constData(), signalTypes.size()))) {
        return QMetaObject::Connection(0);
    }
    // 最后通过QMetaObjectPrivate::connect进行真正的connect
#ifndef QT_NO_DEBUG
    QMetaMethod smethod = QMetaObjectPrivate::signal(smeta, signal_index);
    QMetaMethod rmethod = rmeta->method(method_index_relative + rmeta->methodOffset());
    check_and_warn_compat(smeta, smethod, rmeta, rmethod);
#endif
    QMetaObject::Connection handle = QMetaObject::Connection(QMetaObjectPrivate::connect(
        sender, signal_index, smeta, receiver, method_index_relative, rmeta ,type, types));
    return handle;
}

下面是QMetaObjectPrivate::connect的源码实现。

QObjectPrivate::Connection *QMetaObjectPrivate::connect(const QObject *sender,
                                 int signal_index, const QMetaObject *smeta,
                                 const QObject *receiver, int method_index,
                                 const QMetaObject *rmeta, int type, int *types)
{
    // sender和receiver去const
    QObject *s = const_cast<QObject *>(sender);
    QObject *r = const_cast<QObject *>(receiver);

    // 获取receiver中method的偏移量
   // 因为其method_index是个相对值
    int method_offset = rmeta ? rmeta->methodOffset() : 0;
    Q_ASSERT(!rmeta || QMetaObjectPrivate::get(rmeta)->revision >= 6);
    QObjectPrivate::StaticMetaCallFunction callFunction =
        rmeta ? rmeta->d.static_metacall : 0;

    // 对sender和receiver上锁(mutex pool)
    QOrderedMutexLocker locker(signalSlotLock(sender),
                               signalSlotLock(receiver));

    // type为Qt::UniqueConnection时作特殊处理
    // 确保connect的唯一性
    if (type & Qt::UniqueConnection) {
        QObjectConnectionListVector *connectionLists = QObjectPrivate::get(s)->connectionLists;
        if (connectionLists && connectionLists->count() > signal_index) {
            const QObjectPrivate::Connection *c2 =
                (*connectionLists)[signal_index].first;

            int method_index_absolute = method_index + method_offset;

            while (c2) {
                if (!c2->isSlotObject && c2->receiver == receiver && c2->method() == method_index_absolute)
                    return 0;
                c2 = c2->nextConnectionList;
            }
        }
        type &= Qt::UniqueConnection - 1;
    }
    // 最后是真正的connect对象QObjectPrivate::Connection实例化
    // 存储了所有的connect信息
    // addConnection最终保存了这个connect操作
    QScopedPointer<QObjectPrivate::Connection> c(new QObjectPrivate::Connection);
    c->sender = s;
    c->signal_index = signal_index;
    c->receiver = r;
    c->method_relative = method_index;
    c->method_offset = method_offset;
    c->connectionType = type;
    c->isSlotObject = false;
    c->argumentTypes.store(types);
    c->nextConnectionList = 0;
    c->callFunction = callFunction;

    QObjectPrivate::get(s)->addConnection(signal_index, c.data());
    // 解锁
    locker.unlock();
    // connect成功后还会调用一次connectNotify函数
    // connectNotify是个虚函数
    // 我们可以重写connectNotify在connenct成功后进行额外的相关操作
    QMetaMethod smethod = QMetaObjectPrivate::signal(smeta, signal_index);
    if (smethod.isValid())
        s->connectNotify(smethod);

    return c.take();
}

6、activate

发送信号时,实际上是调用了QMetaObject::activate函数,这是Qt用于内部实现的函数,开发者无法直接使用这个函数。

    // internal index-based signal activation
    static void activate(QObject *sender, int signal_index, void **argv);
    static void activate(QObject *sender, const QMetaObject *, int local_signal_index, void **argv);
    static void activate(QObject *sender, int signal_offset, int local_signal_index, void **argv);

activate最终是通过上面的最后一个函数实现的,参数分别为信号发送者对象指针、信号在元对象数据结构中的偏移量及信号索引、信号参数,可以想象,这个函数就是在前面添加的connect列表中查找并调用这个信号连接的槽或者信号,源码实现如下。

void QMetaObject::activate(QObject *sender, int signalOffset, int local_signal_index, void **argv)
{
    // 信号在元对象数据结构中的实际索引
    int signal_index = signalOffset + local_signal_index;
    // 判断信号是否已经connect
    // 判断是否注册了信号监听回调函数(用于QTest)
    if (!sender->d_func()->isSignalConnected(signal_index)
        && !qt_signal_spy_callback_set.signal_begin_callback
        && !qt_signal_spy_callback_set.signal_end_callback) {
        return; // nothing connected to these signals, and no spy
    }
    // 判断信号是否被block
    if (sender->d_func()->blockSig)
        return;
    // 用于QTest
    if (sender->d_func()->declarativeData && QAbstractDeclarativeData::signalEmitted)
        QAbstractDeclarativeData::signalEmitted(sender->d_func()->declarativeData, sender,
                                                signal_index, argv);
    // 用于QTest begin
    void *empty_argv[] = { 0 };
    if (qt_signal_spy_callback_set.signal_begin_callback != 0) {
        qt_signal_spy_callback_set.signal_begin_callback(sender, signal_index,
                                                         argv ? argv : empty_argv);
    }
    // HANDLE句柄即当前的线程id
    // unix平台上通过pthread_self获取
    Qt::HANDLE currentThreadId = QThread::currentThreadId();

    {
    // 上锁(多线程、异步)
    QMutexLocker locker(signalSlotLock(sender));
    struct ConnectionListsRef {
        QObjectConnectionListVector *connectionLists;
        ConnectionListsRef(QObjectConnectionListVector *connectionLists) : connectionLists(connectionLists)
        {
            if (connectionLists)
                ++connectionLists->inUse;
        }
        ~ConnectionListsRef()
        {
            if (!connectionLists)
                return;

            --connectionLists->inUse;
            Q_ASSERT(connectionLists->inUse >= 0);
            if (connectionLists->orphaned) {
                if (!connectionLists->inUse)
                    delete connectionLists;
            }
        }

        QObjectConnectionListVector *operator->() const { return connectionLists; }
    };
    ConnectionListsRef connectionLists = sender->d_func()->connectionLists;
    // connectionLists为空时unlock后直接return
    if (!connectionLists.connectionLists) {
        locker.unlock();
        // 用于QTest end
        if (qt_signal_spy_callback_set.signal_end_callback != 0)
            qt_signal_spy_callback_set.signal_end_callback(sender, signal_index);
        return;
    }
    // 获取connect列表
    const QObjectPrivate::ConnectionList *list;
    if (signal_index < connectionLists->count())
        list = &connectionLists->at(signal_index);
    else
        list = &connectionLists->allsignals;

    do {
        QObjectPrivate::Connection *c = list->first;
        // 循环取得一个非空的Connection
        if (!c) continue;
        // We need to check against last here to ensure that signals added
        // during the signal emission are not emitted in this emission.
        QObjectPrivate::Connection *last = list->last;

        do {
            // 查找有效的receiver
            if (!c->receiver)
                continue;

            QObject * const receiver = c->receiver;
            // 判断当前线程与receiver线程是否一致
            const bool receiverInSameThread = currentThreadId == receiver->d_func()->threadData->threadId;

            // 根据connect类型及receiverInSameThread进行不同的处理
            // 立即执行queued_activate或者放入消息队列postEvent等待后续处理
            if ((c->connectionType == Qt::AutoConnection && !receiverInSameThread)
                || (c->connectionType == Qt::QueuedConnection)) {
                queued_activate(sender, signal_index, c, argv ? argv : empty_argv, locker);
                continue;
#ifndef QT_NO_THREAD
            } else if (c->connectionType == Qt::BlockingQueuedConnection) {
                locker.unlock();
                if (receiverInSameThread) {
                    qWarning("Qt: Dead lock detected while activating a BlockingQueuedConnection: "
                    "Sender is %s(%p), receiver is %s(%p)",
                    sender->metaObject()->className(), sender,
                    receiver->metaObject()->className(), receiver);
                }
                // 多线程时势必要用到同步机制(锁、信号量)
                QSemaphore semaphore;
                QMetaCallEvent *ev = c->isSlotObject ?
                    new QMetaCallEvent(c->slotObj, sender, signal_index, 0, 0, argv ? argv : empty_argv, &semaphore) :
                    new QMetaCallEvent(c->method_offset, c->method_relative, c->callFunction, sender, signal_index, 0, 0, argv ? argv : empty_argv, &semaphore);
                QCoreApplication::postEvent(receiver, ev);
                semaphore.acquire();
                locker.relock();
                continue;
#endif
            }

            QConnectionSenderSwitcher sw;

            if (receiverInSameThread) {
                sw.switchSender(receiver, sender, signal_index);
            }
            // 下面通过三种方法去调用信号连接的槽
            const QObjectPrivate::StaticMetaCallFunction callFunction = c->callFunction;
            const int method_relative = c->method_relative;
            if (c->isSlotObject) {
                c->slotObj->ref();
                QScopedPointer<QtPrivate::QSlotObjectBase, QSlotObjectBaseDeleter> obj(c->slotObj);
                locker.unlock();
                // 方法一 通过call调用receiver中的函数
                obj->call(receiver, argv ? argv : empty_argv);

                // Make sure the slot object gets destroyed before the mutex is locked again, as the
                // destructor of the slot object might also lock a mutex from the signalSlotLock() mutex pool,
                // and that would deadlock if the pool happens to return the same mutex.
                obj.reset();

                locker.relock();
            } else if (callFunction && c->method_offset <= receiver->metaObject()->methodOffset()) {
                //we compare the vtable to make sure we are not in the destructor of the object.
                locker.unlock();
                const int methodIndex = c->method();
                if (qt_signal_spy_callback_set.slot_begin_callback != 0)
                    qt_signal_spy_callback_set.slot_begin_callback(receiver, methodIndex, argv ? argv : empty_argv);
                // 方法二 callFunction即moc实现的qt_static_metacall
                callFunction(receiver, QMetaObject::InvokeMetaMethod, method_relative, argv ? argv : empty_argv);

                if (qt_signal_spy_callback_set.slot_end_callback != 0)
                    qt_signal_spy_callback_set.slot_end_callback(receiver, methodIndex);
                locker.relock();
            } else {
                const int method = method_relative + c->method_offset;
                locker.unlock();

                if (qt_signal_spy_callback_set.slot_begin_callback != 0) {
                    qt_signal_spy_callback_set.slot_begin_callback(receiver,
                                                                method,
                                                                argv ? argv : empty_argv);
       
          エル スカート ボトムス タイト ひざ丈 ストライプ パープル 40   
エル スカート ボトムス タイト ひざ丈 ス…
現在価格:972 円,入札数:-,終了日時:2017/07/02 22:54
          Should I be concerned about ransomware attacking my Mac?   

Ransomware continues to grow in popularity as a sort of ‘gold rush’ has been underway in the cyber underworld.

Hundreds of millions of dollars have been generated over the past couple of years with one security firm reporting that 64% of the victims they surveyed paid to get their files back.

Enterprising criminals are even posting ‘ready-to-go’ ransomware kits on the underground marketplace known as the ‘dark web’ with offers to split the revenue with users of their code.

The complexity of these attacks continues to grow as the security world and cyber-criminals face off in a high stakes game of ‘cat and mouse’.

The Bad News For Mac Users

All of the high profile ransomware attacks you’ve likely ever heard of have targeted Windows users, but some of the more recent code being made available via the dark web specifically targets all of the versions of the MacOS as well.

Since ransomware takes advantage of the user more than the operating system, there are few technical barriers to creating a Mac specific attack because the point of entry is getting the user to do something they shouldn’t do.

The most common attack vector for Macs so far has been through infected programs that are designed to bypass Apple’s built-in security (Xprotect and Gatekeeper).  These pre-made ransomware packages also claim to be able to bypass detection by at least 50 different anti-virus programs for both Mac and Windows.

The Good News

Unlike many of the Windows ransomware exploits that can compromise users through unpatched back-doors, clever phishing scams as well as rigged downloads, Mac users currently can only be exploited via a rigged download.

Despite the growing popularity of Mac computers, they still only account for roughly 7% of computers worldwide, so they still benefit from ‘security through obscurity’.

To further illustrate the difference in malware focus in general, one security firm puts the number that target Macs at roughly 450,000 while Windows has 23 million known threats.

From a practical standpoint, cyber thieves are always going to focus on the largest opportunity as they’re in it for the money.

Don’t Let Your Guard Down

Having said all that, everything is subject to change and having the ‘I have a Mac, so I don’t have to worry’ attitude is a bit misguided – there’s a reason why Apple stopped running the ‘we don’t get PC viruses’ commercials back in 2012.

Making sure you only get programs and apps from reputable sources, install the updates when Apple alerts you and keeping all your other Internet tools, such as your browser, Java and Adobe programs updated are important ongoing tasks.

Every computer user should also have a solid backup process - using an automated online backup service such as Carbonite (https://goo.gl/XKum9f) provides an extra layer of security that will save the day whether it’s ransomware, viruses, fire, flood or theft.

Cyber criminals know that Mac computers are more expensive and that Mac owners statistically tend to be on the higher end of the socioeconomic scale, so keep your guard up!


          Adobe Acrobat Dc 15.006.30201 OS Denial Of Service Execute Code Overflow Memory corruption Vulnerability   
Adobe Acrobat Dc is prone to a denial of service (DoS) vulnerability.This allow a remote attacker to cause a denial of service (DoS) condition due to high consumption of system resources via certain vulnerable vectors.
          Oracle Solaris 10 availability Remote Code Execution Vulnerability   
vulnerability in Oracle Sun Solaris 10 and 11.3 allows local users to affect availability via vectors.
          Admidio 3.2.5 dates_function.php Sql Injection Vulnerability   
Admidio is prone to a SQL injection vulnerability.This allows remote attackers to execute arbitrary SQL commands via certain vulnerable vectors
          Eclinicalworks Patient Portal Sql Injection Vulnerability   
Eclinicalworks Patient Portal is prone to a SQL injection vulnerability.This allows remote attackers to execute arbitrary SQL commands via certain vulnerable vectors.
          Libtiff 4.0.6 TIFFFetchNormalTag Denial Of Service Vulnerability   
Libtiff is prone to a denial of service (DoS) vulnerability.This allow a remote attacker to cause a denial of service (DoS) condition due to high consumption of system resources via certain vulnerable vectors.
          Samsung Exynos Fimg2d null Remote Code Execution Vulnerability   
NULL pointer dereference in Samsung Exynos fimg2d driver for Android L(5.0/5.1) and M(6.0) allows attackers to have impact via vectors.
          Trend Micro Smart Protection Server 2.5 attackers Directory traversal Vulnerability   
Trend Micro Smart Protection Server is prone to a directory traversal vulnerability.This allows remote attackers to read arbitrary files via vulnerable vectors. The remote attacker might also have the ability to create, modify or overwrite critical files
          IBM Security Guardium Database Activity Monitor Execute Code Vulnerability   
IBM Security Guardium Database Activity Monitor 8.2 before p310, 9.x through 9.5 before p700, and 10.x through 10.1 before p100 allows local users to obtain administrator privileges for command execution via vectors.
          オリーブデオリーブ OLIVE des OLIVE 中綿ジャケット 冬 グレー   
オリーブデオリーブ OLIVE des OLIVE 中綿…
現在価格:2,592 円,入札数:-,終了日時:2017/07/02 22:42
          ジュンメン JUN MEN 美品 スーツ パンツ テーラード シングル 3つボタン 背抜き チャコールグレー M   
ジュンメン JUN MEN 美品 スーツ パンツ …
現在価格:5,270 円,入札数:-,終了日時:2017/07/01 22:43
          table bureau à tiroir latéral design indus atelier 60's   
80,00 EUR
Date de fin: dimanche juil.-30-2017 22:53:59 CEST
Achat immédiat pour seulement: 80,00 EUR
Achat immédiat | Ajouter à vos Affaires à suivre

          console métal_table atelier_style industriel_déco loft   
29,90 EUR (0 Enchères)
Date de fin: dimanche juil.-2-2017 13:20:43 CEST
Enchérir | Ajouter à vos Affaires à suivre

          table d'atelier art industriel vintage   
650,00 EUR
Date de fin: lundi juil.-10-2017 9:09:59 CEST
Achat immédiat pour seulement: 650,00 EUR
Achat immédiat | Ajouter à vos Affaires à suivre

          Screen 2 WebFlash 1.0   
You better show what you mean instead of describe it! With Screen 2 WebFlash you can record screen action and save it as Flash movie for your website! Create online tutorials fast and easy! You can show everything you want. For example how to use your software if you are a software developer. Or how to solve a computer problem if you maintain a website about computer problems. You can add texts, pictures and graphic objects after recording or change the exiting objects. The picture will be stored as JPEG images inside the flash files, that means small files. Only the parts of the screen that has changed will be stored inside the Flash file. The mouse movement is stored as Vector animation, so this will take as good as no disk space. If a button is pressed only this button will be drawn again. Flash files are very small, so they are very good for using them on your website. Flash files are the best solution for Internet animation today.
          Table bar intérieur bureau vintage design industriel années 50 60 atelier   
520,00 EUR
Date de fin: vendredi juil.-28-2017 19:50:55 CEST
Achat immédiat pour seulement: 520,00 EUR
Achat immédiat | Ajouter à vos Affaires à suivre

          PDF Editor Objects 5.5   
Edit PDF files just like a vector objects. You can select, scale, move and rotate all objects (text, pictures, lines etc.) with a few mouse clicks. With the tool "Free text edit" you can change existing text just like a text editor. If you press "Return" a line break will be inserted and all following text objects will move down. This new kind of PDF Editor is much faster in because of the new object concept. Our regular PDF Editor ist good for all tasks too, but this one is much better and faster if you need to edit pdf files every day. Other features are: copy and paste, delete objects, paint on existing pictures, add new vector objects. Add annotations, underline, highlight and strikeout text and edit bookmarks too. Change the order of the pages, delete pages, extract pages or add new pages (empty pages or from other pdf files). Add stamps like "Confidential" or "Top secret". The source code of the page (a language like HTML) is editable for you. Use the program to read and write encrypted pdf files. New in version 2.5: 1)New function: File/Reduce file size 2)Stamp functions 3)Page numbers and headers/footers function 4)Search and replace for the document text and search only function 5)Multiple form fields can be selected New functions for form fields 6) Better file repair function for corrupted pdf files 7)Faster drawing of vector objects 30% faster 8)Free highlighting function without the need for text objects (scanned file) 9)Split text objects into parts (split table rows into columns) New in version 2.6: 1) New form elements (pro version): Listbox, Drop-Down box, Radiobutton 2) New annotation fields: rectangle, ellipse, line, pencil 3) Rotate form fields 4) Setup the view of the file when opening the pdf file (for example show/hide bookmarks) 5) Page setup function for a scaled printout 6) A double click on a page under "Pages" opens the page in the Editor 7) Split graphic objects into lines New in this version: 27 new functions
          établi métallique atelier ancien design   
70,00 EUR (0 Enchères)
Date de fin: dimanche juil.-9-2017 17:24:49 CEST
Enchérir | Ajouter à vos Affaires à suivre

          Trace and vectorize 1.0   
Trace a picture. Draw curves and lines over the picture. You can then print or export this lines without the picture. You can export as DXF, EMF, SVG (vector data) or as picture (JPG. BMP etc.). You can use the program for example to trace a graphic to include it into a presentation or you can scan a plan to edit the lines. This program is your solution. The program supports quadratic Bezier curves and cubic Bezier curves so that you can lay the curves smooth around the contours. You can edit the knots and the control points of the curves until the curve matches your ideas. You can use the program to scan a picture or you can select a picture from hard disk. New in this version: First release
          Table établi console d'atelier meuble de métier design industriel esprit JEAN PR   
45,75 EUR
Date de fin: dimanche juil.-9-2017 20:42:34 CEST
Achat immédiat pour seulement: 45,75 EUR
Achat immédiat | Ajouter à vos Affaires à suivre

          CAD KAS PDF Editor 5.5   
Edit PDF files now! You can write annotations, add text, change the text (correct spelling errors) or delete words completely. Now you can also add or delete pictures and vector graphics and add text in any font you want! With the 11 new tools you can move and zoom the text and pictures and you can edit text blocks, insert empty lines or change the line breaks freely just like a text editor or word processor. Underline, highlight and strikeout text and edit bookmarks too. Change the order of the pages or delete pages. Also you can hide the information on a page so that it is invisible in the Acrobat Reader but can be unhidden later. You can change the page size or move the content. Add stamps like "Confidential" or "Top secret". The source code of the page (a language like HTML) is editable for you. Use the program to read and write encrypted pdf files. The program leaves the layout untouched after saving if you don't want to change it. New in version 2.5: 1)New function: File/Reduce file size 2)Stamp functions 3)Page numbers and headers/footers function 4)Search and replace for the document text and search only function 5)Multiple form fields can be selected New functions for form fields 6) Better file repair function for corrupted pdf files 7)Faster drawing of vector objects 30% faster 8)Free highlighting function without the need for text objects (scanned file) 9)Split text objects into parts (split table rows into columns) New in version 2.6: 1) New form elements (pro version): Listbox, Drop-Down box, Radiobutton 2) New annotation fields: rectangle, ellipse, line, pencil 3) Rotate form fields 4) Setup the view of the file when opening the pdf file (for example show/hide bookmarks) 5) Page setup function for a scaled printout 6) A double click on a page under "Pages" opens the page in the Editor New in version 3.1: 1) You can write characters in any language (unicode support) 2) Just add a new font which contains your characters New in this version: 27 new functions
          DXF 2 PDF 1.0   
Convert CAD plans and drawings from DXF file format into the PDF file format. This is useful if you need to make sure that everyone can view your cad plans without the need to have a CAD application installed. So you can publish your CAD drawing on internet or send it as email. The program saves all layout inside of one or multiple PDF files. You only have to select the output folder and the output size you desire. The program can batch converts as many files as you want with one mouse click. The program creates pdf files with vector commands for maximal quality.
          PDF 2 DXF 4.0   
Do you get PDF files with CAD drawings inside? Now you can extract these drawings and save it as DXF file and open it in you CAD application. PDF 2 DXF can open PDF files and save all vector objects as DXF file. Version 2.0 can now also convert text objects! Version 3.0 can also recognize lines in pictures and export the lines as dxf file. This program can open any existing pdf file. It is based on the technology of CAD-KAS PDF Editor. It is now also useful for scanned pdf files. You click on the button to recognize lines in a picture and then click on the picture to start this process. Version 4.0 has a function to vectorize all text objects. It can convert the complete page into a picture and then recognize the lines in this picture. And it can recognize lines in very large pictures in full resolution. New in this version: Version 4.0 has a function to vectorize all text objects.
          Font 2 DXF and G-Code 3.5   
Create a text in any installed true type font or a single line font and save the result as dxf file or G-Code file. So you can plot the font to use it for engravings with your NC machine etc. You only enter the text and click on "Save as DXF file...". You can also create stencil fonts. The text will be saved as polygon line information in the DXF file. In version 2.0 a vector font is build in. So now you can not only render the outline of True Type fonts but also single line fonts. Version 3 can output the G-Code for your NC machine directly. And this version can now create arcs not only line segments as output. New: now an Editor for midline fonts is included. So you can design your own single line fonts. You can let the program create a midline font/single line font from any true type font and the edit the midline font in the Editor. You can then create a DXF or G-Code output from your own midline font. The single line font can use bezier curves. If you export them the bezier curves can be converted into arcs for your NC machine. New in this version: New Supports Unicode fonts.
          Flash-Creator 1.0   
Flash Creator is a quick and refreshingly easy-to-use tool for creating animated Flash logos, banners, intros, headers and anything else that you can imagine right out of the box. It provides you with a point-and-click design environment that allows anyone, regardless of creative ability and knowledge of Flash technologies, blend texts, vector objects and images into an engaging Flash animation that can give a professional look to your website. Flash Creator's animations have an extremely small file size, only 10-20 Kb, and don't take long to load on a web page.Flash Creator is a quick and refreshingly easy-to-use tool for creating animated Flash logos, banners, intros, headers and anything else that you can imagine right out of the box. It provides you with a point-and-click design environment that allows anyone, regardless of creative ability and knowledge of Flash technologies, blend texts, vector objects and images into an engaging Flash animation that can give a professional look to your website. Flash Creator's animations have an extremely small file size, only 10-20 Kb, and don't take long to load on a web page.Flash Creator lets you add an object, set a motion path you want an object to follow and then specify its starting state and end state. In doing this, you can configure such object properties as size, color, transparency, and rotation. At any moment, you can preview your animation in a web browser to see how your changes affect the animation. When the desired result is achieved, you must customize properties for the entire animation, including its width, height, frame rate, and background color and then click on the Generate Flash File button. For your convenience, Flash Creator can generate a single SWF file and an HTML code for your page.
          PDF to Word 4.0   
With PDF to Word you can open a pdf file and save the content of the document as word file. The program maintains the layout, that means the position of the text, the pictures and the vector graphics.But this is of cause no lossless conversation but the most important thing can be maintained. If you want to edit PDF files completely lossless then you should use our CAD-KAS PDF Editor. New in this version: Completely new word export function
          カルバンクライン CALVIN KLEIN ウール チェック テーラードジャケット L ライトグリーンベージュ系 春秋   
カルバンクライン CALVIN KLEIN ウール チ…
現在価格:4,104 円,入札数:-,終了日時:2017/07/02 22:59
          ck Calvin Klein ジャケット テーラード シングル 2B 黒 38   
ck Calvin Klein ジャケット テーラード …
現在価格:6,458 円,入札数:-,終了日時:2017/07/02 22:41
          Calvin Klein SPORT ジャケット ジャンパー 長袖 ベージュ M   
Calvin Klein SPORT ジャケット ジャンパ…
現在価格:3,564 円,入札数:-,終了日時:2017/07/02 22:13
          ジネス Jines エスニック風ウエストゴム ロング丈ギャザースカート9ARグレー系ベース   
ジネス Jines エスニック風ウエストゴム …
現在価格:1,080 円,入札数:-,終了日時:2017/07/02 22:16
          ジネス Jines ワンピース シフォン プリーツ フレア パイピング ティアード袖 ネイビー   
ジネス Jines ワンピース シフォン プリー…
現在価格:1,674 円,入札数:-,終了日時:2017/07/01 22:17
          ジネス Jines ティアード装飾ノースリーブ キュロットワンピース 38黒ブラック   
ジネス Jines ティアード装飾ノースリーブ…
現在価格:1,080 円,入札数:-,終了日時:2017/07/02 22:34
          Reviewing the evidence for malaria advice and maps for TRAVAX? and Fitfortravel? - update   
Introduction Malaria remains a major public health threat in over 100 countries in which it is endemic, as well as in those countries which have in recent years made efforts to remove the vector.1 Th
          スケッチャーズ SKECHERS BOBS スリッポン スニーカー ラメ ブラック 黒 7 24.0 170525OK   
スケッチャーズ SKECHERS BOBS スリッポン…
現在価格:2,160 円,入札数:-,終了日時:2017/07/02 22:06
          Malaria Immunization   
A VACCINE ALTERNATIVE PROTECTS MICE AGAINST MALARIA –Vectored immunoprophylaxis (VIP) injection triggers creation of antibodies that prevent malaria in 70 percent of mice A study led by Johns Hopkins Bloomberg School of Public Health researchers found that injecting a vaccine-like compound into mice was effective in protecting them from malaria. The findings suggest a potential new path toward the elusive goal of malaria immunization. Mice injected with a virus genetically altered to help the rodents create an antibody designed to fight the malaria parasite produced high levels of the anti-malaria antibody. The approach, known as Vector immunoprophylaxis, or VIP, has … Continue reading
          Calligra seeks vectorgraphics artist   

KDE Project:

At Calligra we are mising several icons, including several applications icons.

So we are seeking an artist that are capable of creating oxygen compatible icons.

You will become a member of our very cool community, and take part of the revolution we are determined to make in the world of office and creative applications.

Contact us on irc channel #calligra or on our mailing list calligra-devel at kde.org


          gDraw - free software for you!   

gDraw Screenshot

I recently wrote a little piece of software – and I thought I should share it before Christmas. It is a 2D drawing program which creates a G-Code file that can be 3D printed. I just used it to make greeting cards and maybe you need a last minute gift and want to do the same.

Or you want to use it to make delicate window decoration, or sophisticated business cards, or you just need to keep your kids busy, or perhaps you have a much better idea for what this code can be used. In that case, drop me a line, because I’m curious to hear what you came up with!

Scroll down to find out how to download & to use gDraw.

2D greeting card printed with a 3D printer

2D greeting card printed with a 3D printer

2D greeting card printed with a 3D printer

Here’s how it works:

Download and installation:

First you need to download gDraw as .zip archive from my server – or you can find the code also on Github. gDraw is written in Processing, which you also have to download. Processing works with Windows, Mac OS X and Linux and you can get it here for free.

How to use:

Unzip the downloaded archive and place the folder “gDraw_V0_15” in Processing’s “Sketches” folder. Then run gCode from Processing.

You can draw in two modes, the free mode and the fixed mode. “Free” is nice for organic drawings, “fixed” is good for geometric drawings, as it creates always straight lines in a metric grid. You can toggle between the two modes either by pushing the button “F” on your keyboard or by hitting the free/fixed button in the menu on the left.

You can zoom in and out of the canvas with the mouse wheel.

Interrupt the line by hitting the space bar. The program displays the path of the printhead, when it just moves but does not print, as a thin line. Because the printhead might still squeeze out small amounts of plastic during those paths and therefore you might want to keep control over where the printhead moves exactly.

You can save drawings by hitting the save button and you can load them again by hitting the load button. As the current drawing will not be deleted when you load a path, you can merge drawings by loading one drawing after another.

Finally, in order to create printable G-Code, you hit the “save G-Code”-button. You have to give your file the extension “.gcode” otherwise your printer might not recognize it as a valid G-Code file.

How it works:

G-Code is the “language” that a 3D printer understands. It is a text file, with a list of coordinates for X, Y and Z axis, and also for E (the extrusion motor). The printer reads this file, moves from coordinate to coordinate and squeezes out plastic as indicated in the value for E.

gDraw is a simple vector drawing program that turns your drawings into G-Code so you can print your drawings as lines of plastic.

Disclaimer:

I have an Ultimaker 2, so I wrote the program in such way that it works with my printer. If you have a different printer, you might have to adapt the G-Code header in order to make it work for you. Have a look in the lines 486-511 of my code. This is where the G-Code header for the Ultimaker 2 is written.


          FLYING DOTTED WORLD MAP by atesbnc   
77161270

Description
Animated flying dotted world map.4K.Includes Alpha matte.


Keywords
illustration background design graphic isolated symbol outline map vector abstract art silhouette sign hand image country shape icon business geography global earth continent planet atlas cartography land worldwide globe green screen alpha matte international motion retro element flying map sticker map 4K
          Toshiba radio   
Saw the image of the 1955 Toshiba radio model 6SC-19 uploaded via the automatic system. Some of these old pieces of consumer electrical equipment had fantastic styling and this is no exception. Anyway, I felt the vectorization achieved for the original upload did not do this wonderful Wikimedia public domain image full justice. So I took the original jpeg, clipped the radio from the background and vectorised it with more detail resolved. The result should be useful for anyone wanting the detail and able to tolerate the extra MBytes.
          Ads by Zorable   
Éliminer Ads by Zorable de Internet Explorer Infections similaires à Ads by Zorable AdwareGenetik, BHO.byo, Agent.ag, Admess, Forbes, Qidion Toolbar, Porn Popups, AdTool.FenomenGame, Adware.WinAdClient, BrowserModifier.SearchV, nCASE, Common Dialogs, brilliantdigital, Adware.AdWeb.k, Tiger Savings, Adware.SA, Adware.AproposBrowser HijackerHomePageOnWeb.com/security/xp/, SEB Bank Hijacker, Alibaba Toolbar, Asafetynotice.com, MindDabble Toolbar, Buy-IS2010.com, Search.ueep.com, Search.Speedbit.com, Findamo.com, Malwareurlirblock.com, Websearch.lookforithere.infoRansomwareCerberTear Ransomware, Lomix Ransomware, Booyah Ransomware, YouAreFucked Ransomware, GhostCrypt Ransomware, Police Frale Belge Ransomware, .ecc File Extension Ransomware, Zyka Ransomware, Savepanda@india.com Ransomware, Ai88 Ransomware, Ecovector RansomwareTrojanKonov, Virus.Obfuscator.AFS, TROJ_TDSS.FAT, Puper, Trojan.Lop_com, Neeris.E, Packed.Generic.240,...

Read More Read More


          Vectorworks   
Vectorworks In diesem Kapitel finden Sie spezifische Informationen zu Vectorworks. Wo nicht explizit darauf hingewiesen wird, sind die Informationen versionsunabhängig (Vectorworks 2013, Vectorworks 2014, Vectorworks 2015). vectorworks index
          Vectorworks funktioniert nicht mehr   
Vectorworks funktioniert nicht mehr Die Meldung „Vectorworks 20xx funktioniert nicht mehr“ erscheint und Vectorworks stürzt ab. ---------- Die folgende Checkliste kann bei sämtlichen Versionen von Vectorworks verwendet werden: * Ist die aktuellste Version von
          Global Thermoplastic Prepreg Market 2017 Key Players - Tencate, Vectorams, Chomarat, Fibrtec, Porcher Industries   
Global Thermoplastic Prepreg Market 2017 Key Players - Tencate, Vectorams, Chomarat, Fibrtec, Porcher Industries Global Thermoplastic Prepreg Market Professional Survey Report 2017 The report’s analysis is based on technical data and industry figures sourced from the most reputable databases. Other aspects that will prove especially beneficial to readers of the report are: investment feasibility analysis,

          Synchrophasor Sensor Networks for Grid Communication and Protection   
This paper focuses primarily on leveraging synchronized current/voltage amplitudes and phase angle measurements to foster new categories of applications, such as improving the effectiveness of grid protection and minimizing outage duration for distributed grid systems. The motivation for such an application arises from the fact that with the support of communication, synchronized measurements from multiple sites in a grid network can greatly enhance the accuracy and timeliness of identifying the source of instabilities. The paper first provides an overview of synchrophasor networks and then presents techniques for power quality assessment, including fault detection and protection. To achieve this we present a new synchrophasor data partitioning scheme that is based on the formation of a joint space and time observation vector. Since communication is an integral part of synchrophasor networks, the newly adopted wireless standard for machine-to-machine (M2M) communication, known as IEEE 802.11ah, has been investigated. The paper also presents a novel implementation of a hardware in the loop testbed for real-time performance evaluation. The purpose is to illustrate the use of both hardware and software tools to verify the performance of synchrophasor networks under more realistic environments. The testbed is a combination of grid network modeling, and an Emulab-based communication network. The combined grid and communication network is then used to assess power quality for fault detection and location using the IEEE 39-bus and 390-bus systems.
          Beautiful big two story home with apartment for sale by owner   
City/Town: Corner Brook
Area: West Coast
Description:
This beautiful big two story home is only 13 years old and in excellent condition, with approximately 3352 sqft of developed living space locates at a quiet cul de sac 212 Georgetown Road, Corner Brook, NL. This home features newly modern one bedroom big in-law apartment with a separate entrance at the walk-out basement. The main floor has an office can be another bedroom, and a big family room, living room, kitchen with the gleaming red birch cupboards, dining room. The second floor has three bedrooms and an open den. Master bedroom has ensuite and walk-in closet. It has three full bathrooms and one half bathroom, also a big in-house garage and a shed. The main house has programmable convector efficient heating system, and in-law apartment has programmable thermostat for each baseboard heater. Big parking space can park four more cars. Location direct accesses to ATV and sled trails, hiking or biking trail. 10 minutes walking to bus stop. 8 to 12 minutes local driving to school, hospital, downtown, Dominion, Walmart, Mall. All appliances included.

Building Type: Big two story House
Bedrooms: 4
Bathrooms: 4
Build in 2004
Land Size: 80 X 110 - IRREG
Total Living Area: 3352 Square Feet
Location: 212 GEORGETOWN RD, Corner Brook, NL A2H 3X5
Features: Access to ATV and sled trails, hiking or biking trail, Landscaped, Balcony and Patios and new Deck, Air Exchanger, Programmable Electric Convector Efficient Heating, Newly In-law apartment, Nice view, Beautiful Garden, Big parking, Large Family Room, Quiet Cul de Sac, ALLSCO Energy plus windows, Ensuite, New hot water tank, Custom built high-quality house.
Building
Exterior Finish: Vinyl siding
Foundation: Concrete
Water/Sewer: Municipal
Heating: Programmable Electric Convector Efficient Heaters and Baseboard heaters
Flooring: Hardwood, Cushion/Tile/Lino, Carpet, Laminate
For an appointment to view, please text or call 709-7494518 or call 709-2214518, serious enquiry only.
image

          Inkscape 0.92.1   
Logiciel de graphisme vectoriel gratuit, en français et portable, doté de capacités similaires à Illustrator, Freehand, CorelDraw ou Xara X...
          250 free post ship, cotton organic label, customized labels, tag labels, kids labels, sewing labels, baby labels, name labels, apparel label by VikingLabelling   

65.00 USD

250 free post ship, cotton organic label, customized labels, tag labels, kids labels, sewing labels, baby labels, name labels, apparel label

:::SPECIFICATIONS:::
♥Size: Finished measurement smaller than below size:
End fold: 0.81”x2.38” (2cm x 6cm),including seam allowance 0.2”(5mm) at left and right side.
Center fold: 0.81”x2.38” (2cm x 6cm) before folding. including seam allowance 0.2”(5mm) at both end.
Or there is a additional cost for oversize.

♥Color:
A.Natural/black/bleach white cotton tape,logo or text in one color only,black or white or others, if printing color is two or more,the price will be different with this listing,we will check and offer you new price then.
B.One order,one color combination,it can’t be splited to two color combination,it mean you order 250pcs,color is black on white background,the cost will be different if you want to split to 125pcs black on white background,125pcs white on black background.
♥Material: cotton tape
♥Type: end fold ,center fold.
We don’t suggest straight cut cause the edge is easy to fray out.
♥Technical: screen printing,strong color fastness,good for washing and won’t fading.
♥Usage: place at neck or side seam
♥Qty of Item: 250pcs (minimum order is 100pcs) ,pre-cut and fold before shipping.
♥Free design service
♥Procedure:
1)we confirm the label detail first,for example: quality,design(color/font name/dimension),quantity,order ETA(estimated time of arrival).
2)then we will offer you cost,if it is ok for you,we will send listing to you for payment,then our designer will send artwork for you approval after receipt of your order.
3)We will start production after you approve it,and we can send sample picture for you approval before delivery if you want.
♥File: high resolution JPG,vector AI/CDR/PDF file are acceptable also.we prefer there is TPX pantone color instruction for your design,it help us to make the label color as close as possible.
♥Time: it take 10-14 days for production after the artwork is approved,then free ship by post,it take another 10-25 days,sometime longer than 1 months,if you want to receive the parcel on time or asap,we suggest to ship it by express,it take 4-8 days only,please contact with us to confirm the express cost.
♥Free shipping by post to all country.

:::PAYMENT, SHIPPING, RETURN POLICIES:::
Please refer our shop policies at
https://www.etsy.com/shop/VikingLabelling/policy

:::Section of VikingLabelling
woven label: https://www.etsy.com/hk-en/shop/VikingLabelling?section_id=12421161&ref=shopsection_leftnav_1

cotton label: https://www.etsy.com/hk-en/shop/VikingLabelling?section_id=12898362&ref=shopsection_leftnav_3

hangtag https://www.etsy.com/hk-en/shop/VikingLabelling?section_id=13672640&ref=shopsection_leftnav_5

:::LINK US:::
♥Find more charms and related products: vikinglabelling.etsy.com/
♥Vist VikingLabelling at Facebook: http://www.facebook.com/vikinglabelling


          Technology Associate, Team Lead for ATS Principal Based Strategies - Morgan Stanley - New York, NY   
Machine Learning including Regression and Clustering techniques, Support Vector Machines, Neural Networks, Probabilistic Graphical Models, and Econometric;...
From Morgan Stanley - Mon, 22 May 2017 20:45:35 GMT - View all New York, NY jobs
          Is it okay to descend to MIAs once established on the course without clearance?   
Hi. Let’s say you are being vectored to the final approach course and instructed to intercept the localizer at 4000ft. You look down on the approach chart, and it says the Minimum IFR altitude (MIA) of the segment you are going to intercept is 3500ft. After a couple of minutes, you have intercepted the localizer [...]
          Chill Out Electro Lounge Music Podcast No. 260   
Diese Chill Out Electro Lounge Music Podcast Episode beinhaltet die folgenden Tracks: G-Dak – May the Chill be 8 U (cc by) SickRobot – Vector Dust (cc by) Comatic – Rusty (cc by) (cc = creative commons license) Mehr Chill Out Music bei Traex.de Chill Out Electro Lounge Musik Radio  … Continue reading
          クロエ CHLOE パンツ スラックス ベージュ 黒 M ボトムス グレンチェック サイドジップ 36 ウール100%   
クロエ CHLOE パンツ スラックス ベージュ…
現在価格:8,424 円,入札数:-,終了日時:2017/07/02 21:30
          クロエ CHLOE ワイドパンツ バギーパンツ 黒 ブラック XS ボトムス 34 コットン100% 綿   
クロエ CHLOE ワイドパンツ バギーパンツ …
現在価格:5,555 円,入札数:-,終了日時:2017/07/02 21:09
          クロエ CHLOE パンツ スラックス ネイビー 紺 S ボトムス 無地 34 ビスコース センタープレス   
クロエ CHLOE パンツ スラックス ネイビー…
現在価格:5,292 円,入札数:-,終了日時:2017/07/02 21:40
          クロエ ショートパンツ キュロット ジョーゼット ドレープ 36 黒   
クロエ ショートパンツ キュロット ジョー…
現在価格:3,780 円,入札数:-,終了日時:2017/07/02 22:38
          Новинка ПАЗа: автобус Vector Next в "люксовом" исполнении   

http://img12.nnm.me/4/7/1/3/2/b754a2c609a712f169d1a9afe9f.jpg
Автобус Vector Next, флагман Павловского автобусного завода, обзавелся "люксовой" модификацией. Новинка отличается повышенной комфортностью и может использоваться для междугородных, а также корпоративных перевозок.

Читать далее


          FIFO Stack and LIFO Queue   
Recently, I found this class in one of our applications:
 public class FIFOStack extends Vector {

	public synchronized Object push(Object o) {
		add(o);
		return o;
	} 

	public synchronized Object pop() {
		if (isEmpty()) {
			return null;
		} 
		return remove(0);
	} 

	public synchronized boolean empty() {
		return isEmpty();
	} 
} 

I was imagining the developer thinking: "If only I had a class like Stack, except it would work in FIFO mode". The code is really old, so there was no Queue implementation in the JDK at this time. But still, definitions of Stacks and Queues are way older than the JDK.

Out of curiosity, I looked in the code for LIFO Queues. To my surprise, I found 2, both in the JDK itself. One caught my attention, due to the comment preceding it. See for yourself, in the SynchronousQueue class:

    
    /*
     * To cope with serialization strategy in the 1.5 version of
     * SynchronousQueue, we declare some unused classes and fields
     * that exist solely to enable serializability across versions.
     * These fields are never used, so are initialized only if this
     * object is ever serialized or deserialized.
     */

      

I do not have a Java 1.5 around to check, but if I understand correctly the comment, serialization of SynchronousQueue in Java 1.5 was too tied to its implementation. So when they changed it in Java 1.6, they had to create the old LifoWaitQueue internal class just so that serialization would work with previous Java versions. Backward compatiblity can make to ugly code sometimes. The funny part is that the internal LifoWaitQueue and FifoWaitQueue classes were replaced by TransferQueue and TransferStack. Even the best of us can make naming mistakes...

          Easy Fit Deluxe Extra Tall Pet Gate 75-82cm x 110cm - White   

The Easy Fit Deluxe Extra Tall Pet Gate is made from the highest quality materials to ensure that you can protect your pet; from the smallest of puppies to larger dogs, as well as preventing access to your children.

The Gate is a pressure fit system that requires no tools to install and comes with all the instructions and equipment you need to fit the gate. The pressure fit system allows you to install the gate without drilling into the wall, perfect for rental or holiday accomodation. The gate has a simple one handed squeeze and lift opening system which will open both ways and includes a triple locking mechanism to help keep your little ones in and pets out.

Fitting gaps between 75 - 82cm, this will fit on all standard shape and size door frame without the use of tools or screws, although pressure cups are included for extra safety.

 

Regular Price: £44.99

£36.99


          Vectoring: Telekom muss VDSL-Nutzer kündigen   
Es trifft auch die Deutsche Telekom: Die Vectoring Company muss einem Kunden kündigen, weil ein anderer Betreiber Vectoring einsetzt. Es handelt sich um EWE. (Vectoring, DSL)
          子供服 Sunny River タンクトップ ラメ 英字プリント 160 水色   
子供服 Sunny River タンクトップ ラメ 英…
現在価格:540 円,入札数:-,終了日時:2017/07/02 22:58
          キッズ Sue タンクトップ ロゴ ラメ プリント ノースリーブ 160   
キッズ Sue タンクトップ ロゴ ラメ プリ…
現在価格:324 円,入札数:-,終了日時:2017/07/02 22:55
          Measurements of the production of jets in association with a W or Z boson with the ATLAS detector   
The production of jets in association with vector bosons is an important process to study QCD in a multi-scale environment. The ATLAS collaboration has performed measurements of vector boson+jets cross sections, differential in several kinematic variables, in proton-proton collision data taken at center-of-mass energies of 8 TeV and 13 TeV. The measurements are compared to state-of-the art theory predictions and can be used to constrain the gluon PDF. In data collected at 8 TeV, the collaboration has measured the production of W boson+jets with a large transverse momentum of the leading jet, which enriches the collinear production of the gauge boson and a jet. The measurements are compared to state-of-the-art QCD calculations and Monte Carlo simulations.
          Sedia Slimmy   

Silla de cocina sólidos Slimmy gracias a una estructura de acero pintado y cómodo gracias al asiento tapizado cubierta de tela. Silla moderna por un vector de cocina acabados personalizables para una combinación perfecta con la decoración de la habitación.

Las mediciones silla moderna: L. 43 P. 50 H. 85 cm (altura del asiento H. 48 cm)

Price: 110,00 € Special Price: 85,80 €


          Tavolo Crete   

moderna del vector con las piernas en Creta cristal, disponible en la versión rectangular o cuadrada en varios tamaños. Tabla caracterizado por las piernas de cristal transparentes colocados a 45 ° que el ángulo del plano, que se inserta en este último por medio de un muele, que permite que el perfil de las piernas para estar a la vista desde el mismo plano.

Tabla en el diseño elegante y refinado, dada por la transparencia de las piernas en combinación con el plan que puede ser ecomalta, laminado o estratificado HPL en varios colores.

Medidas modernas de mesa fija y extensibles H. 74,5 cm:

  • cuadrado de 100x100 (150-200) cm (4 asientos (6-8))
  • cuadrada 110x110 (160-210) cm (6 (8-10) asientos)
  • cuadrada 120x120 (170-220) cm (6 (8-10) asientos)
  • cuadrada 130x130 (180-230) cm (6 (8-10) asientos)
  • cuadrada 140x140 (190-240) cm (8 (10-12) asientos)
  • cuadrada 150x150 (200-250) cm (8 (10-12) asientos)
  • cuadrada 160x160 (210-260) cm (8 (10-12) asientos)
  • 90x160 rectangulares (210-260) cm (6 (8-12) asientos)
  • 100x180 rectangular (230-280) cm (8 (10-12) asientos)
  • 100x200 rectangular (250-300) cm (8 (10-12) asientos)
  • 100x220 rectangular (270-320) cm (10 (10-12) asientos)

Las plazas de asiento expresadas son indicativos y representan el número máximo disponible, dependiendo de la anchura de las sillas.

plano de fresado de melamina y laminados

Fresata su piano in laminato e nobilitato

plano de fresado en ecomalta

Fresata su piano in ecomalta

Price: 980,00 € Special Price: 764,40 €


          Tavolo Houston   

Houston moderna del vector con las piernas inclinadas sólidos en hierro y tapa de madera sólida. mesa de comedor con patas de mesa y de estilo rústico, ideal para un diseño orientado muebles o elegante lamentable.

tabla ampliamente personalizable fijo también gracias a la elección de los diferentes suelos de madera que difieren en espesor y perfil, satisfaciendo todos los muebles de la más tradicional a la más moderna.

Medidas mesa de madera maciza:

  • 90x160 cm (6 plazas)
  • 100x180 cm (8 plazas)
  • 100x200 cm (8 plazas)
  • 100x220 cm (10 escaños)
  • 100x250 cm (10 escaños)
  • 100x300 cm (12 escaños) no están disponibles con la parte superior de Barcelona

La altura final de la tabla depende del espesor de la parte superior que se desea tener. Para los planes:

  • Barcelona, ​​H. 74.5 cm
  • París, Rio y Toledo H. 76 cm
  • Toronto H. 76,5 cm
  • Niza H. 78,4 cm

Las plazas de asiento expresadas son indicativos y representan el número máximo disponible, dependiendo de la anchura de las sillas.

Tabla sala de estar con la posibilidad de tener a lo sumo dos de L. 50 cm extensiones externas que se acoplan con los medios de suelo de un sistema de bayoneta. Las extensiones para que coincida con el suelo, permiten dar cabida a más comensales cómodamente.

Price: 1.265,00 € Special Price: 923,45 €


          Tavolo Oasi   

Tabla Oasis diseño Bontempi, con la columna central en la parte superior de metal y disponibles en madera, vidrio o cristal resistente a los arañazos. Vector elegante y refinado ideal para ser colocado en la sala de estar de una decoración original.

Las mediciones de mesa moderna sala de estar:

  • Fijos L. 160 P. 90 H. 75 cm (6 plazas)
  • Fijos L. 190 P. 90 H. 75 cm (8 plazas)
  • Fijos L. 190 P. 106 H. 75 cm (8 plazas)
  • Fijos L. 200 P. 106 H. 75 cm (8 plazas)
  • Fijos L. 250 P. 106 H. 75 cm (10 escaños)
  • Extensibles L. 160/240 D. 90 H. 75 cm (6/10 sentados)
  • Extensibles L. 190/290 P. 106 H. 75 cm (8/12 sentados)

Las plazas de asiento expresadas son indicativos y representan el número máximo disponible, dependiendo de la anchura de las sillas.

La base cuadrada del soporte está terminada sólo en acero, mientras que la columna está disponible en varios colores.

La tabla de diseño de la habitación disponible con 1,2 cm de espesor superior vidrio, chapa de madera de 5 cm de espesor, el espesor de madera maciza de madera de 5 cm o descortezados madera sólida a lo largo de los 4 cm de espesor.

La madera es de madera maciza con tapa de chapa de madera con bordes irregulares.

Price: 1.463,00 € Special Price: 1.097,25 €


          Tavolo Taribo   

Mesa con patas de madera Taribo, por diseño nórdico, que se coloca en una sala de estar amplia y luminosa. Moderna del vector con las piernas elegantes de abeto antigüedad ligeramente inclinada y la forma original, dando una línea original.

Fijo o mesa extensible con la tapa en laminado, melamina, la chapa o ecomalta en varios tonos y tamaños. La versión extensible, puede introducir hasta un máximo de dos extensiones de 50 cm cada una, igualando el suelo, que puede ser almacenado por separado.

La forma cuadrada de las piernas, con la combinación del plan de ecomalta con bordes sfaccetati a 45 °, hacen de esta mesa, un modelo actual. El estilo escandinavo le permite colocar la mesa, incluso en un plan abierto, moderno y de moda.

Medidas modernas de mesa fija y extensibles H. 75 cm:

  • 90x160 (210-260) cm (6 (8-10) asientos)
  • 100x180 (230-280) cm (8 (10-12) asientos)
  • 100x200 (250-300) cm (8 (10-12) asientos)
  • 100x220 (270-320) cm (10 (10-12) asientos)

Las plazas de asiento expresadas son indicativos y representan el número máximo disponible, dependiendo de la anchura de las sillas.

Perfil Ecomalta plan de

Piano tavolo in ecomalta a 45°

otros planes Perfil

Piano tavolo in legno

Price: 750,00 € Special Price: 585,00 €


          Rentokil Aims to Break the Mosquito Life Cycle Through Collective Efforts to Save Lives   

Petaling Jaya, Selangor -- (SBWIRE) -- 12/27/2016 -- ACTING as Aedes Fighters, dedicated volunteers from Rentokil Initial Malaysia have worked together on a mission to eradicate mosquito breeding grounds, reducing the mosquito population, and to create healthier and safer environments for our communities. This nationwide initiative is part of the organisation's annual corporate social responsibility programme; Community Oriented Health Education Programme (COHEP), which aims to galvanise the communities in Malaysia into taking actions to preserve a clean and hygienic environment in and out of their residency to keep mosquitoes at bay.

Today, volunteers of the organisation in their respective states; Ipoh, Kuantan and Klang Valley have completed their mission with great efforts and achieved the objectives of this programme. The team in Ipoh has contributed to Salvation Army Ipoh Children's Home, the Kuantan volunteers has helped to clean up Rapha Children's Home while the Klang Valley team has certainly created a healthier and safer environment for the old folks here in Pusat Jagaan Warga Emas Mitchell, Petaling Jaya, as well as the neighbourhood. The general agenda of the programme includes an opening speech, a cleaning session, and also complimentary pest control services such as general pest spraying, bed bug and termite inspection for the home, and water-based fogging around the neighbouring areas.

The united efforts of all volunteers have resulted in cleaner and safer environments which include the successful removal of stagnant waters to avert the development of mosquito larvae, trimmed trees and plants in the garden to avoid attracting mosquitoes, and cleaned up indoor spaces. These accomplishments have indeed achieved the objectives of the programme, to breaking mosquito life cycle through proper sanitation and collective efforts.

Committed to educating and empowering every individual to take actions in fighting mosquitoes, Rentokil Initial has been driving this programme since 2014 to address this pressing public health concern. The organisation strongly advocates the vitality of sustainable sanitation, concerted effort, and an Integrated Mosquito Management (IMM) approach in protecting Malaysians from vector-borne diseases such as dengue in the long run. Proper sanitation at home is the simplest yet most significant action we can all practise to prevent mosquito breeding grounds from being developed in the first place, followed by corrective treatments targeted at different stages of the mosquito life cycle to reduce its population.

'Living our mission in 'Protecting People and Enhancing Lives' and as part of our continuous efforts to create healthier and safer environments, we are always educating and advocating the importance of collective efforts to maintain a safe, healthy and happy environment in our communities.' said Carol Lam, the Managing Director of Rentokil Initial Malaysia. The volunteers from all other states in Malaysia will be conducting this meaningful programme throughout 2017.

Dengue in Malaysia

Dengue is the fastest-growing vector-borne infection in the world and Southeast Asia is the epicenter of dengue mosquito breeding due to its tropical climate. In Malaysia, a total of 97,052 dengue fever cases with 229 deaths have been recorded as of 13 December 2016.

About Rentokil Initial Malaysia
Established in Malaysia for 50 years, Rentokil Initial is a pest control and hygiene services market leader in the country. For more information on our services, please contact:

You may also follow Rentokil Pest Control Malaysia Facebook page at http://www.facebook.com/rentokil.malaysia/ and Initial Hygiene Malaysia Facebook page at http://www.facebook.com/initial.malaysia/ for more updated news on their continuous efforts in protecting people and enhancing lives.

For more information on this press release visit: http://www.sbwire.com/press-releases/rentokil-aims-to-break-the-mosquito-life-cycle-through-collective-efforts-to-save-lives-754642.htm

Media Relations Contact

Louise Leong
Marketing Director - Malaysia, Thailand, Brunei & the Philippines
Rentokil Initial Malaysia
Telephone: 1300 885 911
Email: Click to Email Louise Leong
Web: http://www.rentokil.com.my


          Rentokil Malaysia Battling Rising Dengue and Zika Cases with Integrated Mosquito Management Programme   

Besides high number of dengue cases in Malaysia, Zika infections have also started to emerge locally. Learn what could be the main contributory factors and what can be done to curb this.

Petaling Jaya, Selangor -- (SBWIRE) -- 10/05/2016 -- In recent decades, global dengue and Zika outbreaks have grown exponentially. World Health Organisation (WHO) has estimated that about 50% of the world's population are at risk for dengue and as many as four million people could be infected by Zika towards year end. As of August 2016, up to 67,437 dengue cases were reported in Malaysia with 153 deaths. The concerns on mosquito-borne diseases in the nation are now further exacerbated with the presence of Zika virus resulting in a total of 6 confirmed Zika cases so far.

According to Dr. Rose Nani Mudin, the Head of Vector Borne Disease Sector at the Ministry of Health Malaysia, climate change with alternating rainy and scorching weather is one of the main causes in the high density of mosquitoes. Furthermore, the hot and dry weather in Malaysia also made it easier for Aedes to breed compared to countries with a temperate climate. She further added that littering and inappropriate solid waste disposal have also resulted in high mosquito breeding index.

Dr Ashok Zachariah Philip, President of the Malaysian Medical Association, revealed that many Malaysians only dengue-proof their houses, but not the entire neighbourhood and this is insufficient to fight the outbreak. The community should in fact work towards a more sustainable protection by ensuring cleanliness and hygiene not only in their houses but around the neighbourhood.

Dr Philip also emphasised that mosquito-borne diseases like dengue and Zika virus infection can lead to devastating effects on infected individuals and their families. Therefore, he urges communities to clean up their neighbourhood and request for local councils to inspect potential breeding grounds, especially when there are construction sites nearby.

How Mosquito Borne Disease like Dengue is Inflicting Pain in Life

Often mistaken for the flu or normal fever, some people contracted dengue without realising it until the symptoms have worsened. Take Ruby as an example, a college student who suffered from symptoms of joint pains and migraines, and dismissed them as stress-related. She only visited the doctor when the pain became unbearable and was tested positive for the virus. Ruby then went through a spell of depression, worrying about her well-being and exams. Since her ordeal, she also shares her arduous experience with family and friends hoping that they will take preventive measures to protect themselves.

Besides causing a lot of pain and discomfort to the victims, dengue also greatly impacts the family members who care for the patient. Clementine from Petaling Jaya was terribly distressed when her mother contracted the virus and her work productivity was tremendously affected as a result of the many days off that she had to take to nurse her ailing mother. Once her mother recovered, Clementine has started to look into solutions for her home to be completely protected from mosquitoes.

Although dengue fever could ultimately result in death, the patient could be cured if given appropriate treatment at the right time. But is it different from Zika which will eventually lead to severe disabilities, especially to children (Microcephaly). A new research at The Rockefeller University and La Jolla Institute for Allergy and Immunology suggests that certain adult brain cells may be vulnerable to infection as well. If the breeding of Aedes mosquitoes continues to remain uncontrolled, many of us in Malaysia would be at risk of contracting the virus.

Making the shift

Unfortunately, despite the alarming dengue cases, most Malaysians still maintain a reactive approach towards this epidemic. They only respond and take preventive measures when someone they know has contracted the virus. Many underestimate the perilous and interrelated burden of such mosquito-borne diseases and therefore, take little effort in controlling the vector. This reactive approach is indeed the biggest challenge in achieving a successful and sustainable effort of mosquito control. As part of a holistic solution to combat this mosquito-borne disease, Malaysians must adopt a proactive approach instead and the first step is ensuring zero stagnant water around their neighbourhood while maintaining cleanliness and hygiene.

We should also do our part by constantly keeping alert on potential breeding sites and continuously engage the entire neighbourhood in taking action. This is because all dengue hotspots are also considered hotspots for Zika since the virus is being spread by the same vector, which is the Aedes mosquito. Consistent information to raise awareness within the community can help to educate and empower each individual to protect themselves from the virus. Everyone is equally susceptible to the virus as Aedes mosquitoes do not choose their victims.

Combating Mosquito effectively

Every mosquito species go through four distinct stages in its life cycle – egg, larva, pupa and adult. A teaspoon of clean stagnant water, which is easily found anywhere, is all it takes for an Aedes aegypti mosquito to lay a batch of eggs. Hence, for a winning battle, we should fight our enemy at every stage of its life cycle.

As part of their continuous effort to protect Malaysians from mosquitoes, leading pest company like Rentokil has designed an Integrated Mosquito Management (IMM) programme, which has proven to be an effective approach to mosquito control in the long run. The IMM programme encourages the public to practise holistic approach in fighting mosquitoes at every stage of their life cycle, through the combination of removing potential mosquito breeding grounds, larviciding, water-based fogging and the use of adult mosquito traps. However, as mosquito species continue to evolve, it is equally crucial to have consistent community action and continuous information sharing to achieve a successful and long-term prevention.

"People often take the impact of mosquito-borne diseases like dengue for granted, but when we or our loved ones are affected, this impacts our life greatly. Hence, we need to be proactive in combating mosquitoes from the get-go. This is why at Rentokil Initial, we are committed to protecting people from the dangers of pest-borne diseases while enhancing their lives with integrated solutions that safeguard both their health and wellbeing." says Carol Lam, Managing Director of Rentokil Initial Malaysia.

About Rentokil Pest Control Malaysia
Rentokil Pest Control is part of Rentokil Initial group, one of the largest business services companies in the world. At Rentokil Initial Malaysia, we have 2 brands that are focused on providing the best services with nationwide coverage, fast response and expert technical knowledge: Rentokil Pest Control and Initial Hygiene.

Visit http://www.rentokil-initial.com.my to find out how Rentokil Initial (M) Sdn Bhd services can add value to different business sectors.

For more information on this press release visit: http://www.sbwire.com/press-releases/rentokil-malaysia-battling-rising-dengue-and-zika-cases-with-integrated-mosquito-management-programme-729686.htm

Media Relations Contact

Louise Leong
Marketing Director - Malaysia, Thailand, Brunei & the Philippines
Rentokil Initial Malaysia
Telephone: 1300 885 911
Email: Click to Email Louise Leong
Web: http://www.rentokil.com.my


          Monitor and Analyze your USB Devices   

USB Monitor (Device Monitoring Studio) for Windows 2000/XP/Vista has been released.

London, UK -- (ReleaseWire) -- 04/05/2007 -- The USB Monitor product is now part of the forth-coming Device Monitoring Studio solution, which will offer the ultimate monitoring functionality, joining the power and functionality of our USB Monitor, Serial Monitor and Accurate Network Monitor products.

The current release contains the USB monitoring support, continuing and extending the unique features of the USB Monitor 2.37.

Here's the brief list of new and updated features:

1. Superior performance:
* the product is now capable of real-time monitoring of high-speed devices (with throughput up to tens MB/sec)
* allows you to configure several visualizers for the monitoring session without affecting performance and memory consumption

2. Better scalability:
* offers effective support for multi-core processing and hyper-threading technology, fast memory and HDDs, providing you the unique experience while monitoring in real-time
* allows you to monitor several USB devices at the same time or monitor and play back log(s) at the same time

3. User-friendliness:
* fully customizable user interface: floating/docking windows with auto-hide support, configurable toolbars and keyboard shortcuts with export/import capability
* the use of vector icons allows smooth running on any font DPI settings
* the powerful Statistics visualizer displays statistical data, collected for the monitoring session, including the momentary data for bytes transferred/sec, packets/sec, bytes read/sec and bytes written/sec counters

4. Informational:
* provides you with a lot of technical information about connected USB devices, including the USB device descriptor, configuration descriptor, HID descriptors and part of Windows device tree, related to the selected USB device
* special visualizers for USB Mass Storage, Still Image and HID device classes

Product Home Page:
http://www.hhdsoftware.com/Products/home/usb-monitor.html

Availability
The product is available in three editions: Lite, Standard and Professional.
http://www.hhdsoftware.com/Products/compare/usb-monitor.html

Download Link:
http://www.hhdsoftware.com/Download/usb-monitor.exe> (2.35 Mb)

System Requirements:
512MB RAM, 512MB HD free space

Pricing:
* Lite - $59.99
* Standard - $99.99
* Professional - $199.99

About HHD Software:
HHD Software is a fast growing young company which was founded in 2000 and works on providing the high quality monitoring solutions. Its software is used by a lot of companies and organizations all over the world, including Microsoft, Apple, NASA, Lockheed Martin, Intel, IBM, Hewlett Packard, Honeywell, Adobe, Broadcom, LG Electronics, Samsung, Hitachi, Xerox and Sony.

For more information on this press release visit: http://www.releasewire.com/press-releases/release-11313.htm

Media Relations Contact

Vasiliy Vasilyev
USB Monitor (Device Monitoring Studio)
Email: Click to Email Vasiliy Vasilyev
Web: http://www.hhdsoftware.com/


          Lintcode 43 - Maximum Subarray III   
Related: Lintcode 41,42 - Maximum Subarray I,II
http://www.lintcode.com/en/problem/maximum-subarray-iii/
Given an array of integers and a number k, find k non-overlapping subarrays which have the largest sum.
The number in each subarray should be contiguous.
Return the largest sum.
 Notice
The subarray should contain at least one number
Example
Given [-1,4,-2,3,-2,3]k=2, return 8
Time: O(k * n^2)
Space: O(k * n)
Using sums[i][j] to denote the maximum total sum of choosing i subarrays from the first j numbers.
We can update by sums[i][j] = max(sums[i - 1][t] + maxSubarraySum(nums[t+1...j])), which means using the first t numbers to choose i - 1 subarrays, and plus the maximum sum from remaining numbers(nums[t]...nums[j-1]). We want to try all possible split point, so t ranges from nums[i-1] to nums[j-1].
In the most inner loop, it will try to examine the max sum from the subarray nums[t] to nums[j-1], where t goes from j-1 down to i-1. We can compute for each t the maximum sum. However, if we scan from right to left instead of left to right, we only needs to update the maximum value incrementally. For example, t's range is [1..5], so at first, the max sum is pick from [5], then it's picked from [4...5], ..., finally picked from [1...5]. By scanning from right to left, we are able to include the new number into computing on the fly.
  public int maxSubArray(ArrayList<Integer> nums, int k) {
if (nums == null || nums.size() < k) {
return 0;
}
int len = nums.size();
int[][] sums = new int[k + 1][len + 1];
for (int i = 1; i <= k; i++) {
for (int j = i; j <= len; j++) { // at least need one number in each subarray
sums[i][j] = Integer.MIN_VALUE;
int sum = 0;
int max = Integer.MIN_VALUE;
for (int t = j - 1; t >= i - 1; t--) {
sum = Math.max(nums.get(t), sum + nums.get(t));
max = Math.max(max, sum);
sums[i][j] = Math.max(sums[i][j], sums[i - 1][t] + max);
}
}
}
return sums[k][len];
}
d[i][j]代表0->i-1元素中j个subarray的maxsum  (注意不包含元素i)
d[i][j] = max(d[i][j], d[m][j-1] + max) (m = j-1 .... i-1; max需要单独求,是从元素i-1到m的max subarray, 用求max subarray的方法,需要从后往前算)
  1. public int maxSubArray(ArrayList<Integer> nums, int k) {  
  2.     int n = nums.size();  
  3.     int[][] d = new int[n+1][k+1];  
  4.     for (int j = 1; j <= k; j++) {  
  5.         for (int i = j; i <= n; i++) {  
  6.             d[i][j] = Integer.MIN_VALUE;  
  7.             int max = Integer.MIN_VALUE;  
  8.             int localMax = 0;  
  9.             for (int m = i-1; m >= j-1; m--) {  
  10.                 localMax = Math.max(nums.get(m), nums.get(m)+localMax);  
  11.                 max = Math.max(localMax, max);  
  12.                 d[i][j] = Math.max(d[i][j], d[m][j-1] + max);  
  13.             }  
  14.         }  
  15.     }  
  16.     return d[n][k];  
  17. }  
http://www.cnblogs.com/lishiblog/p/4183917.html
DP. d[i][j] means the maximum sum we can get by selecting j subarrays from the first i elements.
d[i][j] = max{d[p][j-1]+maxSubArray(p+1,i)}
we iterate p from i-1 to j-1, so we can record the max subarray we get at current p, this value can be used to calculate the max subarray from p-1 to i when p becomes p-1.

 7     public int maxSubArray(ArrayList<Integer> nums, int k) {
8 if (nums.size()<k) return 0;
9 int len = nums.size();
10 //d[i][j]: select j subarrays from the first i elements, the max sum we can get.
11 int[][] d = new int[len+1][k+1];
12 for (int i=0;i<=len;i++) d[i][0] = 0;
13
14 for (int j=1;j<=k;j++)
15 for (int i=j;i<=len;i++){
16 d[i][j] = Integer.MIN_VALUE;
17 //Initial value of endMax and max should be taken care very very carefully.
18 int endMax = 0;
19 int max = Integer.MIN_VALUE;
20 for (int p=i-1;p>=j-1;p--){
21 endMax = Math.max(nums.get(p), endMax+nums.get(p));
22 max = Math.max(endMax,max);
23 if (d[i][j]<d[p][j-1]+max)
24 d[i][j] = d[p][j-1]+max;
25 }
26 }
27
28 return d[len][k];
31 }
Use one dimension array.
 7     public int maxSubArray(ArrayList<Integer> nums, int k) {
8 if (nums.size()<k) return 0;
9 int len = nums.size();
10 //d[i][j]: select j subarrays from the first i elements, the max sum we can get.
11 int[] d = new int[len+1];
12 for (int i=0;i<=len;i++) d[i] = 0;
13
14 for (int j=1;j<=k;j++)
15 for (int i=len;i>=j;i--){
16 d[i] = Integer.MIN_VALUE;
17 int endMax = 0;
18 int max = Integer.MIN_VALUE;
19 for (int p=i-1;p>=j-1;p--){
20 endMax = Math.max(nums.get(p), endMax+nums.get(p));
21 max = Math.max(endMax,max);
22 if (d[i]<d[p]+max)
23 d[i] = d[p]+max;
24 }
25 }
26
27 return d[len];
30 }

X.
http://hehejun.blogspot.com/2015/01/lintcodemaximum-subarray-iii.html
跟之前一样这里我们维护两个东西,localMax[i][j]为进行了i次partition前j个数字的最大subarray,并且最后一个subarray以A[j - 1](A为输入的数组)结尾;globalMax[i][j]为进行了i次partition前j个数字的最大subarray(最后一个subarray不一定需要以j - 1结尾)。类比之前的DP方程,我们推出新的DP方程:
  • globalMax[i][j] = max(globalMax[i][j - 1], localMax[i][j]);
  • localMax[i][j] = max(globalMax[i - 1][k] + sumFromTo(A[k + 1], A[j])) 其中 0< k < j;
第一眼看上去对于第二个DP方程我们需要每次构建localMax[i][j]的时候把后面都扫一遍,这样总的复杂度会达到O(n^2),但是我们有方法把这一步优化到O(n)。
设想如下例子:
  • globalMax[i - 1]: 3, 5, -1, 8, 7
  • A[]:                    1, 2, 6, -2, 0
我们可以看到当算完A[2] max(globalMax[i - 1][k] + sumFromTo(A[k + 1], A[j])) = 11。当我们算到A[3]的时候,如果我们不考虑新加的globalMax[i - 1][2] + A[3]的组合, 之前的所有组合(globalMax[i - 1][0] + sumFromTo(A[1], A[2]), globalMax[i - 1][1] + sumFromTo(A[2], A[2]))都只需要再加一个A[3]就是新的globalMax[i - 1][k] + sumFromTo(A[k + 1], A[j])的值,所以之前的最大的值,到新的还是原来所组合的最大值,只需要和新加的比一下就可以了,所以这个值我们从最左边向右边扫一遍一直维护是可行的,并且只需要维护一个变量localMax而不是数组。时间复杂度O(k * n),空间复杂度O(k * n),空间应该可以维护一个滚动数组来优化到n不过这道题的逻辑比较复杂,为了维护逻辑的清晰性,我们不优化空间

https://zhengyang2015.gitbooks.io/lintcode/maximum_subarray_iii_43.html
local[i][k]表示前i个元素取k个子数组并且必须包含第i个元素的最大和。
global[i][k]表示前i个元素取k个子数组不一定包含第i个元素的最大和。
local[i][k]的状态函数:
max(global[i-1][k-1], local[i-1][k]) + nums[i-1]
有两种情况,第一种是第i个元素自己组成一个子数组,则要在前i-1个元素中找k-1个子数组,第二种情况是第i个元素属于前一个元素的子数组,因此要在i-1个元素中找k个子数组(并且必须包含第i-1个元素,这样第i个元素才能合并到最后一个子数组中),取两种情况里面大的那个。
global[i][k]的状态函数:
max(global[i-1][k],local[i][k])
有两种情况,第一种是不包含第i个元素,所以要在前i-1个元素中找k个子数组,第二种情况为包含第i个元素,在i个元素中找k个子数组且必须包含第i个元素,取两种情况里面大的那个
    public int maxSubArray(int[] nums, int k) {
if(nums.length < k){
return 0;
}

int len = nums.length;

//local[i][k]表示前i个元素取k个子数组并且必须包含第i个元素的最大和。
int[][] localMax = new int[len + 1][k + 1];
//global[i][k]表示前i个元素取k个子数组不一定包含第i个元素的最大和。
int[][] globalMax = new int[len + 1][k + 1];

for(int j = 1; j <= k; j++){
//前j-1个元素不可能找到不重叠的j个子数组,因此初始化为最小值,以防后面被取到
localMax[j - 1][j] = Integer.MIN_VALUE;
for(int i = j; i <= len; i++){
localMax[i][j] = Math.max(globalMax[i - 1][j - 1], localMax[i - 1][j]) + nums[i - 1];
if(i == j){
globalMax[i][j] = localMax[i][j];
}else{
globalMax[i][j] = Math.max(globalMax[i - 1][j], localMax[i][j]);
}
}
}

return globalMax[len][k];
}

https://leilater.gitbooks.io/codingpractice/content/dynamic_programming/maximum_subarray_iii.html
dp[i][j]表示从前i个数( i.e., [0, i-1]) 中取j个subarray得到的最大值,那么要求的结果就是dp[n][k]:从前n个数中取k个subarray得到的最大和。
状态转移:从前i个中取j个,那么我们可以从前p个数(i.e., [0, p-1])中取j-1个subarray,再加上从P到i-1这个subarray中的最大和(也就是Maximum Subarray问题)。从这句话里我们也可以读出来p的范围应该是j-1~i-1
    int maxSubArray(vector<int> nums, int k) {
if(nums.empty()) return 0;
int n = nums.size();
if(n < k) return 0;
vector<vector<int> > max_sum(n+1, vector<int>(k+1, INT_MIN));
//max_sum[i][j]: max sum of j subarrays generated from nums[0] ~ nums[i-1]
//note that j is always <= i
//init
for(int i=0; i<=n; i++) {
max_sum[i][0] = 0;
}
for(int i=1; i<=n; i++) {
for(int j=1; j<=min(i,k); j++) {
max_sum[i][j] = max_sum[i - 1][j];
//max_sum[i][j] equals to 1) max sum of j-1 subarrays generated from nums[0] ~ nums[p-1]
//plus 2) max sum of the subarry from nums[p] ~ nums[i-1]
//p can be j-1 ~ i-1
for(int p = i-1; p >= j-1; p--) {
//compute the max of of the subarry from nums[p] ~ nums[i-1]
int global = maxSubArray(nums, p, i-1);
max_sum[i][j] = max(max_sum[i][j], max_sum[p][j-1] + global);
}
}

          CCNP Routing and Switching ROUTE 300-101 – Selecting a Routing Protocol   
This lesson identifies a variety of characteristics to consider when selecting a routing protocol. Also, common routing protocols (specifically, RIP, OSPF, EIGRP, and BGP) are categorized as a distance-vector, link-state, or path-vector routing protocol. My Notes: This video is part of the CCNP Routing and Switching ROUTE 300-101 Course presented by double CCIE Kevin Wallace. […]
          Prototip de Switch vectoriale   
Scopul jocului este de a lovi părţi. Apăsaţi spaţiu pentru a comuta.
          Development Associate - Centre for Commercialization of Regenerative Medicine (CCRM) - Canada   
Hands-on experience working with human primary and/or stem cell cultures and/or viral vectors; As a Development Associate at CCRM, you will be part of a diverse...
From Centre for Commercialization of Regenerative Medicine (CCRM) - Thu, 22 Jun 2017 21:38:46 GMT - View all Canada jobs
          Faculty Member, Global Institute for Water Security (Water and Health) - University of Saskatchewan - Canada   
Issues of concern include direct and indirect health impacts associated with climate warming, such as drought, wild fire and disease vectors, and floods....
From University of Saskatchewan - Wed, 21 Jun 2017 10:43:44 GMT - View all Canada jobs
          UX Manager - Liquid Analytics - Canada   
Vector Drawing and Image Manipulation programs like Illustrator and Photoshop. 3 years building user experiences with HTML5, CSS3....
From Liquid Analytics - Mon, 19 Jun 2017 15:36:07 GMT - View all Canada jobs
          Development Manager - Centre for Commercialization of Regenerative Medicine (CCRM) - Canada   
Bioprocess development, cell or molecular biology, genetics, gene engineering, viral vectors, pluripotent stem cells and derived progeny, hematopoietic stem...
From Centre for Commercialization of Regenerative Medicine (CCRM) - Fri, 19 May 2017 00:06:06 GMT - View all Canada jobs
          Scientist, Reprogramming and Genome Engineering - Centre for Commercialization of Regenerative Medicine (CCRM) - Canada   
Geneious, clone manager, Vector NTI, UCSC). CCRM, based in Toronto, Canada, is a unique not-for-profit group that is developing and commercializing cell and...
From Centre for Commercialization of Regenerative Medicine (CCRM) - Fri, 19 May 2017 00:06:03 GMT - View all Canada jobs
          Accenture Security Canada Cloud Security Manager - Accenture - Canada   
Business Exposure - identifying business exposures resulting from cyber-attack vectors (e.g. Strategic Threat Context - understanding the myriad threat factors...
From Accenture - Wed, 19 Apr 2017 10:29:14 GMT - View all Canada jobs
          Accenture Security Canada Threat & Vulnerabiliy Management Consultant - Accenture - Canada   
Business Exposure - identifying business exposures resulting from cyber-attack vectors (e.g. Strategic Threat Context - understanding the myriad threat factors...
From Accenture - Fri, 14 Apr 2017 10:13:22 GMT - View all Canada jobs
          Accenture Security Canada Threat & Vulnerabililty Management Manager - Accenture - Canada   
Business Exposure - identifying business exposures resulting from cyber-attack vectors (e.g. Strategic Threat Context - understanding the myriad threat factors...
From Accenture - Fri, 14 Apr 2017 10:12:43 GMT - View all Canada jobs
          VIE ARD Microbiology - Sanofi US - Toronto, ON   
There will be the opportunity to gain experience with sophisticated laboratory instruments and methods associated with virus vectors, DNA analyses and...
From SanofiUS - Thu, 22 Jun 2017 15:06:15 GMT - View all Toronto, ON jobs
          Programmer Analyst - Eagle Professional Resources - Toronto, ON   
Minimum two (2) years of development experience using HTML5, SVG (Scalable Vector Graphics), Javscript that uses SVG objects and Telerik Controls, WCF resful...
From Eagle Professional Resources - Tue, 20 Jun 2017 20:41:28 GMT - View all Toronto, ON jobs
          Senior Objective-C Developer - Avenza Systems Inc. - Greater Toronto Area, ON   
Raster / vector 2D graphics. Busy mid-town Toronto GIS software company, producer of the award winning MAPublisher &amp; Geographic Imager applications for Adobe...
From Indeed - Fri, 16 Jun 2017 20:02:25 GMT - View all Greater Toronto Area, ON jobs
          Manager, Support Shared Services - BMO Financial Group - Toronto, ON   
Moderate working knowledge of Vector application and/or Jira. The technology group supporting Capital Markets and Enterprise Risk and portfolio Management spans...
From BMO Financial Group - Tue, 13 Jun 2017 18:36:31 GMT - View all Toronto, ON jobs
          Senior Security Analyst - TMX Group Inc. - Toronto, ON   
In-depth knowledge of security concepts such as cyber-attacks and techniques, threat vectors etc. Control - focusing on the state of the security with...
From TMX Group Inc. - Wed, 31 May 2017 12:55:39 GMT - View all Toronto, ON jobs
          Experienced C++ Mobile and Desktop Developers - Avenza Systems Inc. - Toronto, ON   
Raster / vector 2D graphics. Busy mid-town Toronto GIS software company, producer of the award winning PDF Maps app and MAPublisher &amp; Geographic Imager...
From Avenza Systems Inc. - Wed, 31 May 2017 07:39:37 GMT - View all Toronto, ON jobs
          Graphic Designer, Production - INARIA - Toronto, ON   
Original and re-drawing of Logo designs for sports teams and their sponsors (Recreating flat drawings into vector artwork). Graphic Artist, Production*....
From Indeed - Tue, 30 May 2017 21:34:56 GMT - View all Toronto, ON jobs
          Illustrator for Motion Design | YouTube Channel - Think Media Labs Inc. - Toronto, ON   
Ideally looking for someone who can produce vector assets for the YT channel on a regular basis. We are looking for an illustrator to design assets for a new... $40,000 - $80,000 a year
From Indeed - Mon, 29 May 2017 23:10:37 GMT - View all Toronto, ON jobs
          Intermediate Telecomm Analyst - LifeLabs - Toronto, ON   
In depth knowledge and experience in designing and building vectors. At LifeLabs, we are focused on our vision of building a healthier Canada!...
From LifeLabs - Mon, 19 Jun 2017 22:42:38 GMT - View all Toronto, ON jobs
          アヴィレックス Tシャツ ロンT カットソー ワッフル 長袖 黒 L   
アヴィレックス Tシャツ ロンT カットソー…
現在価格:1,620 円,入札数:-,終了日時:2017/07/02 22:43
          アヴィレックス AVIREX Tシャツ Vネック リブ 長袖 デイリー 黒 ブラック L 617394 メンズ   
アヴィレックス AVIREX Tシャツ Vネック …
現在価格:1,620 円,入札数:-,終了日時:2017/07/01 22:26
          アヴィレックス AVIREX Tシャツ カットソー サーマル 長袖 Vネック 白 ホワイト M メンズ   
アヴィレックス AVIREX Tシャツ カットソ…
現在価格:1,620 円,入札数:-,終了日時:2017/07/02 22:18
          アヴィレックス 長袖 プリント Tシャツ XL 赤茶 コットン   
アヴィレックス 長袖 プリント Tシャツ XL…
現在価格:1,166 円,入札数:-,終了日時:2017/07/02 22:25
          アヴィレックス AVIREX Tシャツ カットソー 長袖 無地 黒 ブラック M メンズ   
アヴィレックス AVIREX Tシャツ カットソ…
現在価格:1,080 円,入札数:-,終了日時:2017/07/02 22:19
          レッセパッセ LAISSE PASSE ブラウス 半袖 フリル 38 クリーム   
レッセパッセ LAISSE PASSE ブラウス 半袖…
現在価格:1,188 円,入札数:-,終了日時:2017/07/02 22:24
          Stick Badminton   
Stick Badminton este o distracţie joc de badminton unde player-ul este grafic în forma de stick vector. Cu toate acestea, nu lasa grafica sa te pacaleasca. Jocul vă oferă real gameexperience cum puteţi lovi transfer cu stiluri diferite, şi puteţi chiar să sari şi a lovi mingea. Doar asiguraţi-vă că vă sunt calendarul perfect.
          Type-safe Runtime Code Generation with LLVM   

The embedded high-performance language Accelerate has got a new backend based on LLVM, which generates code for multicore GPUs and CPUs. In a new paper, we describe this code generator, which is —as far as we are aware— the first practical code generator that is fully type preserving from the source language down to generating low-level LLVM intermediate code (in SSA form). In addition to its novel safety features, the new backend generates vectorised SIMD code for x86_64 CPUs (using LLVM’s vectorisation support) and achieves competitive performance on a range of preliminary benchmarks.


          The future of array-oriented computing in Haskell — The Result!   

I recently posted a survey concerning The future of array-oriented computing in Haskell. Here is a summary of the responses.

It is not surprising that basically everybody (of the respondents — who surely suffer from grave selection bias) is interested in multicore CPUs, but I’m somewhat surprised to see about 2/3 to be interested in GPGPU. The most popular application areas are data analytics, machine learning, and scientific computing with optimisation problems and physical simulations following close up.

The most important algorithmic patterns are iterative numeric algorithms, matrix operations, and —the most popular— standard aggregate operations, such as maps, folds, and scans. (This result most surely suffers from selection bias!)

I am very happy to see that most people who tried Repa or Accelerate got at least some mileage out of them. The most requested backend feature for Repa are SIMD instructions (aka vector instructions) and the most requested feature for Accelerate is support for high-performance CPU execution. I did suspect that and we really like to provide that functionality, but it is quite a bit of work (so will take a little while). The other major request for Accelerate is OpenCL support — we really need some outside help to realise that, as it is a major undertaking.

As far as extending the expressiveness of Accelerate goes, there is strong demand for nested data parallelism and sparse data structures. This also requires quite a bit of work (and is conceptual very hard!), but the good news is that PLS has got a PhD student working on just that!

NB: In the multiple choice questions permitting multiple answers, the percentages given by the Google Docs summary is somewhat misleading.


          GraphicRiver Preparing For The Trip 20237896   
GraphicRiver Preparing For The Trip 20237896

GraphicRiver Preparing For The Trip 20237896
Stock Vector \ Conceptual \ Travel
Infographic \ Internet \ Illustration \ Icon \ Journey \ Luggage \ Travel \ Trip

          GraphicRiver Camping Set 20237874   
GraphicRiver Camping Set 20237874

GraphicRiver Camping Set 20237874
Stock Vector \ Conceptual \ Sports \ Activity
Discover \ Destination \ Design \ Concept \ Equipment \ Explore \ Icon \ Graphic

          GraphicRiver Elderly People Background 20238473   
GraphicRiver Elderly People Background 20238473

GraphicRiver Elderly People Background 20238473
Stock Vector \ Conceptual \ Sports \ Activity
Print \ Recreation \ Poster \ People \ Leisure \ Symbol \ Template \ Typography

          GraphicRiver Air Tickets Sale Comic Style Banners 20238386   
GraphicRiver Air Tickets Sale Comic Style Banners 20238386

GraphicRiver Air Tickets Sale Comic Style Banners 20238386
Stock Vector \ Conceptual \ Business
Promotion \ Retail \ Popart \ Offer \ Plane \ Sale \ Service \ Transportation \ Value

          GraphicRiver White Blossom Ornament 20238314   
GraphicRiver White Blossom Ornament 20238314

GraphicRiver White Blossom Ornament 20238314
Stock Vector \ Conceptual \ Nature \ Flowers & Plants
Plant \ Petal \ Ornament \ Sakura \ Season \ White \ Tree \ Spring \ Nature \ Garden

          2 chaises TOLIX   
65,00 EUR (0 Enchères)
Date de fin: dimanche juil.-2-2017 13:21:16 CEST
Enchérir | Ajouter à vos Affaires à suivre

          Saab 9-3 Vector Sport tid turbo diesel 1.9cc 120bhp 6 speed 4 door saloon 06/2006 130k service history 7 stamps in book upto 105k   
Saab 9-3 Vector Sport tid turbo diesel 1.9cc 120bhp 6 speed 4 door saloon 06/2006 130k service history 7 stamps in book upto 105k m.o.t until 11/06/2018 e/windows remote cen/locking aircon/climate control airbags power/steering tilt/steering saab radio/cassette/cd with steering controls computer... 1,095.00 - Contact seller
          Measurements of the production of jets in association with a W or Z boson with the ATLAS detector   
The production of jets in association with vector bosons is an important process to study QCD in a multi-scale environment. The ATLAS collaboration has performed measurements of vector boson+jets cross sections, differential in several kinematic variables, in proton-proton collision data taken at center-of-mass energies of 8 TeV and 13 TeV. The measurements are compared to state-of-the art theory predictions and can be used to constrain the gluon PDF. In data collected at 8 TeV, the collaboration has measured the production of W boson+jets with a large transverse momentum of the leading jet, which enriches the collinear production of the gauge boson and a jet. The measurements are compared to state-of-the-art QCD calculations and Monte Carlo simulations.
          Specjalista ds. BHP i P.PO?. - AP Vector Sp. z o.o. Sp. K. - wielkopolskie   
Agencja Pracy Vector (KRAZ 11459) to firma z wieloletnim sta?em na polskim i zagranicznym rynku pracy. Poprzez lata swej dzia?alno?ci nawi?zali?my wiele
Od gowork.pl - Mon, 26 Jun 2017 01:51:05 GMT - Pokaż wszystkie wielkopolskie oferty pracy
          Sequoia leads Series A round for micro satellite launch company Vector   
Vector, a micro satellite launch company, has raised $21 million in Series A funding. Sequoia Capital led the round with participation from Shasta Ventures and Lightspeed.
          Francisco makes takeover bid for Sandvine for C$4.15 per share   
Francisco Partners has made a takeover bid for Canadian policy control solutions provider Sandvine Corporation for a cash consideration of C$4.15 per share. The offer surpasses the C$3.80 per share bid made by Vector Capital, which was accepted by Sandvine, to acquire the company. According to the announcement on this takeover bid, the Sandvine board has not changed its mind regarding the Vector deal.
          ヘザー ジャケット ブルゾン スタジャン ウール混 F 黒   
ヘザー ジャケット ブルゾン スタジャン …
現在価格:2,484 円,入札数:-,終了日時:2017/07/02 22:12
          ヘザー Heatherテーラード ジャケット アウター 無地 薄手 ダブル F 茶色 レディース/E175   
ヘザー Heatherテーラード ジャケット ア…
現在価格:756 円,入札数:-,終了日時:2017/07/02 22:58
          Camera camin vu baie proprie   

Vand camera camin in Cartier Posta et. 3/4. Are baie proprie, boiler ,convector, termopane, ...
          ラウンジリザード LOUNGE LIZARD 13AW ウール 和紙 ステンカラーコート チェスターコート シンサレート 中綿 グレー 1 5439   
ラウンジリザード LOUNGE LIZARD 13AW ウ…
現在価格:21,384 円,入札数:-,終了日時:2017/07/02 22:02
          ラウンジリザード LOUNGE LIZARD 15AW ショップコート ジャケット ドローコード ネイビー 紺 2 5553 60/2 SUPIMA CRISPY WEATHER   
ラウンジリザード LOUNGE LIZARD 15AW シ…
現在価格:17,064 円,入札数:-,終了日時:2017/07/02 22:39
          ラウンジリザード モッズコート ロング丈 マスタード 3   
ラウンジリザード モッズコート ロング丈 …
現在価格:27,000 円,入札数:-,終了日時:2017/07/02 22:54
          スナイデル snidel コート ガウン 起毛 総裏 ロング F ベージュ   
スナイデル snidel コート ガウン 起毛 総…
現在価格:6,458 円,入札数:-,終了日時:2017/07/02 22:26
          スナイデル コート ガウン ベルト 起毛 ウール混 F ベージュ   
スナイデル コート ガウン ベルト 起毛 ウ…
現在価格:3,564 円,入札数:-,終了日時:2017/07/02 22:50
          Electrical and mechanical diagnosis of aging 600 V rated STP cables in a nuclear power plant   
This paper proposes electrical and mechanical diagnostic methods to estimate the aging effects of 14 American wire gage (AWG) 600 V rated shielded twisted pair (STP) cables used in nuclear power plant. The cables were accelerated to be degraded in a dry oven using Arrhenius's equation, and the properties of healthy and degraded cables were estimated electrically and mechanically as well. S-parameters were measured using a vector network analyzer (VNA) and were used to assess the aging effects of the degraded cable. An effective modulus was also used as an aging indicator of the mechanical properties. An indenter was designed and fabricated to measure the effective modulus of aged cables. Both methods' results were compared and found to be effective for diagnosing the deterioration of the aging cables. Therefore, the proposed methods could be very useful for maintaining power cables in nuclear power plants.
          Partition and recognition of partial discharge development stages in oil-pressboard insulation with needle-plate electrodes under combined AC-DC voltage stress   
Partition and Recognition of the partial discharge (PD) development stages in oil-pressboard insulation under AC-DC combined voltage stress are the bases for analysis of the insulation faults in converter transformers. In this paper, behavior of different characteristic parameters of the PD activity recorded in the oil-pressboard insulation with needle-plate electrodes is investigated. Beside the known characteristic parameters like amplitude of apparent charge in pC, frequency of occurrence of PD pulse, PD pattern (PRPD-pattern), additional parameters were defined to describe the PD development processes under AC-DC combined voltage stress. Additional parameters are: pulse equivalent time, pulse equivalent frequency and equivalent time-frequency pattern (ETF-pattern). According to the time-variation trends of these characteristic parameters the PD development process can be divided into five stages: initial stage (IS), transition stage (TS), developing stage (DS), steady stage (SS), and pre-breakdown stage (PS). In these five stages the PRPD pattern and ETF pattern have different shapes and characteristics. For the analysis of PRPD pattern and ETF pattern the wavelet moment invariants are extracted. Based on these new features the PD development stages can be recognized using the least square support vector machine (LS-SVM) with the particle swarm optimization (PSO). The recognition rate is about 94%. Finally the possible physical effects of the identified PD development stages in the oil pressboards insulation under AC-DC combined voltage stress are also discussed in this paper.
           Radiation-activated antitumor vectors    
Scott, Simon D. and Marples, Brian (2004) Radiation-activated antitumor vectors. In: Springer, Caroline J., (ed.) Suicide Gene Therapy: methods and reviews. Methods in Molecular Medicine (90). Humana Press Inc., New Jersey, USA, pp. 389-402. ISBN 978-0-89603-971-1 (Print), 978-1-59259-429-0 (Online) ISSN 1543-1894 (doi:10.1385/1-59259-429-8:389 )
           Comment on the use of the cre/loxP recombinase system for gene therapy vectors    
Scott, S.D. and Marples, B. (2000) Comment on the use of the cre/loxP recombinase system for gene therapy vectors. Gene Therapy, 7 (19). p. 1706. ISSN 0969-7128 (Print), 1476-5462 (Online) (doi:10.1038/sj.gt.3301305 )
          Technology Associate, Team Lead for ATS Principal Based Strategies - Morgan Stanley - New York, NY   
Machine Learning including Regression and Clustering techniques, Support Vector Machines, Neural Networks, Probabilistic Graphical Models, and Econometric;...
From Morgan Stanley - Mon, 22 May 2017 20:45:35 GMT - View all New York, NY jobs
          Deutsche Telekom: Vectoring-Ausbau der Konkurrenz führt zu Kündigung von VDSL-Verträgen   

deutsche telekom

Der Ausbau von Vectoring führt bei manchen Kunden der Deutschen Telekom zu großen Problemen. Denn wie nun bekannt wurde, kündigt das Unternehmen einigen ihrer eigenen Kunden die bestehenden VDSL-Verträge. Als Grund wird der Ausbau von VDSL Vectoring genannt. Aufgrund der Technik und Rechtslage ist es nicht möglich, in einer Vermittlungsstelle zwei VDSL-Techniken parallel zu betreiben.

Beim Ausbau von Vectoring ist jedoch nicht nur die Deutsche Telekom zum Kündigen der eigenen Verträge gezwungen. Auch andere Anbieter in dem jeweiligen Ausbaugebiet können kein VDSL mehr anbieten und müssen damit ihren Kunden ebenfalls den Vertrag kündigen. Das führt dazu, dass die Bonner teilweise auch ...

          Vectorpark   


Date un occhiata a questo link, troverete un simpatico sito in flash che vi farà perdere qualche decina di minuti e sicuramente vi darà il sorriso!

          AutoCAD 2013 and LiteHtml.dll   
Installing AutoCAD 2013 is complaining about LiteHtml.dll. Whats the story?

I can't say for sure, but I think you'll find that you have an over zealous system administrator who decided to deploy a security system that can only have been designed by chimps, then implemented by the most idiotic intern at Microsoft.

Go read this Knowledge Base article: http://support.microsoft.com/kb/2264107

Can you believe that? Some idiot thinks that DLLs are always completely self-contained, that no-one other than Microsoft might build an application where DLL1 depends on DLL2 which happens to be delivered as part of the same product.

This wouldn't be so bad if the numb nuts that actually implemented the security feature actually knew what they were doing. It appears that setting the CWDIllegalInDllSearch entry does not "omit the current directory from the search". Instead, it changes the order it considers directories. If a matching DLL is in the current directory, it halts the scan immediately. Doesn't check that the DLL would have been found via the official path strategy - it just stops.

Now, it's fine to say "but this is a vector for malware". Sure it is, but if someone can install a DLL into your application directory, then they can change your application as well, so this hack prevents *nothing*.

In case one of the afore-mentioned chimps is listening, they should find someone smarter than they are and ask what the letters in DLL mean. Dynamic Link Library. Suggesting that you can work around the problems this security setting causes by explicitly (and manually) loading the libraries you need with LoadLibrary() misses the point that there are no published APIs that tell you what libraries a specific DLL needs. If I have to write my app so that it analyses every DLL it loads, then every DLL that *they* load, recursing till I hit metal, then there is no point in actually *linking* against those libraries.

          Challenge for ISRO? This startup readies small rockets for takeoff   
Vector's goal is to make a $1.5 million rocket that can carry small satellites into orbit. It expects to conduct 100 launches per year—a figure that would match the annual capacity of the entire aerospace industry.
          UK & USA KVM Packages DEEP discounts | 1TB Netherlands plans €3.00 for 6 months | DOUBLE DISK SPACE   

Hi Folks,

UK KVM PACKAGES - use coupon code 20off4lifeuk for 20% recurring on any term

You will automatically get double the advertised disk space on the UK packages below, packages listed with the discount applied.

image

2 CPU Cores E5-2640 v4(Equal Share)
256 MB Ram - DDR4
5 GB Disk space - HW Raid 10 SAS + SSD Cache
350 GB Bandwidth @ 1 gbit (shared)
1 x IPv4 address
1 x /64 IPv6

€4.80 p/quarter order link: https://clients.inceptionhosting.com/cart.php?a=add&pid=175

4 CPU Cores E5-2640 v4(Equal Share)
512 MB Ram - DDR4
10 GB Disk space - HW Raid 10 SAS + SSD Cache
500 GB Bandwidth @ 1 gbit (shared)
1 x IPv4 address
1 x /64 IPv6

€2.00 p/month order link: https://clients.inceptionhosting.com/cart.php?a=add&pid=161

4 CPU Cores E5-2640 v4(Equal Share)
1 GB Ram - DDR4
20 GB SSD Cached Disk space - HW Raid 10 SAS + SSD Cache
1000 GB Bandwidth @ 1 gbit (shared)
1 x IPv4 address
1 x /64 IPv6 

€3.20 p/month order link: https://clients.inceptionhosting.com/cart.php?a=add&pid=163

4 CPU Cores E5-2640 v4 (Equal Share)
2 GB Ram - DDR4
40 GB Disk space - HW Raid 10 SAS + SSD Cache
2000 GB Bandwidth @ 1 gbit (shared)
1 x IPv4 address
1 x /64 IPv6

€5.60 p/month order link: https://clients.inceptionhosting.com/cart.php?a=add&pid=164

Looking Glass

Servers hosted in Enfield, London on clouviders network.

image

image

USA KVM Packages - use coupon code 50offphx4life for 50% recurring on any term for packages with 1GB RAM or more

4 CPU Cores (Equal Share)
1 GB Ram
20 GB Disk space
500 GB Bandwidth @ 1 gbit (shared)
1IPv4 address

€2.50 p/month €7.50 p/quarter €15.00 for 6 months

Order Link: https://clients.inceptionhosting.com/cart.php?a=add&pid=147

4 CPU Cores (Equal Share)
1.5 GB Ram
30 GB Disk space
750 GB Bandwidth @ 1 gbit (shared)
1IPv4 address

€3.75 p/month €11.25 p/quarter €22.50 for 6 months

Order Link: https://clients.inceptionhosting.com/cart.php?a=add&pid=148

4 CPU Cores (Equal Share)
2 GB Ram
45 GB Disk space
1 TB Bandwidth @ 1 gbit (shared)
1IPv4 address

€5.00 p/month €15.00 p/quarter €30.00 for 6 months

Order Link: https://clients.inceptionhosting.com/cart.php?a=add&pid=149

Servers located with IOFlood Phoenix.

image

Netherlands NAT KVM Packages with 1TB Bandwidth image

ORDER LINKS

image

Payment options: Stripe (Credit/Debit cards), Paypal, Bitcoin.

If anyone wants any custom offers, feel free to ask, if I can do it I will.

All questions and comments welcome.

TERMS TL:DR (what you can't do)

No TOR, No torrents, No Crypto mining, No Link Exchange, No open proxies, CPU Cores are not dedicated, Orders from China and Brazil are auto blocked, Orders from behind proxies/VPN's are auto blocked.


          chaise style fritz hansen, jacobsen   
30,00 EUR (0 Enchères)
Date de fin: samedi juil.-1-2017 10:17:00 CEST
Enchérir | Ajouter à vos Affaires à suivre

          7 chaises vintage Arne Jacobsen "marteau"    
200,00 EUR
Date de fin: vendredi juil.-14-2017 19:07:42 CEST
Achat immédiat pour seulement: 200,00 EUR
Achat immédiat | Ajouter à vos Affaires à suivre

          Chaise 7 Arne Jacobsen, par Fritz Hansen - Un grand classique   
200,00 EUR
Date de fin: mardi juil.-4-2017 8:59:59 CEST
Achat immédiat pour seulement: 200,00 EUR
Achat immédiat | Ajouter à vos Affaires à suivre

          Lot de 4 Chaises vintage GENEVIÈVE DANGLES & C.DEFRANCE Burov no jacobsen eames   
460,00 EUR
Date de fin: mercredi juil.-19-2017 21:06:37 CEST
Achat immédiat pour seulement: 460,00 EUR
Achat immédiat | Ajouter à vos Affaires à suivre

          chaise secrétaire arne jacobsen 1950 assise fritz hansen 1ere serie   
750,00 EUR
Date de fin: mardi juil.-11-2017 8:54:51 CEST
Achat immédiat pour seulement: 750,00 EUR
Achat immédiat | Ajouter à vos Affaires à suivre

          chaise moumoute rouge années 70, vintage design style Arne Jacobsen   
70,00 EUR
Date de fin: dimanche juil.-30-2017 22:53:58 CEST
Achat immédiat pour seulement: 70,00 EUR
Achat immédiat | Ajouter à vos Affaires à suivre

          Rare suite de 4 chaises d'Arne Jacobsen en palissandre édition Fritz Hansen   
2.400,00 EUR
Date de fin: jeudi juil.-27-2017 15:04:25 CEST
Achat immédiat pour seulement: 2.400,00 EUR
Achat immédiat | Ajouter à vos Affaires à suivre

           CHAISE DESIGN ARENE JACOBSEN CUIR FAUVE modele OXFORD pivotante amortisseur   
270,00 EUR
Date de fin: lundi juil.-17-2017 7:30:18 CEST
Achat immédiat pour seulement: 270,00 EUR
Achat immédiat | Ajouter à vos Affaires à suivre

          PAIRE 2 CHAISES 3103 ARNE JACOBSEN FRITZ HANSEN EP 1970   
600,00 EUR
Date de fin: jeudi juil.-27-2017 17:09:54 CEST
Achat immédiat pour seulement: 600,00 EUR
Achat immédiat | Ajouter à vos Affaires à suivre

          2 chaises Mid-Century Arne Jacobsen pour Fritz Hansen Scandinaves Vintage   
795,00 EUR
Date de fin: mardi juil.-18-2017 11:21:04 CEST
Achat immédiat pour seulement: 795,00 EUR
Achat immédiat | Ajouter à vos Affaires à suivre

          4 chaises orange en bois Arne Jacobsen Séries 7   
250,00 EUR
Date de fin: jeudi juil.-20-2017 10:32:03 CEST
Achat immédiat pour seulement: 250,00 EUR
Achat immédiat | Ajouter à vos Affaires à suivre

          4 Chaises Série 7 Jacobsen Fritz Hansen 1972    
500,00 EUR
Date de fin: vendredi juil.-28-2017 0:22:13 CEST
Achat immédiat pour seulement: 500,00 EUR
Achat immédiat | Ajouter à vos Affaires à suivre

          CHAISE JACOBSEN FRITZ HANSEN SERIE 7 NOIR BUREAU ABIME   
100,00 EUR
Date de fin: mercredi juil.-19-2017 14:42:35 CEST
Achat immédiat pour seulement: 100,00 EUR
Achat immédiat | Ajouter à vos Affaires à suivre

          CHAISE JACOBSEN FRITZ HANSEN SERIE 7 NOIR BUREAU   
200,00 EUR
Date de fin: mercredi juil.-19-2017 14:41:10 CEST
Achat immédiat pour seulement: 200,00 EUR
Achat immédiat | Ajouter à vos Affaires à suivre

          Chaise Arne Jacobsen Série 7 - Fritz Hansen - 1960-1970- Design -vintage   
320,00 EUR
Date de fin: samedi juil.-22-2017 12:45:03 CEST
Achat immédiat pour seulement: 320,00 EUR
Achat immédiat | Ajouter à vos Affaires à suivre

          Rare Serie De 6 Chaises 3207 Arne Jacobsen   
2.400,00 EUR
Date de fin: lundi juil.-10-2017 12:21:04 CEST
Achat immédiat pour seulement: 2.400,00 EUR
Achat immédiat | Ajouter à vos Affaires à suivre

          1 ROSEWOOD CHAISE FRITZ HANSEN 3103 1ERE PRODUCTION 1964 ARNE JACOBSEN T-CHAIR   
220,00 EUR
Date de fin: lundi juil.-3-2017 9:15:33 CEST
Achat immédiat pour seulement: 220,00 EUR
Achat immédiat | Ajouter à vos Affaires à suivre

          Arne Jacobsen Stuhl 3107 by Fritz Hansen von Chair Serie 7 Chaise Vintage   
219,00 EUR
Date de fin: lundi juil.-3-2017 13:30:06 CEST
Achat immédiat pour seulement: 219,00 EUR
Achat immédiat | Ajouter à vos Affaires à suivre

          Chaise Noir Design / dlg de Jacobsen / contreplaqué moulé / Chair   
80,00 EUR
Date de fin: dimanche juil.-16-2017 17:11:20 CEST
Achat immédiat pour seulement: 80,00 EUR
Achat immédiat | Ajouter à vos Affaires à suivre

          Fritz Hansen, Arne Jacobsen 3103 Teakstuhl 1963 Hammer Chair Stuhl Teak Vintage    
295,00 EUR
Date de fin: jeudi juil.-13-2017 11:08:07 CEST
Achat immédiat pour seulement: 295,00 EUR
Achat immédiat | Ajouter à vos Affaires à suivre

          Fritz Hansen - 4 Chaises fourmi, Arne Jacobsen   
900,00 EUR
Date de fin: lundi juil.-10-2017 14:03:06 CEST
Achat immédiat pour seulement: 900,00 EUR
Achat immédiat | Ajouter à vos Affaires à suivre

          Ref 513 Chaises (4) dans le goût de Jacobsen pieds chromés   
80,00 EUR
Date de fin: lundi juil.-24-2017 9:02:20 CEST
Achat immédiat pour seulement: 80,00 EUR
Achat immédiat | Ajouter à vos Affaires à suivre

          3 CHAISES FAUTEUIL DE BUREAU OXFORD ARNE JACOBSEN FRITZ HANSEN LOFT VINTAGE XO    
1.000,00 EUR
Date de fin: vendredi juil.-7-2017 16:18:24 CEST
Achat immédiat pour seulement: 1.000,00 EUR
Achat immédiat | Ajouter à vos Affaires à suivre

          Sixties Arne Jacobsen 3105 Chaise roulettes Swivel chair Fritz Hansen, Denmark   
1.395,00 EUR
Date de fin: dimanche juil.-2-2017 12:39:34 CEST
Achat immédiat pour seulement: 1.395,00 EUR
Achat immédiat | Ajouter à vos Affaires à suivre

          2x Fritz Hansen, Arne Jacobsen 3103, Teakstuhl Hammer Chair Stuhl Teak Vintage    
590,00 EUR
Date de fin: mercredi juil.-19-2017 16:14:24 CEST
Achat immédiat pour seulement: 590,00 EUR
Achat immédiat | Ajouter à vos Affaires à suivre

          Paire de Chaises de Arne Jacobsen Série 7 Version Tweed Fritz Hansen   
430,00 EUR
Date de fin: vendredi juil.-28-2017 23:53:51 CEST
Achat immédiat pour seulement: 430,00 EUR
Achat immédiat | Ajouter à vos Affaires à suivre

          Fritz Hansen 3103 Sitz Schale Arne Jacobsen Design 1955 Teak Plywood Stuhl #1/2   
185,40 EUR
Date de fin: mercredi juil.-19-2017 18:08:56 CEST
Achat immédiat pour seulement: 185,40 EUR
Achat immédiat | Ajouter à vos Affaires à suivre

          Series 3xxx Chair Glides + – Felt | Fritz Hansen | Arne Jacobsen   
7,99 EUR
Date de fin: jeudi juil.-20-2017 19:19:49 CEST
Achat immédiat pour seulement: 7,99 EUR
Achat immédiat | Ajouter à vos Affaires à suivre

          1x Stuhl 3107 Arne Jacobsen Fritz Hansen dunkelgrau 175 Stapelstuhl 19% MwSt    
229,00 EUR
Date de fin: mercredi juil.-5-2017 17:30:47 CEST
Achat immédiat pour seulement: 229,00 EUR
Achat immédiat | Ajouter à vos Affaires à suivre

          CHAISE FAUTEUIL DE BUREAU OXFORD ARNE JACOBSEN FRITZ HANSEN DESIGN LOFT XO   
900,00 EUR
Date de fin: vendredi juil.-14-2017 19:04:17 CEST
Achat immédiat pour seulement: 900,00 EUR
Achat immédiat | Ajouter à vos Affaires à suivre

          1 (von 2) Fritz Hansen, Arne Jacobsen 3207 von 1994, Chair Chaise Stuhl 3107   
385,00 EUR
Date de fin: vendredi juil.-14-2017 12:00:06 CEST
Achat immédiat pour seulement: 385,00 EUR
Achat immédiat | Ajouter à vos Affaires à suivre

          2 CHAISES FAUTEUIL DE BUREAU OXFORD ARNE JACOBSEN FRITZ HANSEN CUIR MARRON XO   
1.500,00 EUR
Date de fin: vendredi juil.-7-2017 16:23:53 CEST
Achat immédiat pour seulement: 1.500,00 EUR
Achat immédiat | Ajouter à vos Affaires à suivre

          1x Fritz Hansen, Arne Jacobsen 3107 von 1970, Teakstuhl Chair Chaise Stuhl 60s   
375,00 EUR
Date de fin: vendredi juil.-28-2017 9:45:41 CEST
Achat immédiat pour seulement: 375,00 EUR
Achat immédiat | Ajouter à vos Affaires à suivre

          Sixties Arne Jacobsen 3005 Chaise pivotante Swivel chair Fritz Hansen, Denmark   
1.149,00 EUR
Date de fin: mardi juil.-25-2017 22:56:40 CEST
Achat immédiat pour seulement: 1.149,00 EUR
Achat immédiat | Ajouter à vos Affaires à suivre

          Stuhl 3107 von Arne Jacobsen für Fritz Hansen Stapelstuhl Chair Stuhl 19% MwSt    
229,00 EUR
Date de fin: jeudi juil.-20-2017 10:17:12 CEST
Achat immédiat pour seulement: 229,00 EUR
Achat immédiat | Ajouter à vos Affaires à suivre

          1x Fritz Hansen, Arne Jacobsen 3107 von 1969, Teakstuhl Chair Chaise Stuhl 60s   
375,00 EUR
Date de fin: vendredi juil.-28-2017 9:42:58 CEST
Achat immédiat pour seulement: 375,00 EUR
Achat immédiat | Ajouter à vos Affaires à suivre

          1x Fritz Hansen, Arne Jacobsen 3107 von 1973, Teakstuhl Chair Chaise Stuhl 60s   
375,00 EUR
Date de fin: mercredi juil.-5-2017 16:28:14 CEST
Achat immédiat pour seulement: 375,00 EUR
Achat immédiat | Ajouter à vos Affaires à suivre

          4x Stuhl 3107 Arne Jacobsen Fritz Hansen Türkis Stapelstuhl 19% MwSt 90er Jahre   
880,00 EUR
Date de fin: lundi juil.-10-2017 10:05:20 CEST
Achat immédiat pour seulement: 880,00 EUR
Achat immédiat | Ajouter à vos Affaires à suivre

          4x Fritz Hansen, Arne Jacobsen 3107 von 1963! Teakstuhl Chair Chaise Stuhl Set2   
1.490,00 EUR
Date de fin: jeudi juil.-27-2017 22:58:12 CEST
Achat immédiat pour seulement: 1.490,00 EUR
Achat immédiat | Ajouter à vos Affaires à suivre

          Schichtholzstuhl Arne Jacobsen f. Fritz Hansen, Modell 3107, Ausstellungsstück   
249,00 EUR
Date de fin: mardi juil.-18-2017 11:25:54 CEST
Achat immédiat pour seulement: 249,00 EUR
Achat immédiat | Ajouter à vos Affaires à suivre

          Arne Jacobsen Fritz Hansen Egg Chair Foam Molding   
49,90 EUR
Date de fin: mardi juil.-11-2017 12:25:03 CEST
Achat immédiat pour seulement: 49,90 EUR
Achat immédiat | Ajouter à vos Affaires à suivre

          Fritz Hansen | Series 31xx Chair Overhaul Set | Arne Jacobsen   
29,99 EUR
Date de fin: jeudi juil.-20-2017 16:08:17 CEST
Achat immédiat pour seulement: 29,99 EUR
Achat immédiat | Ajouter à vos Affaires à suivre

          4 chaises ARNE JACOBSEN 3107 FRITZ HANSEN Danemark 1976 Arty (8 dispo)   
499,00 EUR
Date de fin: jeudi juil.-13-2017 21:41:41 CEST
Achat immédiat pour seulement: 499,00 EUR
Achat immédiat | Ajouter à vos Affaires à suivre

          Fritz Hansen 3107 Arne Jacobsen lasiert rot Stuhl Stapelstuhl   
349,00 EUR
Date de fin: dimanche juil.-2-2017 19:21:10 CEST
Achat immédiat pour seulement: 349,00 EUR
Achat immédiat | Ajouter à vos Affaires à suivre

          Plastic Cap Cover Under Seat | Fritz Hansen | Arne Jacobsen   
8,99 EUR
Date de fin: jeudi juil.-20-2017 20:14:36 CEST
Achat immédiat pour seulement: 8,99 EUR
Achat immédiat | Ajouter à vos Affaires à suivre

          FRITZ HANSEN 4 x STUHL 3107 GEPOLSTERT STOFF PETROL ARNE JACOBSEN   
956,00 EUR
Date de fin: mercredi juil.-19-2017 7:22:24 CEST
Achat immédiat pour seulement: 956,00 EUR
Achat immédiat | Ajouter à vos Affaires à suivre

          Oxford Chair Glides | Fritz Hansen | Arne Jacobsen | + – Felt   
19,99 EUR
Date de fin: samedi juil.-29-2017 9:17:26 CEST
Achat immédiat pour seulement: 19,99 EUR
Achat immédiat | Ajouter à vos Affaires à suivre

          Screws Base to Shell | 31xx | Fritz Hansen | Arne Jacobsen   
3,90 EUR
Date de fin: jeudi juil.-13-2017 17:07:34 CEST
Achat immédiat pour seulement: 3,90 EUR
Achat immédiat | Ajouter à vos Affaires à suivre

          Oxford Chair Glides | Fritz Hansen | Arne Jacobsen   
77,90 EUR
Date de fin: samedi juil.-15-2017 12:41:02 CEST
Achat immédiat pour seulement: 77,90 EUR
Achat immédiat | Ajouter à vos Affaires à suivre

          FRITZ HANSEN 2 x STUHL 3107 GEPOLSTERT STOFF ORANGE ARNE JACOBSEN   
638,00 EUR
Date de fin: jeudi juil.-27-2017 19:42:31 CEST
Achat immédiat pour seulement: 638,00 EUR
Achat immédiat | Ajouter à vos Affaires à suivre

          4x Stuhl 3107 Arne Jacobsen Fritz Hansen dunkelgrau 175 Stapelstuhl 19% MwSt    
880,00 EUR
Date de fin: vendredi juil.-28-2017 8:46:54 CEST
Achat immédiat pour seulement: 880,00 EUR
Achat immédiat | Ajouter à vos Affaires à suivre

          4x Etude Stuhl 4135 von Arne Jacobsen 1978 für Fritz Hansen, 19% MwSt   
1.490,00 EUR
Date de fin: mercredi juil.-19-2017 11:44:21 CEST
Achat immédiat pour seulement: 1.490,00 EUR
Achat immédiat | Ajouter à vos Affaires à suivre

          1x Die Ameise - Stuhl 3101 Arne Jacobsen Fritz Hansen Ahorn Maple Ant 19% MwSt    
255,00 EUR
Date de fin: dimanche juil.-2-2017 11:02:08 CEST
Achat immédiat pour seulement: 255,00 EUR
Achat immédiat | Ajouter à vos Affaires à suivre

          Arne Jacobsen Style Inspired White Dining Table-Emily Chrome legs   
56,86 EUR
Date de fin: mercredi juil.-12-2017 12:09:42 CEST
Achat immédiat pour seulement: 56,86 EUR
Achat immédiat | Ajouter à vos Affaires à suivre

          Fritz Hansen 3107 Arne Jacobsen avec finition rouge Chaise Chaise empilable   
366,45 EUR
Date de fin: lundi juil.-3-2017 15:58:15 CEST
Achat immédiat pour seulement: 366,45 EUR
Achat immédiat | Ajouter à vos Affaires à suivre

          Sedia impilabile in legno ARNE JACOBSEN SEVEN chair   
65,00 EUR
Date de fin: lundi juil.-24-2017 19:32:43 CEST
Achat immédiat pour seulement: 65,00 EUR
Achat immédiat | Ajouter à vos Affaires à suivre

          Swan Egg Chair Glides | Fritz Hansen | Arne Jacobsen | + – Felt   
29,99 EUR
Date de fin: jeudi juil.-20-2017 20:12:58 CEST
Achat immédiat pour seulement: 29,99 EUR
Achat immédiat | Ajouter à vos Affaires à suivre

          2x Die Ameise - Stuhl 3101 Arne Jacobsen Fritz Hansen Ahorn Maple Ant 19% MwSt    
510,00 EUR
Date de fin: dimanche juil.-2-2017 13:23:07 CEST
Achat immédiat pour seulement: 510,00 EUR
Achat immédiat | Ajouter à vos Affaires à suivre

          FRITZ HANSEN 4 x STUHL 3107 GEPOLSTERT STOFF ORANGE ARNE JACOBSEN   
1.276,00 EUR
Date de fin: jeudi juil.-27-2017 19:42:31 CEST
Achat immédiat pour seulement: 1.276,00 EUR
Achat immédiat | Ajouter à vos Affaires à suivre

          Seat Stabilizer Under Seat | Fritz Hansen | Arne Jacobsen | Set of 3 or 4   
16,99 EUR
Date de fin: jeudi juil.-20-2017 21:09:22 CEST
Achat immédiat pour seulement: 16,99 EUR
Achat immédiat | Ajouter à vos Affaires à suivre

          2x Fritz Hansen 3107 Arne Jacobsen lackiert weiß Stuhl Stapelstuhl   
780,00 EUR
Date de fin: dimanche juil.-9-2017 18:42:17 CEST
Achat immédiat pour seulement: 780,00 EUR
Achat immédiat | Ajouter à vos Affaires à suivre

          FRITZ HANSEN 6 x STUHL 3107 GEPOLSTERT STOFF ORANGE ARNE JACOBSEN   
1.914,00 EUR
Date de fin: jeudi juil.-27-2017 19:42:31 CEST
Achat immédiat pour seulement: 1.914,00 EUR
Achat immédiat | Ajouter à vos Affaires à suivre

          Fritz Hansen 3103 Sitz Schale Arne Jacobsen Design 1955 Teak Plywood Stuhl #2/2   
185,30 EUR
Date de fin: mercredi juil.-19-2017 15:49:26 CEST
Achat immédiat pour seulement: 185,30 EUR
Achat immédiat | Ajouter à vos Affaires à suivre

          Fritz Hansen 3107 Arne Jacobsen lackiert weiß Stuhl Stapelstuhl   
399,00 EUR
Date de fin: dimanche juil.-23-2017 16:13:47 CEST
Achat immédiat pour seulement: 399,00 EUR
Achat immédiat | Ajouter à vos Affaires à suivre

          FRITZ HANSEN 8 x STUHL 3107 GEPOLSTERT STOFF ORANGE ARNE JACOBSEN   
2.552,00 EUR
Date de fin: jeudi juil.-27-2017 19:42:31 CEST
Achat immédiat pour seulement: 2.552,00 EUR
Achat immédiat | Ajouter à vos Affaires à suivre

          Fritz Hansen 3107 Arne Jacobsen lasiert schwarz SH46 5cm Stuhl Stapelstuhl   
382,00 EUR
Date de fin: dimanche juil.-2-2017 18:58:58 CEST
Achat immédiat pour seulement: 382,00 EUR
Achat immédiat | Ajouter à vos Affaires à suivre

          Pair of Authentic Fritz Hansen Arne Jacobsen vs Cath Kidston Ant Chairs unique   
511,85 EUR
Date de fin: samedi juil.-22-2017 12:48:45 CEST
Achat immédiat pour seulement: 511,85 EUR
Achat immédiat | Ajouter à vos Affaires à suivre

          4x Die Ameise - Stuhl 3101 Arne Jacobsen Fritz Hansen Ahorn Maple Ant 19% MwSt    
1.020,00 EUR
Date de fin: mardi juil.-4-2017 12:33:25 CEST
Achat immédiat pour seulement: 1.020,00 EUR
Achat immédiat | Ajouter à vos Affaires à suivre

          Chaise Arne Jacobsen serie 7 avec accoudoir bureau danois fritz hansen 1974   
350,00 EUR
Date de fin: mercredi juil.-5-2017 8:21:18 CEST
Achat immédiat pour seulement: 350,00 EUR
Achat immédiat | Ajouter à vos Affaires à suivre

          SEDIA SERIE 7 DESIGN A.Jacobsen - Series 7 Chair   
239,00 EUR
Date de fin: lundi juil.-17-2017 10:41:31 CEST
Achat immédiat pour seulement: 239,00 EUR
Achat immédiat | Ajouter à vos Affaires à suivre

          Eco Filz Kissen gepolstert geeignet für Fritz Hansen 3107 - Serie 7 Jacobsen   
24,90 EUR
Date de fin: dimanche juil.-23-2017 16:28:54 CEST
Achat immédiat pour seulement: 24,90 EUR
Achat immédiat | Ajouter à vos Affaires à suivre

          CHAISE FAUTEUIL STYLE FOURMIS Jacobsen design METAL TISSUS LOT DE 6 / locan   
700,00 EUR
Date de fin: dimanche juil.-2-2017 11:07:59 CEST
Achat immédiat pour seulement: 700,00 EUR
Achat immédiat | Ajouter à vos Affaires à suivre

          ミッシュマッシュ スカート ボトムス ひざ丈 フレア グレー系 36   
ミッシュマッシュ スカート ボトムス ひざ…
現在価格:972 円,入札数:-,終了日時:2017/07/01 22:09
          Raspberry Pi Wind Chimes #piday #raspberrypi @Raspberry_Pi   
From Mike Cook on vimeo: A Magnetic Vector generator of chimes. The MagPi No. 59 July 2027 Read more Each Friday is PiDay here at Adafruit! Be sure to check out our posts, tutorials and new Raspberry Pi related products. Adafruit has the largest and best selection of Raspberry Pi accessories and all the code […]
          lampe d'atelier industrielle style gras jieldé   
230,00 EUR
Date de fin: dimanche juil.-2-2017 18:02:03 CEST
Achat immédiat pour seulement: 230,00 EUR
Achat immédiat | Ajouter à vos Affaires à suivre

          Ancien lampe design Gras 201 atelier abat-jour dessinateur loft deco industriel   
450,00 EUR
Date de fin: dimanche juil.-30-2017 10:37:51 CEST
Achat immédiat pour seulement: 450,00 EUR
Achat immédiat | Ajouter à vos Affaires à suivre

           lampadaire DESVIL lampe atelier LEVALLOIS gras jielde lamp loft industriel    
479,00 EUR
Date de fin: samedi juil.-29-2017 20:09:43 CEST
Achat immédiat pour seulement: 479,00 EUR
Achat immédiat | Ajouter à vos Affaires à suivre

          Lampe atelier architecte ancienne genre Jielde gras ravel système anglepoise   
69,00 EUR
Date de fin: dimanche juil.-30-2017 13:02:36 CEST
Achat immédiat pour seulement: 69,00 EUR
Achat immédiat | Ajouter à vos Affaires à suivre

          LAMPE INDUSTRIEL 1920 JIELDE GRAS   
80,00 EUR (0 Enchères)
Date de fin: jeudi juil.-6-2017 16:55:11 CEST
Enchérir | Ajouter à vos Affaires à suivre

          Pied ancien lesté fonte pour lampe atelier Jielde gras etc... Hauteur 70 cms   
49,00 EUR
Date de fin: dimanche juil.-30-2017 13:02:36 CEST
Achat immédiat pour seulement: 49,00 EUR
Achat immédiat | Ajouter à vos Affaires à suivre

          Ancienne lampe atelier 2 bras Lumina deco loft vintage no Jielde Gras   
20,00 EUR (0 Enchères)
Date de fin: jeudi juil.-6-2017 19:09:37 CEST
Enchérir | Ajouter à vos Affaires à suivre

          LAMPE ART DÉCO ATELIER DESIGN LOFT SKYSCRAPER DEGUÉ OBUS GRAS INTERRUPTEUR   
100,00 EUR
Date de fin: lundi juil.-10-2017 8:04:55 CEST
Achat immédiat pour seulement: 100,00 EUR
Achat immédiat | Ajouter à vos Affaires à suivre

          3 DOUILLE BAYONNETTE INTERRUPTEUR LAITON LAMPE INDUSTRIELLE GRAS RAVEL ART DECO    
18,00 EUR
Date de fin: dimanche juil.-30-2017 8:03:49 CEST
Achat immédiat pour seulement: 18,00 EUR
Achat immédiat | Ajouter à vos Affaires à suivre

          Ancienne lampe atelier ADHER deco loft vintage no Jielde Gras   
20,00 EUR (0 Enchères)
Date de fin: jeudi juil.-6-2017 19:08:52 CEST
Enchérir | Ajouter à vos Affaires à suivre

           lampe Resistex rotule style gras jielde métier industriel usine atelier   
69,00 EUR (0 Enchères)
Date de fin: lundi juil.-10-2017 11:10:33 CEST
Achat immédiat pour seulement: 97,00 EUR
Achat immédiat | Enchérir | Ajouter à vos Affaires à suivre

          Lampe d'atelier industriel 2 bras articulés lampe GRAS 201   
111,00 EUR (4 Enchères)
Date de fin: vendredi juil.-7-2017 15:13:02 CEST
Enchérir | Ajouter à vos Affaires à suivre

          Rare Ancienne Lampe D'atelier Design Industriel GRAS 2 Bras Loft Applique   
201,01 EUR (9 Enchères)
Date de fin: jeudi juil.-6-2017 21:25:00 CEST
Enchérir | Ajouter à vos Affaires à suivre

          Rare Ancienne Lampe D'atelier Design Industriel GRAS 2 Bras Loft Applique   
121,00 EUR (5 Enchères)
Date de fin: jeudi juil.-6-2017 21:24:04 CEST
Enchérir | Ajouter à vos Affaires à suivre

          Lampe GRAS applique N°222 DCW édition   
120,00 EUR (1 Enchère)
Date de fin: samedi juil.-1-2017 19:01:42 CEST
Enchérir | Ajouter à vos Affaires à suivre

          LAMPE TYPE MOUILLE pas GRAS JIELDE ESPRIT LOFT INDUS DECO   
150,00 EUR (0 Enchères)
Date de fin: lundi juil.-3-2017 20:04:52 CEST
Enchérir | Ajouter à vos Affaires à suivre

          C++stl 向量,链表,栈,队列(vector, list, stack, queue)   

          Resuelvo tus prácticas de programación   
Resuelvo tus prácticas, guiones, deberes, trabajos, actividades, etc de programación en c, c++ / cpp, html, javascript, etc. Si estás saturado de trabajos y no te da tiempo, no das a basto o no entiendes los ejercicios, contacta conmigo. Trabajo perfectamente con sentencias condicionales, bucles, funciones, recursividad, vectores, matrices, estructuras, etc. Ya seas de la carrera de matemáticas, informática, naútica, ingeniería industrial, ciclo,...
          Inkscape 0.48.4-1   
Inkscape is a very good free vector graphics program.
          Petya, un virus más peligroso y sofisticado que WannaCry   
El virus Petya, que ayer afectó a grandes empresas de todo el mundo es más peligroso y sofisticado que WannaCry, aunque se base en el mismo principio de propagación masiva a través de las redes locales. “Pese a que todavía no sepamos con certeza cuál es el primer equipo infectado y cómo se infectó, sabemos que este nuevo malware usa la vulnerabilidad EternalBlue junto a lo que llamamos en ciberseguridad movimientos laterales”, dice Sergio de los Santos, director de innovación y laboratorio en Eleven Paths, unidad especializada en ciberseguridad de Telefónica, a EL PAÍS.

“Ahora no sólo busca equipos vulnerables, también emplea herramientas de administración para infectar a todos los equipos de una red si, por suerte, encuentra previamente una máquina con dichos privilegios”.

“Nos habíamos olvidado ya de los gusanos y los ataques informáticos siempre han estado enfocados a atacar a alguien de forma sigilosa a través de infecciones por email en los últimos años” señala De los Santos. “Pero no hemos aprendido pese al tirón de orejas”.

El experto de seguridad de ElevenPaths señala que, no obstante, la parte importante del virus es su virtud de gusano. Y lo más sorprende, ya que al igual que en el WannaCry, no se puede determinar un motivo claro. Si hubiese ánimo de lucro detrás del ciberataque, robar y vender información pasando inadvertido sería mucho más rentable. “Hacer tanto ruido no tiene sentido cuando se quiere obtener un fin, es muy extraño”, recalca.

No es una réplica de WannaCry

Es un ciberataque mejor diseñado, menos amateur y que cuenta con estos movimientos laterales como principal novedad, “pero Petya no es un nuevo WannaCry sin interruptor de la muerte”, ha aclarado el joven conocido por MalwareTech que logró parar el virus con un dominio de 10 dólares hace un mes. “Es un malware común que no se propaga entre diferentes redes”.

WannaCry se extendió empleando exclusivamente la vulnerabilidad en el protocolo de red de algunas versiones de Windows que almacenaba la Agencia Nacional de Seguridad de Estados Unidos y que filtró el grupo Shadow Brokers. No hay evidencias de una propagación entre redes ahora, pero la infección inicial fue mayor.

“Petya se propagó posiblemente entre millones de ordenadores al comprometer el popular software ucraniano MeDoc, usando sus actualizaciones para instalar el virus”, dice MalwareTech en su blog. “Este vector inicial no está confirmado, incluso la compañía lo ha negado, pero hay evidencias que sostienen este punto”. Microsoft ha confirmado en su blog técnico que MeDoc ha sido uno de los vectores iniciales de infección a través de su sistema de actualización.

Teóricamente, aunque su propagación esté limitada a las redes locales, el héroe contra el WannaCry señala que teóricamente es posible que escape a otras redes si la máquina infectada tiene una dirección IP pública y tiene mal configurada la submáscara de red. Es difícil que se dé el caso, pero posible si se habla de un gran número de infectados.

(Fuente: elpais.com)

          FOSDEM preparations… done.   

I’ve produced several pin-on buttons to take with me to FOSDEM for giving away (as long as there are any left):

Several pin-on buttons I made

First row (nice projects), from left to right: MidnightBSD; Glenda, the Plan 9 bunny; Teckids e.V.

Second row (The MirOS Project): mksh; the Shilouette Dæmon; the “Triforce” (Live+Install CDs for i386 and sparc, with MirGrml); “the m” (alternative logo, vector)

Third row (things originating from tarent): Freedroidz (now a Teckids project); OSIAM (Identity and Access Management); tarent (tarent AG, tarent GmbH), who sponsored production of these buttons

Hm… jupp needs a button’able logo!


FOSDEM meetup


          Do you know Hackers can Infect Your Devices through subtitles? Learn more here   

If you are one of the millions of media lovers that grab subtitles to movies and series online, it may be time to put a check on that habit, at least in the short term. New report from the researchers at Check Point have have demonstrated how attackers infect subtitles with malicious code that can be used to exploit known loopholes in many popular media players, allowing the hacker to take control of your computer, tablets or smartphones. This attack vector affects a wide range of popular media consumption software ike Stremio, Popcorn Time, Kodi and VLC. The research shows that there are over 200 million people consuming media on the software that feature vulnerabilities that can be targeted with the attack vector. This firmly puts the “subtitle attack” as one of the most widespread in modern day. A demonstration that shows how the execution of the attack takes place in Popcorn Time and Kodi can be watched in this video link. This attack vector is powerful because most users and the affected media players treat the subtitle sources as clean and trustworthy. Similarly, anti-virus software used by most people treat subtitle files as non harmful text files and do not assess their nature carefully. Additionally, there are over 25 formats for subtitles, with varying features and capabilities. This gives room for wide range of vulnerabilities. The researchers at Check Point has notified media clients of the vulnerabilities. Some of them have taken steps to eliminate the threats but industry watchers believe that many of these are still unpatched. This is why there has been some secrecy on the part of media companies and the research company Check Point on the current state of things. So What Should You Do? Cybersecurity experts suggest staying away from content on the subtitle repositories, especially the more popular names. Additionally, update your anti-virus program as a good number of them have released patches that are targeted at the attack vectors. A more risky approach, is to use less popular media players that are less likely to be the target of such attacks for viewing media with such subtitles. There are a good number

The post Do you know Hackers can Infect Your Devices through subtitles? Learn more here appeared first on Internet Geek Girl.


          Make Noise 0-COAST : Analog Synth : NEW : [DETROIT MODULAR]   
$499.00
End Date: Sunday Jul-30-2017 0:29:24 PDT
Buy It Now for only: $499.00
Buy It Now | Add to watch list

          Buchla Music Easel Program Card 5 pack modular EMS   
$85.00
End Date: Friday Jul-7-2017 7:39:59 PDT
Buy It Now for only: $85.00
Buy It Now | Add to watch list

          Nonlinear Circuits Timbre for Eurorack   
$70.00 (0 Bids)
End Date: Thursday Jul-6-2017 9:02:10 PDT
Buy It Now for only: $100.00
Buy It Now | Bid now | Add to watch list

          Barracuda vs Barracuda - FIGHT [40k Tau]   

This morning the Forgeworld newletter gave some welcome news if you have any Forgeworld flyers or are thinking of getting any.  Not only did they release the initial experimental rules for the Tau Barracuda AX-5-2, but they also released an update for all forgeworld flyers giving them Combat Roles (including 3 new forgeworld specific combat roles), Pursuit and Assault values (link here).  Three flyers even got updated dataslates.

One of the interesting points on the flyer update is that the Barracuda and the Barracuda AX-5-2 are listed separately, which is strange since the original Barracuda is out of production now.

So what are the major changes with the AX-5-2 ?  Its a more hefty flyer being just over a third more expensive at base costs, but most of that increase will be coming from the fact that the AX-5-2 is 3 hull points against the 2 on the original Barracuda.  However would you rather have one of the new Barracuda or one of the old ones AND a Forgeworld Tetra for the same cost is a close call.


Weapon Loadout

Weapon wise the Barracuda AX-5-2 has very versatile weapon options.  The main gun on the original Barracuda was an Ion Cannon, while on the AX-5-2 starts with Heavy Burst Cannon and can swap it for a Barracuda Ion Cannon for free or pay 20 points to upgrade to a Swiftstrike Railgun.  The big thing for me is that the Barracuda Ion Cannon does not have the option to overcharge to get a Str8 AP3 large blast.  The Heavy Burst Cannon has twice the shots of the Ion Cannon, but the Str and AP is one worse and the range is a paltry 24" which is a pain on a flyer which moves so fast, and ideally wants its first shot at long range so it doesn't overshoot some potential targets the following turn.  The Swiftstrike Railgun is a Hammerhead railgun with half the range and no option for a Submunition round; a very nice option to be able to target flyers.  Overall I think the Ion Cannon is the best overall, but with the option to take secondary weapons to match the main weapons it opens up plenty of valid options,
The secondary weapons start as Long Barreled Burst Cannons, a nice upgrade over the original Barracuda's standard burst cannons with 2 extra shots each and twice the range. The burst cannons can be upgraded to standard Cyclic Ion Blasters.  A interesting note is that the Cyclic Ion Blasters are not long barreled like the burst cannons (so are restricted to the short 18" range), plus they are the standard Cyclic Ion Blasters from the Tau codex so can be overcharged (unlike the new Barracuda's Ion Cannon).

When I used to play with my Barracuda it wasn't impossible to get the 18" range burst cannons into range, but there were definitely times when when the Ion Cannon and Missile Pods best targets were outside the 18" range of the burst cannons.  With the new Barracuda's burst cannons having a long range it will nearly always be firing, and 12 extra shots is nothing to sniff about and probably makes up for the Ion Cannon not having a large blast option.  However the cyclic ion blaster does give some more high strength shots giving the option of having the Barracuda with all strength 7 or higher shots, becoming a very good anti tank and/or anti flier solution.  If you didn't want the option of a str 10 shot having an Ion Cannon and 2 cyclic Ion Blasters would give the Barracuda 11 (!!) str 7 shots.  The ultimate anti tank option is the Swiftstrike Railgun and Cyclic Ion Blasters, but that options starts getting expensive at an extra 30 points of ever the base AX-5-2, and pushes the cost of the Barracuda past 200 points.


So what loadout is "Ergonomically Terrific" ?

Overall I think the old Barracuda loadout of Ion Cannon and 2 Burst Cannons is the best general option for the new Barracuda.  You lose the option of the ion cannon large blast but you have more shots from the burst cannon that will be in range nearly all the time.

However the great thing about the new Barracuda is that they are very worthwhile alternative options.  You can go with loads of shots with 20 shots from heavy burst cannon, 2 long barreled burst cannons & missile pod, or you can go very anti tank with Swiftstrike Railgun, 2 Cyclic Ion Blasters, Missile Pod and Seeker Missiles.  Therefore choosing the right load-out will depend on the rest of your army, and what gap needs filling most.
Anything Else ?

The new Barracuda also has a few extra things over it's predecessor.  The new Barracuda has picked up Strafing Run, which means with it's combat role of Strike Fighter and its BS4 it can be hitting a great many land units on 2+.  It also has Dispersion Shield which gives it an invulnerable save against glancing (5+) and penetrating hits (6+), however because it has the Agile rule the Barracuda is likely to Jink if it is the target of any decent firepower for a 3+ cover save.


Summary

The new Barracuda is a very nice upgrade over the old one,  The biggest point being the increase in hull points from 2 to 3, but the extra weapon options gives it great versatility and allows you to make the Barracuda a better fit for your army.

Previously when I used the Barracuda it was a mainly ground attack craft, and the main threat was the large blast of the overcharged ion cannon, but what I particularly like is the extra range and shots on the burst cannons, meaning the previous load-out now gives 17 shots all at a range of 36" (or greater), and if you're concerned about heavy armour you can either upgrade the burst cannons to cyclic ion blasters for short range destruction and/or add on seeker missiles for longer ranged str8 firepower.

Overall a very nice addition to the Tau arsenal :)




          Can we improve neuropsychiatric outcomes in children with congenital heart disease?   

About 1 out of 100 babies are born with a congenital heart defects. Thanks to medical and surgical advances, these children usually survive into adulthood, but they are often left with developmental, behavioral or learning challenges. Children with “single-ventricle” defects — in which one of the heart’s two pumping chambers is too small or weak to...

The post Can we improve neuropsychiatric outcomes in children with congenital heart disease? appeared first on Vector.


          超A&G+で配信されている音声ファイルはw…   

超A&G+で配信されている音声ファイルはwma(Windows Media Audio)フォーマットです。
wmaフォーマットの音声ファイルはipodではサポートされていませんので、ipodで再生できるフォーマット(mp3・aac・wavなど)に変換しなければなりません。
ダウンロードしたwmaファイルはDRMによるプロテクトはかかっていませんので、音声ファイル変換ソフトを利用しipodで再生できる音声フォーマットに変換の上、ipodに変換した音声ファイルを転送して下さい。


音声ファイル変換ソフト(フリーソフト)

どこでも!iPod&iPhone&iPad&WALKMAN&PSP&DSi&携帯音楽
Free Audio Converter
BatchWOO!


          Electron-nucleus scalar-pseudoscalar interaction in PbF: Z-vector study in the relativistic coupled-cluster framework   
arXiv:1706.09221

by: Sasmal, Sudip
Abstract:
The scalar-pseudoscalar interaction constant of PbF in its ground state electronic configuration is calculated using the Z-vector method in the relativistic coupled-cluster framework. The precise calculated value is very important to set upper bound limit on P,T-odd scalar-pseudoscalar interaction constant, k_s, from the experimentally observed P,T-odd frequency shift. Further, the ratio of the effective electric field to the scalar-pseudoscalar interaction constant is also calculated which is required to get an independent upper bound limit of electric dipole moment of electron, d_e, and k_s and how these (d_e and k_s) are interrelated is also presented here.
          Vector Partners with Sequoia and Secures $21M in Series A Funding   

TUCSON, Ariz., June 29, 2017 /PRNewswire/ -- Vector, the micro satellite launch company that's decreasing barriers to entry and increasing speed to orbit, today announced $21M Series A funding led by Sequoia Capital, with participation from Shasta Ventures and Lightspeed. This round brings...



          Autologous intramuscular transplantation of engineered satellite cells induces exosome-mediated systemic expression of Fukutin-Related Protein and rescues disease phenotype in a murine model of Limb-Girdle Muscular Dystrophy Type 2I   
Abstract
α-Dystroglycanopathies are a group of muscular dystrophies characterized by α-DG hypoglycosylation and reduced extracellular ligand-binding affinity. Among other genes involved in the α-DG glycosylation process, fukutin related protein (FKRP) gene mutations generate a wide range of pathologies from mild limb girdle muscular dystrophy 2I (LGMD2I), severe congenital muscular dystrophy 1C (MDC1C), to Walker-Warburg Syndrome and Muscle-Eye-Brain disease. FKRP gene encodes for a glycosyltransferase that in vivo transfers a ribitol phosphate group from a CDP –ribitol present in muscles to α-DG, while in vitro it can be secreted as monomer of 60kDa. Consistently, new evidences reported glycosyltransferases in the blood, freely circulating or wrapped within vesicles. Although the physiological function of blood stream glycosyltransferases remains unclear, they are likely released from blood borne or distant cells. Thus, we hypothesized that freely or wrapped FKRP might circulate as an extracellular glycosyltransferase, able to exert a “glycan remodelling” process, even at distal compartments. Interestingly, we firstly demonstrated a successful transduction of MDC1C blood-derived CD133+ cells and FKRP L276IKI mouse derived satellite cells by a lentiviral vector expressing the wild-type of human FKRP gene. Moreover, we showed that LV-FKRP cells were driven to release exosomes carrying FKRP. Similarly, we observed the presence of FKRP positive exosomes in the plasma of FKRP L276IKI mice intramuscularly injected with engineered satellite cells. The distribution of FKRP protein boosted by exosomes determined its restoration within muscle tissues, an overall recovery of α-DG glycosylation and improved muscle strength, suggesting a systemic supply of FKRP protein acting as glycosyltransferase.

          Black Cat On Tower In Living Room Crop Vector Colour Contrast Enhance Revector Clip Art   
Download
          ミニマム MINIMUM ウォッシュ加工 ストレッチ 1B デニム テーラードジャケット 1   
ミニマム MINIMUM ウォッシュ加工 ストレ…
現在価格:372 円,入札数:-,終了日時:2017/07/02 22:46
          Create a font in less than three minutes with Glyphtracer and FontForge   
Jussi Pakkanen posted the following to the Fontforge list today:

Hi all

I have written a simple program to help creating fonts from images. It is called Glyphtracer. The basic idea is that you give it an image file containing all your glyphs. The program autodetects glyphs in the picture and allows the user to assign each detected glyph with a Unicode code point. These images are then traced to vectors and written to an SFD file. The rest of the work is then done with FontForge.

To make things clear, here's a video showing how you can create a font from scratch in about two minutes:
http://www.youtube.com/watch?v=T7x6mtptDAY

Glyphtracer's home page is https://launchpad.net/glyphtracer. The program is written entirely in PyQT4 and is currently Linux only.


Cool stuff!
          GraphicRiver Camping Infographic 20237884   
GraphicRiver Camping Infographic 20237884

GraphicRiver Camping Infographic 20237884
Stock Vector \ Conceptual \ Sports \ Activity
Explore \ Equipment \ Discover \ Design \ Flat \ Forest \ Mountaineering

          GraphicRiver Manicure Infographic Set 20238475   
GraphicRiver Manicure Infographic Set 20238475

GraphicRiver Manicure Infographic Set 20238475
Stock Vector \ Objects
Presentation \ Remover \ Polish \ Pedicure \ Organic \ Page \ Report \ Salon \ Text

          GraphicRiver Metal Barrier Stand 20238301   
GraphicRiver Metal Barrier Stand 20238301

GraphicRiver Metal Barrier Stand 20238301
Stock Vector \ Objects
Orange \ Road \ Metal \ Isolated \ Line \ Safety \ Security \ Symbol \ Traffic \ Stop

          Empleos - Diseñador Grafico - $ 14 000   
Benito Juárez 67288, México
Funciones a Realizar: Ayuda en actividades relativas a diseño gráfico Edición de imágenes Creación y manejo de vectores Apoyo a imagen punto de venta Diseño de imagen de nuevos productos y actualización de los ya existentes. Diseño de material publicitario digital e impreso *Requisitos: Manejo de software de diseño Suite Adobe Conocimiento “Illustrator” “Photoshop”
vivanuncios.com.mx

          RasterVect 24.5   

If you want to edit a raster file in your CAD program, you first have to convert it to a vector file. RasterVect does just that, transforming paper drawings or raster images into a vector format. Raster images can be imported by scanning original paper drawings. There is TWAIN and WIA support for importing from all scanners. The target vector formats (DXF, WMF, EMF, AI and EPS) are supported by most CAD applications that use vector graphics, such as Corel Draw, Adobe Illustrator, AutoCAD. There are viewing tools like scrolling, zooming and color selection. Features: Recognizes orthogonal and inclined lines, arcs and circles; Has four various conversion methods (outlines, centerlines etc); Has modes ORTHO, SNAP and OSNAP; Forms correct corners at crossing lines, arcs and circles; Keeps scale of an initial drawing; Can correct a turn angle of an initial raster drawing; Has despeckle filters; Can recognize color images or transform their to black-and-white for the subsequent recognition; Has Macros and Batch Mode; Has raster and vector editing features; Supports various raster formats, such as BMP, GIF, TIFF, JPEG, PNG, and so on; has own combined (raster+vector) format. Designed to work on all Windows platforms, RasterVect saves a lot of time. It's a replacement for traditional tracing and digitizing. It does provide a way to getting a paper drawings into your CAD program for quick and easy editing.

Copyright Betanews, Inc. 2017


          将改变我们生活的这些XML应用之二   
4. SVG
  Scalable Vector Graphics (SVG) 1.1 [W3C 推荐标准]是一种描述二维图像的语言。它主要是一种向量图形语言,尽管也支持一些光栅图形特性。SVG 的非凡雄心是提供一种实用的、灵活的、使用(以冗长闻名的)XML 表示的图像格式,而且在这点上做的很成功。SVG 的特性包括:嵌套转换、剪辑路径、alpha 蒙板、光栅过滤效果、模板对象,当然还有可扩展性。SVG 也支持动画、缩放和移动视图、各种图形原语、分组、脚本、超链接、结构化元数据、CSS、一种专用的 DOM 超集(DOM 和 CSS 前已述及),并且很容易嵌入其他 XML 文档。SVG 的一些设计决策经历了不很激烈的争论,其中包括向量路径在单个属性中使用空格