abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
    dnes 15:44 | Zajímavý software

    TerminalPhone (png) je skript v Bashi pro push-to-talk hlasovou a textovou komunikaci přes Tor využívající .onion adresy.

    Ladislav Hagara | Komentářů: 3
    dnes 12:22 | IT novinky

    Před dvěma lety zavedli operátoři ochranu proti podvrženým hovorům, kdy volající falšuje čísla anebo se vydává za někoho jiného. Nyní v roce 2026 blokují operátoři díky nasazeným technologiím v průměru 3 miliony pokusů o podvodný hovor měsíčně (tzn., že k propojení na zákazníka vůbec nedojde). Ochrana před tzv. spoofingem je pro zákazníky a zákaznice všech tří operátorů zdarma, ať už jde o mobilní čísla nebo pevné linky.

    Ladislav Hagara | Komentářů: 7
    dnes 03:44 | Komunita

    Společnost Meta (Facebook) předává React, React Native a související projekty jako JSX nadaci React Foundation patřící pod Linux Foundation. Zakládajícími členy React Foundation jsou Amazon, Callstack, Expo, Huawei, Meta, Microsoft, Software Mansion a Vercel.

    Ladislav Hagara | Komentářů: 3
    dnes 01:22 | IT novinky

    Samsung na akci Galaxy Unpacked February 2026 (YouTube) představil své nové telefony Galaxy S26, S26+ a S26 Ultra a sluchátka Galaxy Buds4 a Buds4 Pro. Telefon Galaxy S26 Ultra má nový typ displeje (Privacy Display) chránící obsah na obrazovce před zvědavými pohledy (YouTube).

    Ladislav Hagara | Komentářů: 3
    dnes 00:22 | Nová verze

    Byla vydána grafická knihovna Mesa 26.0.1 s podporou API OpenGL 4.6 a Vulkan 1.4. Je to první stabilní verze po 26.0.0, kde se novinky týkají mj. výkonu ray tracingu na GPU AMD a HoneyKrisp, implementace API Vulkan pro macOS.

    |🇵🇸 | Komentářů: 0
    včera 20:22 | Nová verze

    Byla vydána nová verze 4.6 multiplatformního integrovaného vývojového prostředí (IDE) pro rychlý vývoj aplikaci (RAD) ve Free Pascalu Lazarus (Wikipedie). Využíván je Free Pascal Compiler (FPC) 3.2.2.

    Ladislav Hagara | Komentářů: 0
    včera 18:00 | Nová verze

    Byla vydána nová verze 3.23.0 FreeRDP, tj. svobodné implementace protokolu RDP (Remote Desktop Protocol). Opravuje 11 bezpečnostních chyb.

    Ladislav Hagara | Komentářů: 0
    včera 17:44 | Zajímavý článek

    Španělský softwarový inženýr oznámil, že se mu podařilo na dálku ovládat sedm tisíc robotických vysavačů po celém světě. Upozornil tak na slabé kybernetické zabezpečení těchto technologií a jejich možné a snadné zneužití. Nesnažil se hacknout všechny robotické vysavače po světě, ale pouze propojil svůj nový DJI Romo vysavač se zařízením Playstation. Aplikace podle něj ihned začala komunikovat se všemi sedmi tisíci spotřebiči a on je

    … více »
    Ladislav Hagara | Komentářů: 9
    včera 03:33 | Humor

    Momo je fenka cavapoo, která svými náhodnými stisky kláves bezdrátové klávesnice vytváří jednoduché počítačové hry. Technicky to funguje tak, že Raspberry Pi s připojenou bluetooth klávesnicí posílá text do Claude Code, který pak v Godotu píše hry a sám je i testuje pomocí screenshotů a jednoduchých simulovaných vstupů. Za stisky kláves je Momo automaticky odměňována pamlsky. Klíčový je pro projekt prompt, který instruuje AI, aby i

    … více »
    NUKE GAZA! 🎆 | Komentářů: 26
    včera 02:22 | Nová verze

    GNU awk (gawk), implementace specializovaného programovacího jazyka pro zpracování textu, byl vydán ve verzi 5.4.0. Jedná se o větší vydání po více než dvou letech. Mezi četnými změnami figuruje např. MinRX nově jako výchozí implementace pro regulární výrazy.

    |🇵🇸 | Komentářů: 1
    Které desktopové prostředí na Linuxu používáte?
     (18%)
     (6%)
     (0%)
     (11%)
     (27%)
     (2%)
     (5%)
     (2%)
     (13%)
     (26%)
    Celkem 963 hlasů
     Komentářů: 25, poslední 3.2. 19:50
    Rozcestník

    Funkcionální hrátky

    18.4.2007 14:44 | Přečteno: 1566× | erlang | Výběrový blog | poslední úprava: 18.4.2007 15:10

    Když zdrojový kód zkrátíte a zároveň vám vzroste rychlost exekuce, tak si můžete být skoro jistí, že už do toho pomalu pronikáte. Prohlížel jsem si takhle nějaký kód v erlangu a viděl jsem tam takovou hezkou vychytávku (stejná myšlenka je použita níže ve funkci mapper/2 a collector/2), kdy dotyčný procházel pomocí lists:foldl list a zároveň z něho vytvářel slovník (dict). No a pak mě napadlo jestli bych taky nemohl přepsat stavový algoritmus z mého prvního erlangového modulu na rekurzivní, ale se schopností foldl/foldr funkce a pak ostatní funkce jako map a perms přepsat se stejným trikem. Zároveň mi vrtalo hlavou jestli se to náhodou nezrychlí a byl jsem dost překvený, nárust výkonu byl více než dvojnásobný a kódu dost podstatně ubylo (dostal jsem se na 1,1 us což je ani ne 2x víc než v C napsaný Alghoritm-Permute pro perl!).

    Pak jsem udělal ještě drobnou úpravu (viz ugly), která je z funkčního hlediska zbytečná, ale rychlost to ještě trošku zvedlo. Taky jsem udělal generátor, aby se dalo použít podobně jako původní kód, ale tam tam rychlost poklesla, ale je jen o něco pomalejší než původní. Z toho je pěkně vidět, že to zaslání několika miliónů zpráv tam a zpátky umí erlang udělat opravdu rychle.

    Nejdříve dokumentace

    Module perms

    perms - Permutation generator.

    Copyright © 2007 Hynek Vychodil

    Version: 0.0.2

    Authors: Hynek Vychodil (pichi@nekde.top) [web site: http://www.abclinuxu.cz/blog/Pichi].

    Description

    perms - Permutation generator

    This module provides "simply" permutation generator with state support.

    Usage

     > perms:perms([a,b,c]).
     [[a,b,c],[a,c,b],[b,a,c],[b,c,a],[c,a,b],[c,b,a]]
     > perms:foreach(fun(P)->io:format("~p~n",[P]) end, [a,b,c]).
     [a,b,c]
     [a,c,b]
     [b,a,c]
     [b,c,a]
     [c,a,b]
     [c,b,a]
     ok
     > perms:foldl(fun perms:inc/2, 0, lists:seq(1,10)).
     3628800
     > perms:map(fun(P)->io:format("~p~n",[P]), P end, [a,b,c]).
     [c,b,a]
     [b,c,a]
     [c,a,b]
     [a,c,b]
     [b,a,c]
     [a,b,c]
     [[a,b,c],[b,a,c],[a,c,b],[c,a,b],[b,c,a],[c,b,a]]
      % see map/2 why called in reverse order
     > F = perms:new([a,b,c]).
     <0.199.0>
     > perms:next(F).
     [a,b,c]
     > perms:next(F).
     [a,c,b]
     > perms:free(F).
     free
     > perms:next(F).
     '$end_of_table'

    Data Types

    foldFun()

    foldFun() = (P::list(), AccIn) -> AccOut

    Function Index

    first/1(Deprecated.) Makes first permutation (same as original L) and Generator.
    foldl/3Folds permutations of L.
    foldr/3Same as foldl/3 but in reverse order.
    foreach/2Call F for each permutation P of L.
    free/1Terminate Generator before all permutation passed (free memory).
    generatorTest/1Test generator for benchmarking purposes.
    inc/2Counter.
    map/2Makes Result list() of Res results from calling F on each permutations P of L.
    mapr/2Makes reversed Result list() of Res results from calling F on each permutations P of L but F is called in right order of permutations e.g.
    new/1Make new permutation generator.
    next/1Makes next permutation P from Generator.
    perms/1Returns list() containing all L's permutations.

    Function Details

    first/1

    first(L::list()) -> {L::list(), Generator::pid()}

    This function is deprecated: Use S=new(L), next(S) instead.

    Makes first permutation (same as original L) and Generator.

    See also: next/1.

    foldl/3

    foldl(F::foldFun(), Acc0, L::list()) -> Acc

    Folds permutations of L. Calls F on each permutation of L. Acc0 is passed as AccIn to firts F call and each AccOut is passed to next F call. Last F call result is returned as Acc.

    foldr/3

    foldr(F, Acc0, L::list()) -> Acc

    Same as foldl/3 but in reverse order.

    foreach/2

    foreach(F, L::list()) -> ok

    Call F for each permutation P of L.

    free/1

    free(Generator::pid()) -> free

    Terminate Generator before all permutation passed (free memory).

    generatorTest/1

    generatorTest(L::list()) -> ok

    Test generator for benchmarking purposes. Generator use is about four times slower than perms/1, foreach/2, map/2 and foldl/3 but consumed less memory except foreach/2 and foldl/3.

    inc/2

    inc(Ignored::any(), CIn::number()) -> COut::number

    Counter. Returns second argument increased by one. Can be used as foldFun() mainly for testing purposes.

    map/2

    map(F, L::list()) -> Result::list()

    Makes Result list() of Res results from calling F on each permutations P of L. Warning: For implementation reasons F is called on permutations in reverese order. If order is important use lists:reverse(mapr(F, L)) instead

    See also: mapr/2.

    mapr/2

    mapr(F, L::list()) -> Result::list()

    Makes reversed Result list() of Res results from calling F on each permutations P of L but F is called in right order of permutations e.g. original L as the first, two last elements swaped as the second, etc.

    See also: map/2.

    new/1

    new(L::list()) -> Generator::pid()

    Make new permutation generator.

    next/1

    next(Generator::pid()) -> P::list()

    Makes next permutation P from Generator.

    perms/1

    perms(L::list()) -> Permutations::list()

    Returns list() containing all L's permutations.

    A zdroják

    %% @copyright 2007 Hynek Vychodil
    %% @author Hynek Vychodil <pichi@nekde.top>
    %%   [http://www.abclinuxu.cz/blog/Pichi]
    %% @version 0.0.2
    %% @end
    %% =====================================================================
    %% @doc perms - Permutation generator
    %%
    %% This module provides "simply" permutation generator with state support.
    %%
    %% == Usage ==
    %%```
    %%> perms:perms([a,b,c]).
    %%[[a,b,c],[a,c,b],[b,a,c],[b,c,a],[c,a,b],[c,b,a]]
    %%> perms:foreach(fun(P)->io:format("~p~n",[P]) end, [a,b,c]).
    %%[a,b,c]
    %%[a,c,b]
    %%[b,a,c]
    %%[b,c,a]
    %%[c,a,b]
    %%[c,b,a]
    %%ok
    %%> perms:foldl(fun perms:inc/2, 0, lists:seq(1,10)).
    %%3628800
    %%> perms:map(fun(P)->io:format("~p~n",[P]), P end, [a,b,c]).
    %%[c,b,a]
    %%[b,c,a]
    %%[c,a,b]
    %%[a,c,b]
    %%[b,a,c]
    %%[a,b,c]
    %%[[a,b,c],[b,a,c],[a,c,b],[c,a,b],[b,c,a],[c,b,a]]
    %% % see map/2 why called in reverse order
    %%> F = perms:new([a,b,c]).
    %%<0.199.0>
    %%> perms:next(F).
    %%[a,b,c]
    %%> perms:next(F).
    %%[a,c,b]
    %%> perms:free(F).
    %%free
    %%> perms:next(F).
    %%'$end_of_table'
    %%'''
    
    -module(perms).
    -export([perms/1, foreach/2, map/2, mapr/2, foldl/3, foldr/3]).
    -export([first/1, next/1, new/1, free/1, inc/2, generatorTest/1]).
    -version("0.0.2").
    -import(lists, [reverse/1, reverse/2]).
    
    %% @spec (list()) -> Permutations::list()
    %% @doc Returns {@type list()} containing all `L''s permutations.
    perms(L) -> foldr(fun collector/2, [], L).
    
    collector(P, L) -> [P|L].
    
    %% @spec (F, list()) -> ok
    %% 	F = (P::list()) -> any()
    %% @doc Call `F' for each permutation `P' of `L'.
    foreach(F,L) -> foldl(fun do/2, F, L), ok.
    
    do(P, F) -> F(P), F.
    
    %% @spec (F, list()) -> Result::list()
    %%	F = (P::list()) -> Res
    %%	Result = [Res]
    %% @doc Makes `Result' {@type list()} of `Res' results from calling `F' on each permutations `P' of `L'.
    %% Warning: For implementation reasons `F' is called on permutations in reverese order.
    %% If order is important use `lists:reverse(mapr(F, L))' instead
    %% @see mapr/2
    map(F, L) -> element(2, foldr(fun mapper/2, {F, []}, L)).
    
    mapper(P, {F, L}) -> {F, [F(P)|L]}.
    
    %% @spec (F, list()) -> Result::list()
    %%	F = (P::list()) -> Res
    %%	Result = [Res]
    %% @doc Makes reversed `Result' {@type list()} of `Res' results from calling `F' on each permutations `P' of `L'
    %% but `F' is called in right order of permutations e.g. original `L' as the first, two last elements swaped as the second, etc.
    %% @see map/2
    mapr(F, L) -> element(2, foldl(fun mapper/2, {F, []}, L)).
    
    %% @spec (F::foldFun(), Acc0, list()) -> Acc
    %% @type foldFun() = (P::list(), AccIn) -> AccOut
    %% @doc Folds permutations of `L'. Calls `F' on each permutation of `L'. `Acc0' is passed as `AccIn' to firts `F' call
    %% and each `AccOut' is passed to next `F' call.
    %% Last `F' call result is returned as `Acc'.
    foldl(F, Acc0, L) -> foldr(F, Acc0, reverse(L)).
    
    %% @spec (F, Acc0, list()) -> Acc
    %%	F = (P::list(), AccIn) -> AccOut
    %% @doc Same as {@link foldl/3} but in reverse order.
    foldr(F, Acc0, L) -> foldr(F, _AccIn = Acc0, L, _PermTail=[]).
    
    foldr(F, AccIn, [], Perm) -> F(Perm, AccIn);
    foldr(F, AccIn, L, PermTail) -> foldr(F, AccIn, _ToDo=L, _Done=[], PermTail).
    
    foldr(_F, AccIn, [] = _ToDo, _Done, _PermTail) -> AccIn;
    foldr(F, AccIn, [H] = _ToDo, [] = _Done, PermTail) -> F([H|PermTail], AccIn); % ugly but minor speed up (~10%)
    foldr(F, AccIn, [H|T] = _ToDo, Done, PermTail) ->
    	foldr(F,
    		_NewAcc = foldr(F, AccIn, reverse(Done, T), [H|PermTail]),
    		T, [H|Done], PermTail).
    
    %% @spec (Ignored::any(), CIn::number()) -> COut::number
    %% @doc Counter. Returns second argument increased by one. Can be used as {@type foldFun()} mainly for testing purposes.
    inc(_,A) -> A+1.
    
    %% @spec (list())->Generator::pid()
    %% @doc Make new permutation generator.
    new(L) -> spawn(fun() -> foreach(fun receiver/1, L) end).
    
    %% @spec (list()) -> {L::list(), Generator::pid()}
    %% @doc Makes first permutation (same as original `L') and `Generator'.
    %% @deprecated Use `S=new(L), next(S)' instead.
    %% @see next/1
    first(L) -> S=new(L), {next(S), S}.
    
    %% @spec (Generator::pid()) -> P::list()
    %% @doc Makes next permutation `P' from `Generator'.
    next(S) ->
    	case process_info(S, status) of
    		undefined -> '$end_of_table';
    		_ ->
    			S ! self(),
    			receive
    				{S, P} -> P
    			end
    	end.
    
    %% @spec (Generator::pid()) -> free
    %% @doc Terminate `Generator' before all permutation passed (free memory).
    free(S) -> S ! free.
    
    receiver(P) ->
    	receive
    		free -> exit(normal);
    		PID when is_pid(PID) ->
    			PID ! {self(), P}
    	end.
    
    %% @spec (list()) -> ok
    %% @doc Test generator for benchmarking purposes.
    %% Generator use is about four times slower than {@link perms/1},
    %% {@link foreach/2}, {@link map/2} and {@link foldl/3} but consumed less memory except {@link foreach/2} and {@link foldl/3}.
    generatorTest(L) -> generatorTest(new(L), next).
    
    generatorTest(_, '$end_of_table') -> ok;
    generatorTest(S, _) -> generatorTest(S, next(S)).
    
           

    Hodnocení: 88 %

            špatnédobré        

    Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

    Komentáře

    Vložit další komentář

    18.4.2007 17:03 MichalC
    Rozbalit Rozbalit vše Re: Funkcionální hrátky
    Asi je to mírně OT, ale proč jste si vybral a soukáte do sebe Erlang a ne např. Haskell, který má IMHO přehlednější syntaxi, kompiler produkující rychlejší kód(GHC - téměř na úrovni gcc) a má i větší podporu externích knihoven (databáze, GUI, sítě, web,...) ?
    Marek Bernát avatar 18.4.2007 20:22 Marek Bernát | skóre: 17 | blog: Arcadia
    Rozbalit Rozbalit vše Re: Funkcionální hrátky
    Miešate jablká s hruškami; sú to v podstate úplne odlišné jazyky.
    physics.stackexchange.com -- Q&A stránky o fyzike v štýle StackOverflow.
    18.4.2007 21:08 Hynek (Pichi) Vychodil | skóre: 43 | blog: Pichi | Brno
    Rozbalit Rozbalit vše Re: Funkcionální hrátky
    Nevím jestli jste četl můj před předchozí blog a diskusi pod ním. Problém je v tom, že o Haskelu toho málo vím, kdežto do erlangu jsem aspoň trochu pronikl za nějakých čtrnáct dní vedle práce, shánění bydlení a spousty dalších věcí. Takže mi rozšiřte obzory, jak je na tom Haskel s thready, zasíláním správ, masivním paralelizmem, distribucí, code hot swapingem, průmyslově ověřenou spolehlivostí a dalšími vlastnostmi. Hlavně mě zajímají ty tenká vlákna a komunikace mezi nimi včetně toho, když běží na různém HW. Ten code hot swaping by byla příjemná třešnička na dortu. Už někdo začal psát v Haskelu něco jako Termite? Mimochodem, podle čeho soudíte, že má Haskel větší podporu externích knihoven (databáze, GUI, sítě, web,...)? Taky bych si to tak tipnul, ale tvrdit bych si to asi nedovolil. Ale kdybych vybíral jen podle toho, tak bych asi volil perl :-)
    XML je zbytečný, pomalý, nešikovný balast, znovu vynalézané kolo a ještě ke všemu šišaté, těžké a kýčovitě pomalované.
    18.4.2007 22:04 geordi | Ostrava
    Rozbalit Rozbalit vše Re: Funkcionální hrátky
    Uprimne, moc se tim nezabyvam, ale z toho co jsem precetl, tak predelat Haskell na paralelni jazyk je jednodussi, nez to same udelat se Scheme. Asi si tu prosku pletu pojmy ;-)

    Pokud vim, tak Haskell na rozdil od Scheme nema side efecty, takze by to teoreticky melo byt jednodussi.

    Glasgow Parallel Haskell

    Glasgow Distributed Haskell

    Jako lakadlo na Haskell bych doporucil defmacro.org.

    Jinak Erlang je proste jednou prumyslove overena vec a ve spojeni s OTP asi tezko porazitelna. Haskell je vsak podobne jake Scheme urcen primarne pro vyuku nebo alespon na zacatku to tak bylo, proto je jejich syntaxe lepe citelna.

    Takto se to jevi mne pri pohledu z vrtulniku.
    19.4.2007 10:26 Hynek (Pichi) Vychodil | skóre: 43 | blog: Pichi | Brno
    Rozbalit Rozbalit vše Re: Funkcionální hrátky
    Ten Glasgow Distributed Haskell je zajímavý, ještě, kdyby tomu doprogramovali pár drobností jako node conector, code loader a další hračičky z erlangu a začíná to být zajímavé. Mimochodem lidi od Haskellu jsou celkem aktivní na erlang konferencích (běžné pojmenování pro telekomunikační konferenci :-) ). Haskel má v tomhle směru celkem hezky našlápnuto, ale já na něj nemám teď moc čas, bohužel. Kdyby byl už dnes na úrovni erlnagu, tak si na něj ten čas aspoň zkusím udělat, protože má mnohem lepší optimalizace a kompilátor.
    XML je zbytečný, pomalý, nešikovný balast, znovu vynalézané kolo a ještě ke všemu šišaté, těžké a kýčovitě pomalované.

    Založit nové vláknoNahoru

    ISSN 1214-1267   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.