Difference between revision 6 and current revision
No diff available." 1. Learn Key Syscalls
You should know what the following 12 key system calls do, which you'll see regularly in strace output. Test your knowledge! How many of these do you know? Mouse-over for answers. syscall what it does read write open close fork exec connect accept stat ioctl mmap brk
Click here to reveal all. Each syscall has a man page, so if you are at the command line, it should only take a few seconds to jog your memory.
There are variants of these syscalls, so you may see "execve" for "exec", and "pread" as well as "read". There should be man pages for these, too.
"
---
" Category of Syscall Syscalls Seen in Critical Sections Frequency in Critsecs: MySQL? Firefox Time gettimeofday , clock gettime 3.91% 70.18%
Filesystem read* , write* , open , close , lseek , access , dup , mkdir , ftruncate , fsync , writev , pread* , pwrite* , stat , fstat , fcntl , getdents , getcwd , fdatasync , mmap* , munmap* , mprotect* 53.79% 28.75%
Process Memory brk , mmap* , munmap* , mprotect* 31.03% 0.32%
Process Maintenance waitpid , clone , sched setscheduler , sched get priority max , sched get priority min , rt sigaction , rt sigprocmask , tgkill 8.97% 0.32%
Communication ioctl , socket , pipe , read* , write* , pread* , pwrite* 2.07% 0.40%
System Info sysinfo , uname 0.23% 0.03%
Table 1. Syscalls Seen in Critical Sections Six different categories of syscall were seen in critical sections in MySQL? and Firefox; their dynamic distributions in the critical sections of each workload are shown at right. Communications syscalls, which are most difficult to make transaction-safe, are uncommon. Syscalls marked with asterisks belong to several categories "
---
" vectors. The process of transforming filtered system calls into the histogram representation is depicted in Python algorithm 5.1.
Histogram Raw Normalised recvfrom 25284 0.2968720 write 12396 0.1455476 epoll_pwait 11581 0.1359783 futex 9995 0.1173562 getuid 6209 0.0729029 ioctl 5244 0.0615724 sendto 4512 0.0529776 read 4108 0.0482340 mprotect 1509 0.0177179 pread64 691 0.0081133 mmap 613 0.0071975 newfstatat 418 0.0049079 munmap 392 0.0046026 fstat 366 0.0042973 openat 237 0.0027827
Table 5.2: Histogram; excerpt of 15 first lines. Constructed from a 100 second benign sample of BBC News ( "
---
" Priority value Syscalls
0 socket , bind , getsockname , getsockopt , setsockopt
1 poll , select , getpeername
2 accept , recv , recvfrom , recvmsg , read
3 connect , send , sendto , sendmsg , write , writev , sendfile
4 close , shutdown , listen
Table 1: Simulation priority of common syscalls: the lower the priority value, the higher the priority. "
---
" TABLE IV. OVERVIEW OF ACTIONS PERFORMED BY CUSTOM SHARED LIBRARIES IN NATIVE CODE .
Writing log messages Performing memory management system calls, such as mmap and mprotect Reading files in the application directory Calling JNI functions Performing general multiprocess and multithread related system calls, such as fork , clone , setpriority , and futex Reading common files, such as system libraries, font files, and “/dev/random” Performing other operations on files or file descriptors, such as lseek , dup , and readlink Performing operations to read information about the system, such as uname , getrlimit , and reading special files (e.g., “/proc/cpuinfo” and “/sys/devices/system/cpu/possible”) Performing system calls to read information about the process or the user, such as getuid32 , getppid , and gettid Performing system calls related to signal handling Performing cacheflush or set_tls system calls or per- forming nanosleep system call Reading files under “/proc/self/” or “/proc/ < PID > /”, where PID is the process’ pid Creating directories "
" TABLE V. T OP FIVE MOST COMMON ACTIONS PERFORMED BY APPS IN NATIVE CODE , THROUGH SHARED LIBRARIES (SL) AND CUSTOM BINARIES (CB). F OR THE INTERESTED READER , WE REPORT THE FULL VERSION OF THIS TABLE IN [1]. SL CB Description 3,261 72 ioctl system call 1,929 39 Write file in the app’s directory 1,814 35 Operations on sockets 1,594 5 Create network socket 1,242 144 Terminate process or thread group "
" TABLE IX. G ROUPS OF JNI CALLS USED FROM NATIVE CODE . Apps Description 94,543 Get class or method identifier and class reference 71,470 Get or destroy JavaVM?, and Get JNIEnv 53,219 Manipulation of String objects 49,321 Register native method 45,773 Manipulate object reference 41,892 Thread manipulation 35,231 Call Java method 19,372 Manipulate arrays 18,601 Manipulate exceptions 14,330 Create object instance 6,918 Modify field of an object 2,203 Manipulate direct buffers 47 Memory allocation 37 Enter or exit monitor
TABLE X. T OP 10 GROUPS OF J AVA METHODS FROM THE A NDROID FRAMEWORK CALLED FROM NATIVE CODE . Apps Description 7,423 Get path to the Android package associated with the context of the caller 6,896 Get class name 5,499 Manipulate data structures 4,082 Methods related to cryptography 3,817 Manipulate native types 3,769 Read system information 3,018 Audio related methods 2,070 Read app information 1,192 String manipulation and encoding 575 Input/output related methods 483 Reflection "
" TABLE XII. T OP 10 MOST USED STANDARD LIBRARIES . Apps Name Description 24,942 libjnigraphics.so Manipulate Java bitmap objects 2,646 libOpenSLES.so Audio input and output 2,645 libwilhelm.so Multimedia output and audio input 349 libpixelflinger.so Graphics rendering 347 libGLES android.so Graphics rendering 183 libGLESv1 enc.so Encoder for GLES 1.1 commands 183 gralloc.goldfish.so Memory allocation for graphics 182 libOpenglSystemCommon.so Common functions used by OpenGL? 182 libGLESv2 enc.so Encoder for GLES 2.0 commands 181 lib renderControl enc.so Encoder for rendering control commands
TABLE XIII. T OP 10 MOST USED CUSTOM LIBRARIES . Apps Name Description 19,158 libopenal.so Rendering audio 17,343 libCore.so Used by Adobe AIR 16,450 libmain.so Common name 13,556 libstlport shared.so C++ standard libraries 11,486 libcorona.so Part of the Corona SDK, a devel- opment platform for mobile apps 11,480 libalmixer.so Audio API of the Corona SDK 11,458 libmpg123.so Audio library 11,090 libmono.so Mono library, used to run .NET on Android 10,857 liblua.so Lua interpreter 10,408 libjnlua5.1.so Lua interpreter "
" TABLE XIV. A LLOWED SYSTEM CALLS AUTOMATICALLY GENERATED USING A THRESHOLD OF 99% APPS UNAFFECTED BY THE POLICY . accept(*,*,*) access( < SYS-PATH > , F OK) access( < SYS-PATH > ,R OK) access( < SYS-PATH > , W OK) access( < SYS-PATH > ,X OK) access( < USER-PATH > , F OK) access( < USER-PATH > ,R OK) access( < USER-PATH > , R OK j W OK j X OK) bind BINDER(android.os.IServiceManager?. CHECK SERVICE TRANSACTION) brk cacheflush(*,*,0,*,*) cacheflush(*,*,0,0,*) chdir chmod( < USER-PATH > ,*) clone(child stack=*,flags=CLONE VM j CLONE FS j CLONE FILES j CLONE SIGHAND j CLONE THREAD j CLONE SYSVSEM) connect(*, f sa family=AF UNIX, path=@”jdwp-control” g ,*) connect(*, f sa family=AF INET,*,* g ,*) connect(*, f sa family=AF UNIX, path=@”android:debuggerd” g ,*) connect(*, f sa family=AF UNIX, path= < SYS-PATH > g ,*) dup dup2 epoll create(*) epoll ctl(*,*,*,*) epoll wait execve exit( < NEG INT > ) exit(0) exit group( < POS INT > ) exit group(0) fcntl64( < NON STD FD > ,F DUPFD,*) fcntl64( < NON STD FD > ,F GETFD) fcntl64(*,F GETFL) fcntl64( < NON STD FD > ,F SETFD,*) fcntl64( < NON STD FD > ,F SETFL,*) fcntl64( < NON STD FD > ,F SETLK,*) fdatasync(*) fork fstat64 fsync(*) ftruncate(*,*) futex getcwd getegid32 geteuid32 getgid32 getpeername getpgid(0) getpid getppid getpriority(PRIO PROCESS,*) getrlimit(RLIMIT DATA,*) getrlimit(RLIMIT NOFILE,*) getrlimit(RLIMIT STACK,*) getrusage(RUSAGE CHILDREN,*) getrusage(RUSAGE SELF,*) getsockname getsockopt(*,SOL SOCKET,SO ERROR,*,*) getsockopt(*,SOL SOCKET, SO PEERCRED,*,*) getsockopt(*,SOL SOCKET,SO RCVBUF,*,*) gettid getuid32 ioctl( < ASHMEM-DEV > ,*,*) ioctl(*,FIONBIO,*) ioctl( < LOG-DEV > ,*,*) ioctl(*,SIOCGIFADDR,*) ioctl(*,SIOCGIFBRDADDR,*) ioctl(*,SIOCGIFCONF,*) ioctl(*,SIOCGIFFLAGS,*) ioctl(*,SIOCGIFHWADDR,*) ioctl(*,SIOCGIFINDEX,*) ioctl(*,SIOCGIFNETMASK,*) ioctl( < STD IN/OUT/ERR > , SNDCTL TMR TIMEBASE or TCGETS, *) ioctl(*,SNDCTL TMR TIMEBASE or TCGETS,*) ioctl( < URANDOM-DEV > , SNDCTL TMR TIMEBASE or TCGETS,*) listen lseek(*,*,SEEK CUR) lseek(*,*,SEEK END) lseek(*,*,SEEK SET) lstat64 madvise(*,*,MADV DONTNEED) madvise(*,*,MADV NORMAL) madvise(*,*,MADV RANDOM) mkdir( < SYS-PATH > ,*) mkdir( < USER-PATH > ,*) mmap2 mprotect mremap(*,*,*,MREMAP MAYMOVE) munmap nanosleep open( < SYS-PATH > ,*,*) open( < SYS-PATH > ,*) open( < USER-PATH > ,*,*) open( < USER-PATH > ,*) pipe poll prctl(PR GET NAME,*,0,0,0) prctl(PR SET NAME,*,*,*,*) prctl(PR SET NAME,*,*,*,0) prctl(PR SET NAME,*,0,0,0) ptrace(PTRACE TRACEME,*,0,0) readlink( < USER-PATH > ,*,*) recvfrom recvmsg rename( < USER-PATH > , < USER-PATH > ) rmdir( < USER-PATH > ) rt sigprocmask(SIG BLOCK,*,*,*) rt sigprocmask(SIG SETMASK,*,*,*) rt sigreturn(*) rt sigtimedwait([QUITUSR1], NULL, NULL, 8) sched getparam sched getscheduler sched yield select sendmsg sendto setitimer(ITIMER REAL,*,*) setpriority(PRIO PROCESS,*, < POS INT > ) setpriority(PRIO PROCESS,*,0) setrlimit(RLIMIT NOFILE,*) setsockopt(*,SOL IP,*,*,*) setsockopt(*,SOL SOCKET,*,*,*) set tls(*,*,*,*,*) set tls(*,*,0,*,*) sigaction sigprocmask(SIG BLOCK,*,*) sigprocmask(SIG SETMASK,*,*) sigprocmask(SIG UNBLOCK,*,*) sigreturn sigsuspend([]) socket(PF INET,SOCK DGRAM, IPPROTO ICMP) socket(PF INET,SOCK DGRAM, IPPROTO IP) socket(PF INET,SOCK DGRAM, IPPROTO UDP) socket(PF INET,SOCK STREAM, IPPROTO IP) socket(PF INET,SOCK STREAM, IPPROTO TCP) socket(PF NETLINK,SOCK RAW, 0) socket(PF UNIX, SOCK STREAM, 0) stat64 statfs64( < SYS-PATH > ,*) statfs64( < USER-PATH > ,*) symlink( < USER-PATH > , < USER-PATH > ) tgkill(*,*,SIGTRAP) umask uname unlink( < USER-PATH > ) utimes vfork wait4 "
" TABLE XVII. L IST OF ALLOWED METHODS (J AVA METHODS CALLED FROM NATIVE CODE ) AUTOMATICALLY GENERATED FOR ALLOWING A MINIMUM OF 97%, 98% AND 99% OF APPS THAT REACHED NATIVE CODE . Allowed apps (%) Method 97 java.lang.Integer.doubleValue 97 android.content.ContextWrapper?.getPackageName 97 java.lang.String.getBytes 98 java.lang.Double.doubleValue 98 android.content.ContextWrapper?.getClassLoader 98 android.content.ContextWrapper?.getFilesDir 98 java.io.File.getPath 98 android.content.ContextWrapper?.getExternalFilesDir 98 android.view.WindowManagerImpl?.getDefaultDisplay 98 java.lang.String.toLowerCase 98 android.app.Activity.getWindowManager 98 java.util.ArrayList?.add 98 android.view.Display.getMetrics 98 android.app.Activity.getWindow 98 android.view.View.getWindowVisibleDisplayFrame 98 java.util.Calendar.getInstance 98 android.view.View.getDrawingRect 99 java.util.Calendar.get 99 android.os.Bundle.getByteArray 99 android.content.ContextWrapper?.getPackageManager 99 android.content.res.AssetManager?$AssetInputStream?.read 99 java.lang.Long.doubleValue 99 java.lang.ClassLoader?.loadClass 99 android.app.ApplicationPackageManager?.getPackageInfo 99 android.content.res.AssetManager?$AssetInputStream?.close 99 java.lang.Float.doubleValue 99 java.lang.Class.getClassLoader "
---
dazzawazza 1 day ago [-]
I've coded desktop apps (mostly editors and tools for games) for 25 years across X (Motif toolkit), Amiga, TOS, DOS, MFC, Cocoa, Win32, WxWidgets?, Fox Toolkit and Qt. Qt has by far been the best, most rewarding, most empowering experience. It's a great library.
Now Cocoa would win but I prefer C/C++ to Objective-C, it's close though.
Good work people.
reply
hannofcart 22 hours ago [-]
Glad to see the update. Most people associate Qt with GUIs which is unfortunate.
I see that when people think of Qt, they think of WxWidgets?, Cocoa or MFC as alternatives. No, I submit to you that Qt framework is a more elegant, easier to use alternative to Boost as well.
This is not to say that QtQuick? or QtWidgets? aren't solid. However, the success of these two modules ends up occluding the others which to me are the real gems from the QtFramework?: QtCore? and QtNetwork?.
QtCore? provides a solid event loop, the most easy to use implementation of the observer pattern via its signal-slot mechanism, robust threading utilities and a bunch of other utilities that make writing apps in C++ an absolute breeze.
QtNetwork? for a series of networking utilities that are elegantly simple.
If I were to write a command line app or a database or server, I'd reach for Qt in a jiffy.
Qt is not just for GUIs!
reply
Jasper_ 20 hours ago [-]
I really wish QtNetwork? was better. I recently went and had to replace QtNetwork? with our own event loop because it is extremely unreliable on Windows. The only mention of this is a footnote in the API docs:
http://doc.qt.io/qt-5/qabstractsocket.html#waitForBytesWritten
reply
justinclift 17 hours ago [-]
Yeah. It also turns out that just having a Qt application running on a computer can tank network latency for all applications on the computer:
https://bugreports.qt.io/browse/QTBUG-40332
There is a workaround, but developers have to know about it first. And it's such an unexpected and weird behaviour that 99% of developers don't.
This was our fix (1 line of code), in case that helps anyone:
https://github.com/sqlitebrowser/sqlitebrowser/commit/73946400c32d1f7cfcd4672ab0ab3f563eb84f4e
reply
nly 17 hours ago [-]
Yup, i work on software with a Qt GUI and it took us ages to figure out why our daemon (no Qt dependencies) would experience latency when the GUI was open.
For Windows users we now put this var in to global environment via our installer, and probably break other software in the process.
reply
--- HN discussion of: Comparison of C/Posix standard library implementations for Linux (etalabs.net)
---
geofft 22 hours ago [-]
ncurses-base and ncurses-bin are marked "Essential" in Debian (from which Ubuntu derives, and automatically imports packages), which means that any package is permitted to depend on things in those packages without declaring a dependency - including in pre-installation scripts. This image is defined as being large enough that any package in the Ubuntu archive can be correctly installed.
https://wiki.debian.org/BusterPriorityRequalification
the previous page contains a complete list of packages in 'minbase' (those with either Essential: yes or has Priority: required, and dependencies), as well as a list of those files within that list that can be uninstalled without error. You can also grep for 'this is an essential package' in this page to find the essential packages
i think this page has a list of Debian essential packages:
https://github.com/SailorCrane/my-essential-env-packages
base-files
base-passwd
bash
bsdutils
coreutils
dash
debianutils
diffutils
dpkg
e2fsprogs
findutils
grep
gzip
hostname
init
libc-bin
login
mount
ncurses-base
ncurses-bin
perl-base
sed
tar
util-linux---
also compare Debian/Ubuntu minimal installs to Alpine:
fotcorn 23 hours ago [-]
I did a short comparision between this and alpine by installing nginx inside the image (I used nginx-light inside ubuntu):
CONTAINER ID IMAGE SIZE 493450e7bc12 alpine 1.37MB (virtual 5.52MB) 62b1db90500c ubuntu:bionic 6MB (virtual 87MB)
I deleted the cache files from apt after installing (/var/lib/apt/lists*)
Looks quite nice, but it seems Ubuntu packages are much bigger than Alpine package, e.g. Postgres is 159 MB in Ubuntu Bionic and only 32 MB in Alpine (including dependencies). Do the Ubuntu packages have more feature than the equivalent Alpine packages?
reply
" Alpine Linux is built around musl libc and busybox. This makes it smaller and more resource efficient than traditional GNU/Linux distributions. A container requires no more than 8 MB and a minimal installation to disk requires around 130 MB of storage. "
alpine-standard x86_64 apks directory: 8.1M:
alpine-standard 3.7.0 x86_64/apks/x86_64$ ls -1 alpine-base-3.7.0-r0.apk alpine-baselayout-3.0.5-r2.apk alpine-conf-3.7.0-r0.apk alpine-keys-2.1-r1.apk alpine-mirrors-3.5.6-r0.apk APKINDEX.tar.gz apk-tools-2.8.1-r1.apk bonding-2.6-r3.apk bridge-1.5-r3.apk busybox-1.27.2-r6.apk busybox-initscripts-3.1-r2.apk busybox-suid-1.27.2-r6.apk chrony-3.2-r1.apk dbus-libs-1.10.24-r0.apk e2fsprogs-1.43.7-r0.apk e2fsprogs-libs-1.43.7-r0.apk kbd-bkeymaps-2.0.4-r2.apk libblkid-2.31-r0.apk libcap-2.25-r1.apk libcom_err-1.43.7-r0.apk libc-utils-0.7.1-r0.apk libnl3-3.2.28-r1.apk libressl-2.6.3-r0.apk libressl2.6-libcrypto-2.6.3-r0.apk libressl2.6-libssl-2.6.3-r0.apk libressl2.6-libtls-2.6.3-r0.apk libusb-1.0.21-r0.apk libuuid-2.31-r0.apk musl-1.1.18-r2.apk musl-utils-1.1.18-r2.apk network-extras-1.2-r0.apk openrc-0.24.1-r4.apk openssh-7.5_p1-r6.apk openssh-client-7.5_p1-r6.apk openssh-keygen-7.5_p1-r6.apk openssh-server-7.5_p1-r6.apk openssh-server-common-7.5_p1-r6.apk openssh-sftp-server-7.5_p1-r6.apk pcsc-lite-libs-1.8.22-r0.apk ppp-atm-2.4.7-r5.apk ppp-chat-2.4.7-r5.apk ppp-daemon-2.4.7-r5.apk ppp-l2tp-2.4.7-r5.apk ppp-minconn-2.4.7-r5.apk ppp-passprompt-2.4.7-r5.apk ppp-passwordfd-2.4.7-r5.apk ppp-pppoe-2.4.7-r5.apk ppp-radius-2.4.7-r5.apk ppp-winbind-2.4.7-r5.apk scanelf-1.2.2-r1.apk tzdata-2017c-r0.apk usb-modeswitch-2.5.1-r0.apk vlan-2.0-r0.apk wireless-tools-30_pre9-r0.apk wpa_supplicant-2.6-r8.apk zlib-1.2.11-r1.apk
complete contents of Alpine's "mini root filesystem" release (6.4M):
./srv ./mnt ./media ./media/usb ./media/floppy ./media/cdrom ./bin ./bin/sleep ./bin/getopt ./bin/mount ./bin/netstat ./bin/kbd_mode ./bin/ionice ./bin/mkdir ./bin/base64 ./bin/cp ./bin/ping6 ./bin/sed ./bin/ed ./bin/run-parts ./bin/date ./bin/stty ./bin/fatattr ./bin/tar ./bin/setpriv ./bin/fgrep ./bin/bbconfig ./bin/sh ./bin/chmod ./bin/mktemp ./bin/mpstat ./bin/ipcalc ./bin/mknod ./bin/pwd ./bin/more ./bin/usleep ./bin/ping ./bin/makemime ./bin/fsync ./bin/setserial ./bin/ln ./bin/rev ./bin/busybox ./bin/hostname ./bin/umount ./bin/cat ./bin/zcat ./bin/linux64 ./bin/mv ./bin/false ./bin/chown ./bin/chgrp ./bin/dd ./bin/dumpkmap ./bin/nice ./bin/stat ./bin/touch ./bin/rm ./bin/watch ./bin/lzop ./bin/gzip ./bin/df ./bin/rmdir ./bin/iostat ./bin/kill ./bin/fdflush ./bin/link ./bin/login ./bin/true ./bin/pidof ./bin/grep ./bin/printenv ./bin/linux32 ./bin/mountpoint ./bin/conspy ./bin/egrep ./bin/echo ./bin/sync ./bin/ash ./bin/ls ./bin/dmesg ./bin/uname ./bin/pipe_progress ./bin/dnsdomainname ./bin/su ./bin/reformime ./bin/ps ./bin/gunzip ./root ./sys ./home ./var ./var/lock ./var/lock/subsys ./var/local ./var/spool ./var/spool/cron ./var/spool/cron/crontabs ./var/lib ./var/lib/misc ./var/lib/apk ./var/lib/udhcpd ./var/empty ./var/run ./var/tmp ./var/opt ./var/log ./var/cache ./var/cache/misc ./var/cache/apk ./lib ./lib/ld-musl-x86_64.so.1 ./lib/libc.musl-x86_64.so.1 ./lib/libz.so.1 ./lib/apk ./lib/apk/db ./lib/apk/db/lock ./lib/apk/db/installed ./lib/apk/db/triggers ./lib/apk/db/scripts.tar ./lib/libssl.so.44 ./lib/libz.so.1.2.11 ./lib/mdev ./lib/firmware ./lib/libssl.so.44.0.1 ./lib/libcrypto.so.42.0.0 ./lib/libcrypto.so.42 ./proc ./run ./alpine-minirootfs-3.7.0-x86_64.tar.gz ./sbin ./sbin/init ./sbin/hdparm ./sbin/hwclock ./sbin/ifdown ./sbin/modprobe ./sbin/getty ./sbin/tunctl ./sbin/raidautorun ./sbin/watchdog ./sbin/fsck ./sbin/arp ./sbin/loadkmap ./sbin/route ./sbin/halt ./sbin/mkmntdirs ./sbin/swapon ./sbin/reboot ./sbin/udhcpc ./sbin/iprule ./sbin/iplink ./sbin/blkid ./sbin/fdisk ./sbin/klogd ./sbin/apk ./sbin/ldconfig ./sbin/logread ./sbin/inotifyd ./sbin/ifconfig ./sbin/nologin ./sbin/rmmod ./sbin/poweroff ./sbin/fstrim ./sbin/switch_root ./sbin/mdev ./sbin/adjtimex ./sbin/setconsole ./sbin/modinfo ./sbin/ifenslave ./sbin/acpid ./sbin/lsmod ./sbin/losetup ./sbin/iptunnel ./sbin/syslogd ./sbin/mkdosfs ./sbin/findfs ./sbin/slattach ./sbin/ip ./sbin/swapoff ./sbin/iproute ./sbin/sysctl ./sbin/ipneigh ./sbin/insmod ./sbin/blockdev ./sbin/fbsplash ./sbin/nameif ./sbin/depmod ./sbin/ifup ./sbin/ipaddr ./sbin/vconfig ./sbin/mkswap ./sbin/mkfs.vfat ./tmp ./usr ./usr/bin ./usr/bin/install ./usr/bin/free ./usr/bin/killall ./usr/bin/traceroute ./usr/bin/expand ./usr/bin/bzcat ./usr/bin/pkill ./usr/bin/vlock ./usr/bin/uptime ./usr/bin/mkfifo ./usr/bin/less ./usr/bin/unshare ./usr/bin/beep ./usr/bin/mkpasswd ./usr/bin/hostid ./usr/bin/id ./usr/bin/shred ./usr/bin/comm ./usr/bin/dirname ./usr/bin/crontab ./usr/bin/xargs ./usr/bin/wget ./usr/bin/ttysize ./usr/bin/iconv ./usr/bin/lsof ./usr/bin/cmp ./usr/bin/pmap ./usr/bin/printf ./usr/bin/mesg ./usr/bin/traceroute6 ./usr/bin/cryptpw ./usr/bin/cpio ./usr/bin/dos2unix ./usr/bin/cksum ./usr/bin/hexdump ./usr/bin/pstree ./usr/bin/ldd ./usr/bin/logger ./usr/bin/nc ./usr/bin/tee ./usr/bin/lzopcat ./usr/bin/factor ./usr/bin/head ./usr/bin/setkeycodes ./usr/bin/groups ./usr/bin/patch ./usr/bin/volname ./usr/bin/realpath ./usr/bin/nohup ./usr/bin/udhcpc6 ./usr/bin/xzcat ./usr/bin/time ./usr/bin/[ ./usr/bin/sha1sum ./usr/bin/hd ./usr/bin/split ./usr/bin/od ./usr/bin/unexpand ./usr/bin/renice ./usr/bin/ssl_client ./usr/bin/tr ./usr/bin/resize ./usr/bin/passwd ./usr/bin/unxz ./usr/bin/getconf ./usr/bin/xxd ./usr/bin/test ./usr/bin/awk ./usr/bin/reset ./usr/bin/readlink ./usr/bin/eject ./usr/bin/fold ./usr/bin/microcom ./usr/bin/uniq ./usr/bin/ipcs ./usr/bin/diff ./usr/bin/sha256sum ./usr/bin/seq ./usr/bin/getent ./usr/bin/nl ./usr/bin/unlzop ./usr/bin/whoami ./usr/bin/flock ./usr/bin/nproc ./usr/bin/du ./usr/bin/unzip ./usr/bin/blkdiscard ./usr/bin/uuencode ./usr/bin/sort ./usr/bin/wc ./usr/bin/dumpleases ./usr/bin/lzma ./usr/bin/expr ./usr/bin/cut ./usr/bin/find ./usr/bin/basename ./usr/bin/paste ./usr/bin/truncate ./usr/bin/fallocate ./usr/bin/clear ./usr/bin/unix2dos ./usr/bin/dc ./usr/bin/openvt ./usr/bin/lsusb ./usr/bin/tac ./usr/bin/ipcrm ./usr/bin/lzcat ./usr/bin/unlink ./usr/bin/top ./usr/bin/timeout ./usr/bin/shuf ./usr/bin/scanelf ./usr/bin/tail ./usr/bin/whois ./usr/bin/pscan ./usr/bin/nsenter ./usr/bin/chvt ./usr/bin/showkey ./usr/bin/env ./usr/bin/deallocvt ./usr/bin/sha512sum ./usr/bin/sha3sum ./usr/bin/pwdx ./usr/bin/which ./usr/bin/nslookup ./usr/bin/uudecode ./usr/bin/sum ./usr/bin/setsid ./usr/bin/[[ ./usr/bin/yes ./usr/bin/smemcap ./usr/bin/unlzma ./usr/bin/pgrep ./usr/bin/md5sum ./usr/bin/strings ./usr/bin/bunzip2 ./usr/bin/vi ./usr/bin/bzip2 ./usr/bin/nmeter ./usr/bin/cal ./usr/bin/tty ./usr/bin/fuser ./usr/local ./usr/local/bin ./usr/local/lib ./usr/local/share ./usr/lib ./usr/lib/libssl.so.44 ./usr/lib/libssl.so.44.0.1 ./usr/lib/libcrypto.so.42.0.0 ./usr/lib/libcrypto.so.42 ./usr/share ./usr/share/misc ./usr/share/apk ./usr/share/apk/keys ./usr/share/apk/keys/alpine-devel@lists.alpinelinux.org-58e4f17d.rsa.pub ./usr/share/apk/keys/alpine-devel@lists.alpinelinux.org-58199dcc.rsa.pub ./usr/share/apk/keys/alpine-devel@lists.alpinelinux.org-5261cecb.rsa.pub ./usr/share/apk/keys/x86_64 ./usr/share/apk/keys/x86_64/alpine-devel@lists.alpinelinux.org-5261cecb.rsa.pub ./usr/share/apk/keys/x86_64/alpine-devel@lists.alpinelinux.org-4a6a0840.rsa.pub ./usr/share/apk/keys/alpine-devel@lists.alpinelinux.org-58cbb476.rsa.pub ./usr/share/apk/keys/aarch64 ./usr/share/apk/keys/aarch64/alpine-devel@lists.alpinelinux.org-58199dcc.rsa.pub ./usr/share/apk/keys/alpine-devel@lists.alpinelinux.org-524d27bb.rsa.pub ./usr/share/apk/keys/s390x ./usr/share/apk/keys/s390x/alpine-devel@lists.alpinelinux.org-58e4f17d.rsa.pub ./usr/share/apk/keys/alpine-devel@lists.alpinelinux.org-5243ef4b.rsa.pub ./usr/share/apk/keys/armhf ./usr/share/apk/keys/armhf/alpine-devel@lists.alpinelinux.org-524d27bb.rsa.pub ./usr/share/apk/keys/ppc64le ./usr/share/apk/keys/ppc64le/alpine-devel@lists.alpinelinux.org-58cbb476.rsa.pub ./usr/share/apk/keys/alpine-devel@lists.alpinelinux.org-4a6a0840.rsa.pub ./usr/share/apk/keys/x86 ./usr/share/apk/keys/x86/alpine-devel@lists.alpinelinux.org-5243ef4b.rsa.pub ./usr/share/apk/keys/x86/alpine-devel@lists.alpinelinux.org-4a6a0840.rsa.pub ./usr/share/man ./usr/sbin ./usr/sbin/nbd-client ./usr/sbin/addgroup ./usr/sbin/killall5 ./usr/sbin/rdev ./usr/sbin/readahead ./usr/sbin/add-shell ./usr/sbin/delgroup ./usr/sbin/chroot ./usr/sbin/nandwrite ./usr/sbin/remove-shell ./usr/sbin/rfkill ./usr/sbin/lspci ./usr/sbin/deluser ./usr/sbin/arping ./usr/sbin/partprobe ./usr/sbin/readprofile ./usr/sbin/fdformat ./usr/sbin/ether-wake ./usr/sbin/nanddump ./usr/sbin/chpasswd ./usr/sbin/sendmail ./usr/sbin/ntpd ./usr/sbin/fbset ./usr/sbin/adduser ./usr/sbin/brctl ./usr/sbin/setfont ./usr/sbin/crond ./usr/sbin/rdate ./usr/sbin/loadfont ./usr/sbin/powertop ./usr/sbin/setlogcons ./etc ./etc/udhcpd.conf ./etc/periodic ./etc/periodic/daily ./etc/periodic/weekly ./etc/periodic/15min ./etc/periodic/monthly ./etc/periodic/hourly ./etc/fstab ./etc/init.d ./etc/mtab ./etc/alpine-release ./etc/apk ./etc/apk/keys ./etc/apk/keys/alpine-devel@lists.alpinelinux.org-5261cecb.rsa.pub ./etc/apk/keys/alpine-devel@lists.alpinelinux.org-5243ef4b.rsa.pub ./etc/apk/keys/alpine-devel@lists.alpinelinux.org-4a6a0840.rsa.pub ./etc/apk/repositories ./etc/apk/protected_paths.d ./etc/apk/arch ./etc/apk/world ./etc/sysctl.d ./etc/sysctl.d/00-alpine.conf ./etc/hostname ./etc/shadow ./etc/passwd ./etc/inittab ./etc/os-release ./etc/hosts ./etc/profile.d ./etc/profile.d/color_prompt ./etc/crontabs ./etc/crontabs/root ./etc/ssl ./etc/ssl/x509v3.cnf ./etc/ssl/certs ./etc/ssl/openssl.cnf ./etc/ssl/cert.pem ./etc/motd ./etc/conf.d ./etc/TZ ./etc/modprobe.d ./etc/modprobe.d/aliases.conf ./etc/modprobe.d/i386.conf ./etc/modprobe.d/blacklist.conf ./etc/modprobe.d/kms.conf ./etc/services ./etc/protocols ./etc/profile ./etc/shells ./etc/securetty ./etc/logrotate.d ./etc/logrotate.d/acpid ./etc/network ./etc/network/if-pre-down.d ./etc/network/if-post-up.d ./etc/network/if-pre-up.d ./etc/network/if-up.d ./etc/network/if-up.d/dad ./etc/network/if-down.d ./etc/network/if-post-down.d ./etc/opt ./etc/issue ./etc/modules ./etc/sysctl.conf ./etc/modules-load.d ./etc/group ./dev ./dev/pts ./dev/shm
---
an OCaml 'std'lib 'candidate':
https://github.com/janestreet/base
---
another guy's list of 34 Haskell extensions that e always uses:
ApplicativeDo
BangPatterns
ConstraintKinds
DataKinds
DefaultSignatures
DeriveFoldable
DeriveFunctor
DeriveGeneric
DeriveLift
DeriveTraversable
DerivingStrategies
EmptyCase
ExistentialQuantification
FlexibleContexts
FlexibleInstances
FunctionalDependencies
GADTs
GeneralizedNewtypeDeriving
InstanceSigs
KindSignatures
LambdaCase
MultiParamTypeClasses
MultiWayIf
NamedFieldPuns
OverloadedStrings
PatternSynonyms
RankNTypes
ScopedTypeVariables
StandaloneDeriving
TupleSections
TypeApplications
TypeFamilies
TypeFamilyDependencies
TypeOperatorsin the blog post he goes into detail (a little bit) about why he uses each one
e also mentions that he likes:
and sometimes uses the {-# OVERLAPPING #-}, {-# OVERLAPPABLE #-}, and {-# INCOHERENT #-} pragmas to allow Overlapping instances and incoherent instances on a one-off basis.
---
" For other things, like web applications, it’s more likely that a majority of the program logic is going to be side-effectful by its nature—it may involve making HTTP requests to other services, interacting with a database, and writing to logfiles.
Figuring out how to structure these effects in a type-safe, decoupled, composable way can be tricky, especially since Haskell has so many different solutions. I could not bring myself to choose just one, but I did choose two: the so-called “mtl style” and freer monads. "
e gives a code example of 'mtl style' in the post. But then e goes on to say that e prefers freer monads. Then e says:
"
There are a few different implementations of freer monads, but I, sadly, was not satisfied with any of them, so I decided to contribute to the problem by creating yet another one. My implementation is called freer-simple, and it includes a streamlined API with more documentation than any other freer implementation. Writing the above mtl style example using freer-simple is more straightforward:
data FileSystem? r where ReadFile? :: FilePath? -> FileSystem? String WriteFile?