Anthony Enzor-DeMeo je novým CEO Mozilla Corporation. Mozillu převzal po dočasné CEO Lauře Chambers. Vybudovat chce nejdůvěryhodnější softwarovou společnost na světě. Firefox by se měl vyvinout v moderní AI prohlížeč.
Byla vydána nová verze 9.20 z Debianu vycházející linuxové distribuce DietPi pro (nejenom) jednodeskové počítače. Přehled novinek v poznámkách k vydání. Vypíchnout lze například nový balíček RustDesk Server pro vzdálený přístup.
Jonathan Thomas oznámil vydání nové verze 3.4.0 video editoru OpenShot (Wikipedie). Představení novinek také na YouTube. Zdrojové kódy OpenShotu jsou k dispozici na GitHubu. Ke stažení je i balíček ve formátu AppImage. Stačí jej stáhnout, nastavit právo na spouštění a spustit.
Byla vydána nová verze 1.6 otevřeného, licenčními poplatky nezatíženého, univerzálního ztrátového formátu komprese zvuku Opus (Wikipedie) a jeho referenční implementace libopus. Podrobnosti na demo stránce.
Vojtěch Polášek představil Vojtux, tj. linuxovou distribuci pro zrakově postižené uživatele. Vychází ze spinu Fedory 43 s desktopovým prostředím MATE. Konečným cílem je, aby žádný Vojtux nebyl potřeba a požadovaná vylepšení se dostala do upstreamu.
Byla vydána (Mastodon, 𝕏) druhá RC verze GIMPu 3.2. Přehled novinek v oznámení o vydání. Podrobně v souboru NEWS na GitLabu.
Nové číslo časopisu Raspberry Pi zdarma ke čtení: Raspberry Pi Official Magazine 160 (pdf).
Izrael od února zakáže dětem používat v prostorách základních škol mobilní telefony. Podle agentury AFP to uvedlo izraelské ministerstvo školství, které zdůraznilo negativní dopady, které na žactvo používání telefonů má. Izrael se tímto krokem přidává k rostoucímu počtu zemí, které dětem ve vzdělávacích zařízeních přístup k telefonům omezují.
Internetová společnost Google ze skupiny Alphabet pravděpodobně dostane příští rok pokutu od Evropské komise za nedostatečné dodržování pravidel proti upřednostňování vlastních služeb a produktů ve výsledcích vyhledávání. V březnu EK obvinila Google, že ve výsledcích vyhledávání upřednostňuje na úkor konkurence vlastní služby, například Google Shopping, Google Hotels a Google Flights. Případ staví Google proti specializovaným
… více »Byl oznámen program a spuštěna registrace na konferenci Prague PostgreSQL Developer Day 2026. Konference se koná 27. a 28. ledna a bude mít tři tracky s 18 přednáškami a jeden den workshopů.
Takže řetězec v Ruby teda není sekvence znaků? Jak se to projevuje?Imho naráží například na problémy s indexováním, kde indexování v ne-unicode přináší problémy s variable-lenght encoding u UTF-8, kde třeba znak
`á` zabírá dva bajty a `a` jen jeden. Pokud budu mít takovýto řetězec, tak přistoupením na konkrétní index získám v někdy neplatný odpad a jindy celý znak, což je krapet nepředvídatelné.
[1] pry(main)> str = 'příliš 黄色 лошадь' => "příliš 黄色 лошадь" [2] pry(main)> str.encoding => #<Encoding:UTF-8> [3] pry(main)> str.size => 16 [4] pry(main)> str.bytesize => 29 [5] pry(main)> str[10] => "л"
U datového typu řetězec mě nezajímá, jak je vnitřně uložen – to je interní věcí programovacího jazyka. Z hlediska programátora je řetězec sekvencí znaků, ideálně Unicode.jsme se dostali akorát k tomu, že řetězec nesmí být vnitřně uložen jako "bajtový chrchel". Příklad jazyka s nějakou zázračnou strukturou pro reprezentaci skutečných řetězců™ jste neuvedl a kde jsou v Ruby ty problémy s přistupováním k řetězcům jako sekvenci znaků také ne. Takže je asi zbytečné dále ztrácet čas.
str = 'příliš 黄色 лошадь'
puts str.encoding # UTF-8
file = File.open("rusian.txt", "r:KOI8-U")
strrus = ""
file.each {|line|
strrus << line
}
puts strrus.encoding # KOI8-U
cons = str + strrus # sample.rb:30:in `<main>': incompatible character encodings: UTF-8 and KOI8-U (Encoding::CompatibilityError)
Což by dávalo Pankrácovi za pravdu.
ruby -v
ruby 2.1.7p400 (2015-08-18 revision 51632) [x86_64-linux]
# -*- coding: utf-8 -*-
import codecs
s1 = 'příliš 黄色 лошадь'
f = codecs.open('rusian.txt', encoding='KOI8-U')
s2 = f.read()
print (s1, type(s1))
print (s2, type(s2))
print (s1 + s2) # příliš 黄色 лошадьлошадь
Nejprve máš plnou hubu keců jak je PHP hnusný, debilní a stupidní a že programuješ jen v dobrých jazycích. Když se člověk zeptá, aby si po cca 20 letech programocáni rozšířil obzory, tak dostane odpověď s vkusem každého soudruha.
Co vím, ideálního a dokonalý jazyk není - dělám v C# .NET, Java, PHP, Bash, Python, Perl, JS a každý á své neduhy.
V čem ty ostatní jazyky nejsou adekvátní náhrada?Většinou nemůžeš to existující statické stránky prostě vložit <?jazyk kousek_kódu ?>, který se prostě vykoná a vypíše.
To radšej prasácky jazyk a server a budem sa vyhýbať tomu čo sa označuje ako zlé praktiky.Hm. Označovat kým? Co může být víc zlé, než PHP?
Bolo by dobre rozlišovať programovacie a šablónovacie jazyky. Je v tom totiž dosť podstatný rozdiel.
PHP je webový framework napísaný v C. Jeho šablónovací jazyk (šablóny majú príponu .php) sú turing complete. Nie je to nič výnimočné čo by sa v iných šablónovacích jazykoch neobjavovalo. Nie je to síce žiadúce, ale je to tam.
Rozdiel je v tom, že programovacie jazyky nepotrebujú žiadne otváracie a uzatváracie značky označujúce "tu je kód" a zvyšok vyhoď na stdout.
Teoreticky môžem mať framework napísaný v pythone ktorý by som spustil podobne ako php-fpm (ak nepoznáš vygoogli si, predstavy o fungovaní webserveru niekedy okolo roku 2000 sú už prekonané a dnes sa považuje za rozumné použiť blbý webserver na obsluhu statického obsahu a zvyšok forwardovať na php-fpm, uwsgi ..., v minulosti sa pred apache dával varnish, lebo apache je žalostne pomalý), interpretoval by každý súbor s príponou .somskaredyjaknoc niektorým z týchto templatovacích systémov a mal by som prakticky to isté čo PHP. Spúšťalo by sa to tak isto, fungovalo by to tak isto ... ale načo keď sa to dá riešiť lepšie?
% grep -R "item.name" . ./static/js/richeditor/editor.js: link.name = item.name; ./static/vendor/ckeditor/samples/plugins/toolbar/toolbar.html: names.push( buttonsNames[ item.name ] );
Templatovací jazyk je jazyk ebedovaný v dokumente. Ja v shakalovi používam templatovací engine jinja2.
Premenné pomenované z RND generátoru bez jedinej poznámky zrejme sa dá prasiť všade.
Neviem koľko krát som to povedal povedz presne kde ti chýba dokumentácia, ja ju doplním. Neviem kde si pozeral, ale hádam všetko okrem HTML parsera ktorý chcem vyhodiť hneď keď nájdem náhradu je ok. A to keď si porovnám s PHP-čkovou verziou tak vyzerá ešte celkom ok:
static $pos=0;
static $opened_tag=array();
static $depth=0;
static $r=array();
static $empty=array();
while ($pos<$num)
{
$char=$html[$pos];
if ($char=='<'&&$pos<$num-1)
{
$pos++;
$char=$html[$pos];
$tag="";
while ($char!='>'&&$pos<$num-1)
{
$tag=$tag.$char;
$pos++;
$char=$html[$pos];
}
if (strlen($tag)==0)
array_push($error,array($pos,"empty",strlen($out)));
else
{
if ($tag[0]=="/")
{
$name=substr($tag,1);
$depth--;
$open_tag=array_pop($opened_tag);
// Oprava span
if ($name=="span")
{
if (is_array($open_tag))
{
$span_tags=array_reverse($open_tag);
$name=implode("></",$span_tags);
$open_tag=$name;
}
else
array_push($error,array($pos,"close",strlen($out),$name));
}
// Oprava span
if ($name==$open_tag)
{
$out=$out."</".$name.">";
}
else
array_push($error,array($pos,"close",strlen($out),$name));
if (isset($r[$depth])) {
if (count($r[$depth])!=0) {
array_push($error,array($pos,"req",array_pop($r[$depth])));
}
}
if ($empty[$depth])
array_push($error,array($pos,"empty",$name));
}
elseif ($tag[strlen($tag)-1]=="/")
{
$name=substr($tag,0,strpos($tag,' '));
$out=$out."<".$name." />";
}
else
{
$empty[$depth]=true;
$name=substr($tag,0,strpos($tag,' ')?strpos($tag,' '):strlen($tag));
$opened_tag[$depth]=$name;
if ($depth==0) {
if (!in_array($name,$tags["root"]["tags"]["o"])) {
array_push($error,array($pos,"unknown",$name));
$name="";
unset($opened_tag[$depth]);
}
else {
if (isset($tags[$name]["tags"]["r"]))
$r[$depth]=$tags[$name]["tags"]["r"];
else
$r[$depth]=array();
}
}
else {
if (isset($opened_tag[$depth-1])&&isset($tags[$opened_tag[$depth-1]])) {
if (!in_array($name,$tags[$opened_tag[$depth-1]]["tags"]["o"])&&!in_array($name,$tags[$opened_tag[$depth-1]]["tags"]["r"])) {
array_push($error,array($pos,"unknown",$name));
$name="";
unset($opened_tag[$depth]);
}
else {
if (isset($r[$depth-1])) {
foreach ($r[$depth-1] as $id=>$t) {
if ($name==$t)
unset($r[$depth-1][$id]);
}
}
$r[$depth]=$tags[$name]["tags"]["r"];
}
}
else {
unset($opened_tag[$depth]);
array_push($error,array($pos,"unknown",$name));
$name="";
}
}
//array_push($error,array($pos,"not_closed",array_pop($opened_tag)));
// Oprava span
if ($name=="span")
{
$style=substr($tag,strpos($tag,'=')+2,strrpos($tag,'"')-strpos($tag,'=')-2);
$stylea=explode(';',$style);
foreach ($stylea as $style)
{
$position=0;
//ostranime zbytočné medzery
$stylecp="";
while ($position<strlen($style))
{
if ($style[$position]!=' ')
$stylecp=$stylecp.$style[$position];
$position++;
}
$at=explode(":",$stylecp);
if (count($at)==2)
$tag_array[$at[0]]=$at[1];
}
$out_tag=array();
if (isset($tag_array["font-weight"]))
{
if ($tag_array["font-weight"]=="bold")
$out_tag[0]="b";
}
if (isset($tag_array["font-style"]))
{
if ($tag_array["font-style"]=="italic")
$out_tag[1]="i";
}
if (isset($tag_array["text-decoration"]))
{
if ($tag_array["text-decoration"]=="underline")
$out_tag[2]="u";
}
$tag=implode("><",$out_tag);
$opened_tag[$depth]=$out_tag;
}
// Oprava span
$depth++;
if (strlen($tag)>0) {
$out=$out."<".$tag.">";
}
Parser::parse($html,$error,$out,$num);
}
}
}
elseif ($char!=">")
{
if ($char==' '||$char=="\t"||$char=="\n"||$char=="\r") {
if ($char=="\r") {
$cont=false;
if (isset($html[$pos-1])) {
if ($html[$pos-1]=='>')
$cont=true;
}
if (isset($html[$pos+1])) {
if ($html[$pos+1]=='<')
$cont=true;
}
if (isset($html[$pos+2])) {
if ($html[$pos+2]=='<')
$cont=true;
}
if (!$cont) {
if ($depth==0)
$char="<br />";
elseif($tags[$opened_tag[$depth-1]]["e"]=="n"&&$opened_tag[$depth-1]!="pre")
$char="<br />";
}
}
}
else {
if (isset($empty[$depth-1])) {
if ($empty[$depth-1]) {
for ($j=0; $j<$depth; $j++)
$empty[$j]=false;
}
if (isset($opened_tag[$depth-1])&&isset($tags[$opened_tag[$depth-1]])) {
if ($tags[$opened_tag[$depth-1]]["e"]=="y") {
array_push($error,array($pos,"ue",$opened_tag[$depth-1]));
}
}
}
}
$out=$out.$char;
}
$pos++;
}
if ($pos==$num)
{
if (count($opened_tag)>0)
{
array_push($error,array($pos,"not_closed",array_pop($opened_tag)));
}
}
prostě pošle výstup a o ten se postará web server
Záleží na tom aký webserver. Autor komentára žije v predstave že správne je keď je webserver tlstý a keď si vypýtam súbor index.php tak ho webserver vezme, nájde tam reťazce <?php a ?> a ich obsah nahradí tým, čo vráti php-čkovy eval. Ešte raz zdôrazňujem, že toto robí priamo web server, nie PHP, nie niekto iný, ale webserver pri štarte loadne shared object (knižnicu) a stará sa o tieto veci sám. PHP teda beží v procese apacha, ak má pretečenie stacku alebo niečo podobné má rovnaké práva ako apache, ak sa zasekne tak proste zasekne proces apacha, lebo nie je nijako oddelený. Z historických vecí spomeniem ešte htaccess a mod_rewrite, ktoré sa využívali na to, aby sa s PHP dali dosiahnuť pekné URL adresy (teda mod_rewrite zvyčajne prepísal adresy typu /kravina/1/ na index.php?dajmi=kravina&id=1).
Túto predstavu narušil až príchod web serverov, ktoré vedia dobre jednu vec - obsluhovať HTTP(S). Taký nginx je proste blbý proces ktorý na rozdiel od apacha ani len nespúšťa vlákna pri požiadavke. Celé spracovanie funguje v jednom event-loope. Otvorené spojenie na rozdiel od apacha nepotrebuje žiaden vlastný stack, ukladá len minimálnu informáciu o stave (doslova pár B). Preto pre nginx nie je problém nechávať http spojenie aktívne aj niekoľko hodín a kľudne môže mať niekoľko tisíc (až kým nedôjdu porty) aktívnhych spojení súšasne a spotrebou pamäte to prakticky ani nepohne. Väčšina požiadaviek na web server sú jednoduché požiadavky na statický súbor (zvyčajne 1 request na webovú stránku a mnoho requestov na css, javascripty, obrázky ...) a to vedia blbé web servery na rozdiel od apacha s minimálnou réžiou. Potom už stačí len nastaviť nech zvyšné požiadavky preposiela serveru, ktorý obsluhuje dynamické veci. Na webhostingoch je to často apache (u nás najväčší hosting websupport to má takto riešené, jednoducho pred apachom je nginx, ktorý sa stará o statické súbory a dynamické veci rieši apache ktorý je tam kvôli kompatibilite s htaccess). Ak nie je potrebný htacces je možné apache vynechať a posielať požiadavky rovno na php-fpm, uwsgi, unicorn, gunicorn ... To, že je to budúcnosť už pochopili aj zadubenci z PHP a od verzie 5.3 je php-fpm štandardnou súčasťou PHP. Keby ešte neboli banda idiotov a riešili si bezpečnostné diery ...
Ešte aby som trochu dovysvetlil: PHP je ekvivalent ERB v ruby on rails. PHP je webový framework napísaný v C. Ruby on rails je webový framework napísaný v ruby. PHP je možné programovať v C (a pár krát som bol nútený si prepísať niektoré funkcie ktorým leakovala pamäť sám v C). Ruby on rails zase v ruby. Niektorí ľudia sú schopní písať aplikácie v šablónovacom jazyku PHP. Väčšinou si tá skupinka ľudí uzatvára kód do divných značiek lebo inak by im web server vrátil celý kód v nedotknutom stave.
# apt-get install php5-fpm php5 # lighttpd-enable-mod fastcgi # lighttpd-enable-mod fastcgi-php # /etc/init.d/lighttpd force-reload # mv index.html index.php # vim index.php > <?php echo "ahoj"; ?>Podle mě je tohle ten důvod, proč si snad všichni jako první zkusí helloworld v PHP, no a pak už u něj zůstanou (můžu se mýlit).
# apt-get install ruby-sinatra
# mkdir views
# mv index.html views/index.erb
# vim myapp.rb
> require 'sinatra'
> get('/') { erb :index }
# vim views/index.erb
> <%= 'hello world!'%>
# ruby myapp.rb
Já proti PHP vcelku nic nemám, prasit se dá ve všem. Jen si myslím, že vstupní bariéra mohla být argument možná tak před 10 lety.
Kde sa stratila windows 9?
.
Tiskni
Sdílej: