The Binary Options broker Blacklist 2020

Binary Options Review Panther

Welcome to the Binary Options Review Panther Reddit! Our passion is Binary Option trading and Binary Options. We strive to tell people the TRUTH about Binary Options. We write Binary Option scam reviews for the latest Binary Options to warn people about the many Binary Option scams on the market. We also write Binary Option reviews on quality Binary Option software and Binary Option Brokers as well. Good luck trading, Julia Armstrong Binary Options Review Panther

CLI & GUI v0.17.1.3 'Oxygen Orion' released!

This is the CLI & GUI v0.17.1.3 'Oxygen Orion' point release. This release predominantly features bug fixes and performance improvements. Users, however, are recommended to upgrade, as it includes mitigations for the issue where transactions occasionally fail.

(Direct) download links (GUI)

(Direct) download links (CLI)

GPG signed hashes

We encourage users to check the integrity of the binaries and verify that they were signed by binaryFate's GPG key. A guide that walks you through this process can be found here for Windows and here for Linux and Mac OS X.
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA256 # This GPG-signed message exists to confirm the SHA256 sums of Monero binaries. # # Please verify the signature against the key for binaryFate in the # source code repository (/utils/gpg_keys). # # ## CLI 38a04a7bd00733e9d943edba3004e44730c0848fe5e8a4fca4cb29c12d1e6b2f monero-android-armv7-v0.17.1.3.tar.bz2 0e94f58572646992ee21f01d291211ed3608e8a46ecb6612b378a2188390dba0 monero-android-armv8-v0.17.1.3.tar.bz2 ae1a1b61d7b4a06690cb22a3389bae5122c8581d47f3a02d303473498f405a1a monero-freebsd-x64-v0.17.1.3.tar.bz2 57d6f9c25bd1dbc9d6b39fcfb13260b21c5594b4334e8ed3b8922108730ee2f0 monero-linux-armv7-v0.17.1.3.tar.bz2 a0419993fbc6a5ca11bcd2e825acef13e429824f4d8c7ba4ec73ac446d2af2fb monero-linux-armv8-v0.17.1.3.tar.bz2 cf3fb693339caed43a935c890d71ecab5b89c430e778dc5ef0c3173c94e5bf64 monero-linux-x64-v0.17.1.3.tar.bz2 d107384ff7b1f77ee4db93940dbfda24d6045bf59c43169bc81a0118e3986bfa monero-linux-x86-v0.17.1.3.tar.bz2 79557c8bee30b229bda90bb9ee494097d639d60948fc2ad87a029359b56b1b48 monero-mac-x64-v0.17.1.3.tar.bz2 3eee0d0e896fb426ef92a141a95e36cb33ca7d1e1db3c1d4cb7383994af43a59 c9e9dde61b33adccd7e794eba8ba29d820817213b40a2571282309d25e64e88a # ## GUI 15ad80b2abb18ac2521398c4dad9b8bfea2e6fc535cf4ebcc60d99b8042d4fb2 monero-gui-install-win-x64-v0.17.1.3.exe 3bed02f9db5b7b2fe4115a636fecf0c6ec9079dd4e9284c8ce2c67d4996e2a4a monero-gui-linux-x64-v0.17.1.3.tar.bz2 23405534c7973a8d6908b76121b81894dc853039c942d7527d254dfde0bd2e8f monero-gui-mac-x64-v0.17.1.3.dmg 0a49ccccb561445f3d7ec0087ddc83a8b76f424fb7d5e0d725222f3639375ec4 # # # ~binaryFate -----BEGIN PGP SIGNATURE----- iQIzBAEBCAAdFiEEgaxZH+nEtlxYBq/D8K9NRioL35IFAl+oVkkACgkQ8K9NRioL 35Lmpw//Xs09T4917sbnRH/DW/ovpRyjF9dyN1ViuWQW91pJb+E3i9TY+wU3q85k LyTihDB5pV+3nYgKPL9TlLfaytJIQG0vYHykPWHVmYmvoIs9BLarGwaU3bjO0rh9 ST5GDMdvxmQ5Y1LTwVfKkmBJw26DAs0xAvjBX44oRQjjuUdH6JdLPsqa5Kb++NCM b453m5s8bT3Cw6w0eJB1FQEyQ5BoDrwYcFzzsS1ag/C4Ylq0l6CZfEambfOQvdUi 7D5Rywfhiz2t7cfn7LaoXb74KDA/B1bL+R1/KhCuFqxRTOQzq9IxRywh4VptAAMU UR7jFHFijOMoyggIbkD48JmAjlBnqIyQJt4D5gbHe+tSaSoKdgoTGBAmIvaCZIng jfn9pTNzIJbTptsQhhyZqQQIH87D8BctZfX7pREjJmMNGwN2jFxXqUNqYTso20E6 YLtC1mkZBBZ294xHqT1mQpfznc6uVJhhoJpta0eKxkr1ahrGvWBDGZeVhLswnBcq 9dafAkR14rdK1naiCsygb6hMvBqBohVu/bWuhycJcv6XRvlP7UHkR6R8+s6U4Tk2 zaJERQF+cHQpEak5aEJIvDlb/mxteGyvPkPyL7UmADEQh3C4nREwkDSdnitYnF+e HxJZkshoC98+YCkWUP4+JYOOT158jKao3u0laEOxVGOrPz1Nc64= =Ys4h -----END PGP SIGNATURE----- 

Upgrading (GUI)

Note that you should be able to utilize the automatic updater in the GUI that was recently added. A pop-up will appear shortly with the new binary.
In case you want to update manually, you ought to perform the following steps:
  1. Download the new binaries (the .zip file (Windows) or the tar.bz2 file (Mac OS X and Linux)) from the direct download links in this thread or from the official website. If you run active AV (AntiVirus) software, I'd recommend to apply this guide ->
  2. Extract the new binaries (the .zip file (Windows) or the tar.bz2 file (Mac OS X and Linux) you just downloaded) to a new directory / folder of your liking.
  3. Open monero-wallet-gui. It should automatically load your "old" wallet.
If, for some reason, the GUI doesn't automatically load your old wallet, you can open it as follows:
[1] On the second page of the wizard (first page is language selection) choose Open a wallet from file
[2] Now select your initial / original wallet. Note that, by default, the wallet files are located in Documents\Monero\ (Windows), Users//Monero/ (Mac OS X), or home//Monero/ (Linux).
Lastly, note that a blockchain resync is not needed, i.e., it will simply pick up where it left off.

Upgrading (CLI)

You ought to perform the following steps:
  1. Download the new binaries (the .zip file (Windows) or the tar.bz2 file (Mac OS X and Linux)) from the official website, the direct download links in this thread, or Github.
  2. Extract the new binaries to a new directory of your liking.
  3. Copy over the wallet files from the old directory (i.e. the v0.15.x.x, v0.16.x.x, or v0.17.x.x directory).
  4. Start monerod and monero-wallet-cli (in case you have to use your wallet).
Note that a blockchain resync is not needed. Thus, if you open monerod-v0.17.1.3, it will simply pick up where it left off.

Release notes (GUI)

Some highlights of this minor release are:
  • Android support (experimental)
  • Linux binary is now reproducible (experimental)
  • Simple mode: transaction reliability improvements
  • New transaction confirmation dialog
  • Wizard: minor design changes
  • Linux: high DPI support
  • Fix "can't connect to daemon" issue
  • Minor bug fixes
Some highlights of this major release are:
  • Support for CLSAG transaction format
  • Socks5 proxy support, automatically enabled on Tails
  • Simple mode transactions are sent trough local daemon, improved reliability
  • Portable mode, save wallets + config to "storage" folder
  • History page: improvements, incoming / outgoing labels
  • Transfer: new success dialog
  • CMake build system improvements
  • Windows cross compilation support using Docker
  • Various minor bug and UI fixes
Note that you can find a full change log here.

Release notes (CLI)

Some highlights of this minor release are:
  • Add support for I2P and Tor seed nodes (--tx-proxy)
  • Add --ban-list daemon option to ban a list of IP addresses
  • Switch to Dandelion++ fluff mode if no out connections for stem mode
  • Fix a bug with relay_tx
  • Fix a rare readline related crash
  • Use /16 filtering on IPv4-within-IPv6 addresses
  • Give all hosts the same chance of being picked for connecting
  • Minor bugfixes
Some highlights of this major release are:
  • Support for CLSAG transaction format
  • Deterministic unlock times
  • Enforce claiming maximum coinbase amount
  • Serialization format changes
  • Remove most usage of Boost library
  • Always send raw transactions through P2P, don't use bootstrap daemon
  • Update InProofV1, OutProofV1, and ReserveProofV1 to V2
  • ASM optimizations for wallet refresh (macOS / Linux)
  • Randomized delay when forwarding txes from i2p/tor -> ipv4/6
  • New show_qr_code wallet command for CLI
  • Add ZMQ/Pub support for txpool_add and chain_main events
  • Various bug fixes and performance improvements
Note that you can find a full change log here.

Further remarks

  • A guide on pruning can be found here.
  • Ledger Monero users, please be aware that version 1.7.4 of the Ledger Monero App is required in order to properly use CLI or GUI v0.17.1.3.

Guides on how to get started (GUI)
Older guides: (These were written for older versions, but are still somewhat applicable)
Sheep’s Noob guide to Monero GUI in Tails

Ledger GUI guides:

How do I generate a Ledger Monero wallet with the GUI (monero-wallet-gui)?
How do I restore / recreate my Ledger Monero wallet?

Trezor GUI guides:

How do I generate a Trezor Monero wallet with the GUI (monero-wallet-gui)?
How to use Monero with Trezor - by Trezor
How do I restore / recreate my Trezor Monero wallet?

Ledger & Trezor CLI guides

Guides to resolve common issues (GUI)

My antivirus (AV) software blocks / quarantines the Monero GUI wallet, is there a work around I can utilize?
I am missing (not seeing) a transaction to (in) the GUI (zero balance)
Transaction stuck as “pending” in the GUI
How do I move the blockchain (data.mdb) to a different directory during (or after) the initial sync without losing the progress?
I am using the GUI and my daemon doesn't start anymore
My GUI feels buggy / freezes all the time
The GUI uses all my bandwidth and I can't browse anymore or use another application that requires internet connection
How do I change the language of the 25 word mnemonic seed in the GUI or CLI?
I am using remote node, but the GUI still syncs blockchain?

Using the GUI with a remote node

In the wizard, you can either select Simple mode or Simple mode (bootstrap) to utilize this functionality. Note that the GUI developers / contributors recommend to use Simple mode (bootstrap) as this mode will eventually use your own (local) node, thereby contributing to the strength and decentralization of the network. Lastly, if you manually want to set a remote node, you ought to use Advanced mode. A guide can be found here:

Adding a new language to the GUI
If, after reading all these guides, you still require help, please post your issue in this thread and describe it in as much detail as possible. Also, feel free to post any other guides that could help people.
submitted by dEBRUYNE_1 to Monero [link] [comments]

Looking for suggestions to improve encrypted /boot on Debian

Below is my install procedure
# For starting from install disc: # Advanced Options -> Rescue mode -> Execute shell in Installer environment # For this example we are assuming the drive with to setup is /dev/sda # Format virtual drive to have 1 large primary partition and mark it as bootable echo -e "o\nn\np\n1\n\n\na\nw" | fdisk /dev/sda # Encrypt entire volume # Default iter is 2000 and takes 22 seconds for grub to decrypt, adjust accordingly cryptsetup -v --cipher aes-xts-plain64 --key-size 512 --hash sha512 --iter-time 50000 --use-random --verify-passphrase luksFormat --type luks1 /dev/sda1 # or if that takes too long to type: # cryptsetup -v -c aes-xts-plain64 -s 512 -h sha512 --use-random -y luksFormat --type luks1 /dev/sda1 # Open for formating cryptsetup open /dev/sda1 sda1_crypt mkfs.xfs /dev/mappesda1_crypt # If you are doing this from a standard debian system and you don't have debootstrap run the following: # apt install -y debootstrap coreutils # bootstrap core mount /dev/mappesda1_crypt /mnt debootstrap --arch amd64 bullseye /mnt ## If you see: # E: Invalid Release file, no entry for main/binary-$ARCH/Packages # known good values are amd64 and i386 ## It means you provided an invalid Architecture name (like x86_64 or x86) # Chroot to get to work mount -t proc none /mnt/proc mount --bind /sys /mnt/sys mount --bind /dev /mnt/dev cp /etc/resolv.conf /mnt/etc/resolv.conf chroot /mnt/ 3. Basic setup ## Optionally you can add the following lines to /etc/apt/sources.list # deb bullseye main # deb-src bullseye main # deb bullseye-updates main # deb-src bullseye-updates main # deb bullseye/updates main # deb-src bullseye/updates main # *DO NOT FORGET TO SET ROOT PASSWORD!* passwd apt update apt install -y locales debconf # For rescue mode you need to run: # export TERM=vt100 dpkg-reconfigure locales # Restore old value: # export TERM=bterm apt install -y sudo vim mg apt purge -y nano select-editor # You need to set up your /etc/fstab: echo "/dev/mappesda1_crypt\t/\txfs\tdefaults\t0\t0" > /etc/fstab # Now to inform initramfs what to pass blkid | grep '/dev/sda1:' | echo "sda1_crypt\tUUID=$(awk -F'"' '{print $2}')\tnone\tluks" > /etc/crypttab # Make sure to install grub to /dev/sdb so that you don't mess up your desktop. grep -v rootfs /proc/mounts > /etc/mtab apt install -y grub-pc linux-base linux-image-amd64 cryptsetup ## If you see: # E: Sub-process /usbin/dpkg returned an error code (1) ## Don't worry about it, we are going to fix it later # Turn on grub's support for crypto echo 'GRUB_ENABLE_CRYPTODISK=y' >> /etc/default/grub grub-mkconfig -o /boot/grub/grub.cfg grub-install /dev/sda update-initramfs -u -k all ## If you see: # cryptsetup: WARNING: Invalid source device $UUID ## You forgot to prefix UUID= before your id in /etc/crypttab *You now can reboot and finsh the rest in the system* # Since we are manually setting everything up: export HOSTNAME=concernedgnu { cat <<-EOF localhost $HOSTNAME # The following lines are desirable for IPv6 capable hosts ::1 localhost ip6-localhost ip6-loopback ff02::1 ip6-allnodes ff02::2 ip6-allrouters EOF } >| /etc/hosts # Add our first user, set their password and add them to sudo useradd -m [User] passwd [User] usermod -G sudo -a [User] chsh [User] # Fix the broken packages apt install -f # Turn on network so we can add packages dhclient # Install posix standard tools apt update tasksel install standard # Add network-manger apt install -y network-manager nmtui # Remove need to type luks password twice dd bs=512 count=4 if=/dev/urandom of=/crypto_keyfile.bin chmod 400 /crypto_keyfile.bin cryptsetup luksAddKey /dev/sda1 /crypto_keyfile.bin # in /etc/crypttab replace none with /crypto_keyfile.bin blkid | grep '/dev/sda1:' | echo -e "sda1_crypt\tUUID=$(awk -F'"' '{print $2}')\t/crypto_keyfile.bin\tluks,keyscript=file" > /etc/crypttab # create /usshare/initramfs-tools/hooks/file (750 permissions) with the below content: :::::::::::::: START :::::::::::::: #!/bin/bash set -e PREREQ="cryptroot" prereqs() { echo "$PREREQ" } case $1 in prereqs) prereqs exit 0 ;; esac . /usshare/initramfs-tools/hook-functions # Hooks for loading keyctl software into the initramfs copy_exec /crypto_keyfile.bin exit 0 :::::::::::::: END :::::::::::::: chmod 750 /usshare/initramfs-tools/hooks/file # and then create it's match in /lib/cryptsetup/scripts/file (750 permissions) with the following content: :::::::::::::: START :::::::::::::: #!/bin/sh decrypt_file () { cat "$1" return 0 } if [ -z "$1" ]; then echo "$0: missing key as argument" >&2 exit 1 fi decrypt_file "$1" exit $? :::::::::::::: END :::::::::::::: chmod 750 /lib/cryptsetup/scripts/file update-initramfs -u -k all # You can verify that the keyfile and /lib/cryptsetup/scripts/file are both in the initrd with: lsinitramfs /boot/initrd.img-* | less *You may now logout and finish the rest as user* # Install Desktop utils if required sudo apt install -y xinit slim i3-wm dmenu x11-xserver-utils # If you skipped the guix option for space reasons: # sudo apt install -y gpg rxvt-unicode emacs git tig most firefox-esr 
submitted by concernedgnu20190124 to linuxadmin [link] [comments]

gdbstub 0.4: An ergonomic, #![no_std] implementation of the GDB Remote Serial Protocol in Rust | docs | repo
An ergonomic and easy-to-integrate implementation of the GDB Remote Serial Protocol in Rust, with full #![no_std] support. gdbstub makes extensive use of Rust's powerful type system + generics to enforce protocol invariants at compile time, minimizing the number of tricky protocol details end users have to worry about.
A lot has changed since my last post announcing gdbstub 0.2!
Version 0.4 includes a major API overhaul, tons of internal optimizations, and a slew of new GDB protocol features, making it the fastest, leanest, and most featureful release of gdbstub yet!
It's been absolutely incredible having so many people contribute to the library, and seeing gdbstub being used in all sorts of cool projects. Thank you for all the support!
By the way, if you're taking part in Hacktoberfest this year, there are plenty of ways to contribute to gdbstub. There's a whole laundry list of protocol extensions and new architectures to support, so check out the issue tracker and consider lending a hand!
submitted by daniel5151 to rust [link] [comments]

Beginner's critiques of Rust

Hey all. I've been a Java/C#/Python dev for a number of years. I noticed Rust topping the StackOverflow most loved language list earlier this year, and I've been hearing good things about Rust's memory model and "free" concurrency for awhile. When it recently came time to rewrite one of my projects as a small webservice, it seemed like the perfect time to learn Rust.
I've been at this for about a month and so far I'm not understanding the love at all. I haven't spent this much time fighting a language in awhile. I'll keep the frustration to myself, but I do have a number of critiques I wouldn't mind discussing. Perhaps my perspective as a beginner will be helpful to someone. Hopefully someone else has faced some of the same issues and can explain why the language is still worthwhile.
Fwiw - I'm going to make a lot of comparisons to the languages I'm comfortable with. I'm not attempting to make a value comparison of the languages themselves, but simply comparing workflows I like with workflows I find frustrating or counterintuitive.
When I have a question about a language feature in C# or Python, I go look at the official language documentation. Python in particular does a really nice job of breaking down what a class is designed to do and how to do it. Rust's standard docs are little more than Javadocs with extremely minimal examples. There are more examples in the Rust Book, but these too are super simplified. Anything more significant requires research on third-party sites like StackOverflow, and Rust is too new to have a lot of content there yet.
It took me a week and a half of fighting the borrow checker to realize that HashMap.get_mut() was not the correct way to get and modify a map entry whose value was a non-primitive object. Nothing in the official docs suggested this, and I was actually on the verge of quitting the language over this until someone linked Tour of Rust, which did have a useful map example, in a Reddit comment. (If any other poor soul stumbles across this - you need HashMap.entry().or_insert(), and you modify the resulting entry in place using *my_entry.value = whatever. The borrow checker doesn't allow getting the entry, modifying it, and putting it back in the map.)
Pit of Success/Failure
C# has the concept of a pit of success: the most natural thing to do should be the correct thing to do. It should be easy to succeed and hard to fail.
Rust takes the opposite approach: every natural thing to do is a landmine. Option.unwrap() can and will terminate my program. String.len() sets me up for a crash when I try to do character processing because what I actually want is String.chars.count(). HashMap.get_mut() is only viable if I know ahead of time that the entry I want is already in the map, because HashMap.get_mut().unwrap_or() is a snake pit and simply calling get_mut() is apparently enough for the borrow checker to think the map is mutated, so reinserting the map entry afterward causes a borrow error. If-else statements aren't idiomatic. Neither is return.
Language philosophy
Python has the saying "we're all adults here." Nothing is truly private and devs are expected to be competent enough to know what they should and shouldn't modify. It's possible to monkey patch (overwrite) pretty much anything, including standard functions. The sky's the limit.
C# has visibility modifiers and the concept of sealing classes to prevent further extension or modification. You can get away with a lot of stuff using inheritance or even extension methods to tack on functionality to existing classes, but if the original dev wanted something to be private, it's (almost) guaranteed to be. (Reflection is still a thing, it's just understood to be dangerous territory a la Python's monkey patching.) This is pretty much "we're all professionals here"; I'm trusted to do my job but I'm not trusted with the keys to the nukes.
Rust doesn't let me so much as reference a variable twice in the same method. This is the functional equivalent of being put in a straitjacket because I can't be trusted to not hurt myself. It also means I can't do anything.
The borrow checker
This thing is legendary. I don't understand how it's smart enough to theoretically track data usage across threads, yet dumb enough to complain about variables which are only modified inside a single method. Worse still, it likes to complain about variables which aren't even modified.
Here's a fun example. I do the same assignment twice (in a real-world context, there are operations that don't matter in between.) This is apparently illegal unless Rust can move the value on the right-hand side of the assignment, even though the second assignment is technically a no-op.
//let Demo be any struct that doesn't implement Copy. let mut demo_object: Option = None; let demo_object_2: Demo = Demo::new(1, 2, 3); demo_object = Some(demo_object_2); demo_object = Some(demo_object_2); 
Querying an Option's inner value via .unwrap and querying it again via .is_none is also illegal, because .unwrap seems to move the value even if no mutations take place and the variable is immutable:
let demo_collection: Vec = Vec::::new(); let demo_object: Option = None; for collection_item in demo_collection { if demo_object.is_none() { } if collection_item.value1 > demo_object.unwrap().value1 { } } 
And of course, the HashMap example I mentioned earlier, in which calling get_mut apparently counts as mutating the map, regardless of whether the map contains the key being queried or not:
let mut demo_collection: HashMap = HashMap::::new(); demo_collection.insert(1, Demo::new(1, 2, 3)); let mut demo_entry = demo_collection.get_mut(&57); let mut demo_value: &mut Demo; //we can't call .get_mut.unwrap_or, because we can't construct the default //value in-place. We'd have to return a reference to the newly constructed //default value, which would become invalid immediately. Instead we get to //do things the long way. let mut default_value: Demo = Demo::new(2, 4, 6); if demo_entry.is_some() { demo_value = demo_entry.unwrap(); } else { demo_value = &mut default_value; } demo_collection.insert(1, *demo_value); 
None of this code is especially remarkable or dangerous, but the borrow checker seems absolutely determined to save me from myself. In a lot of cases, I end up writing code which is a lot more verbose than the equivalent Python or C# just trying to work around the borrow checker.
This is rather tongue-in-cheek, because I understand the borrow checker is integral to what makes Rust tick, but I think I'd enjoy this language a lot more without it.
I can't emphasize this one enough, because it's terrifying. The language flat up encourages terminating the program in the event of some unexpected error happening, forcing me to predict every possible execution path ahead of time. There is no forgiveness in the form of try-catch. The best I get is Option or Result, and nobody is required to use them. This puts me at the mercy of every single crate developer for every single crate I'm forced to use. If even one of them decides a specific input should cause a panic, I have to sit and watch my program crash.
Something like this came up in a Python program I was working on a few days ago - a web-facing third-party library didn't handle a web-related exception and it bubbled up to my program. I just added another except clause to the try-except I already had wrapped around that library call and that took care of the issue. In Rust, I'd have to find a whole new crate because I have no ability to stop this one from crashing everything around it.
Pushing stuff outside the standard library
Rust deliberately maintains a small standard library. The devs are concerned about the commitment of adding things that "must remain as-is until the end of time."
This basically forces me into a world where I have to get 50 billion crates with different design philosophies and different ways of doing things to play nicely with each other. It forces me into a world where any one of those crates can and will be abandoned at a moment's notice; I'll probably have to find replacements for everything every few years. And it puts me at the mercy of whoever developed those crates, who has the language's blessing to terminate my program if they feel like it.
Making more stuff standard would guarantee a consistent design philosophy, provide stronger assurance that things won't panic every three lines, and mean that yes, I can use that language feature as long as the language itself is around (assuming said feature doesn't get deprecated, but even then I'd have enough notice to find something else.)
Testing is painful
Tests are definitively second class citizens in Rust. Unit tests are expected to sit in the same file as the production code they're testing. What?
There's no way to tag tests to run groups of tests later; tests can be run singly, using a wildcard match on the test function name, or can be ignored entirely using [ignore]. That's it.
Language style
This one's subjective. I expect to take some flak for this and that's okay.
submitted by crab1122334 to rust [link] [comments]

My Build System

This describes the build system for my own systems language. It's one that mainly targets x64 native code on Windows.
The post is largely a reaction to the preponderance of dependencies such as CMake and Make which seem to be part of every open source project, no matter how small. (I won't mention those again as negative opinions attract downvotes.)
This is really about showing how simple building applications can be, certainly for smallish programs up to 50 or 100Kloc.
BB is the name of my latest compiler
M is the name of the language
.m is the source file extension (shown below but normally not needed)
EXE and DLL are executable files and dynamic, shared libraries on Windows.
Building an EXE with no DLLs
That is, not needing external DLLs (or needing only the default DLLs such as msvcrt.dll). This is the simplest task, so the process should be simple too. If 'prog.m' is the lead module of an application, it is built like this:
bb prog.m 
BB is a whole program compiler, so will build all files from source into prog.exe. (And very quickly as BB is quite fast. It will build itself in 0.2 seconds, and my machine is nothing special.)
Well, I could just end the article there, but I'll cover a few more aspects.
Building an EXE using DLLs
Suppose the 'prog' application needs 'bignum.dll', the build command can just become:
bb prog.m bignum.dll 
However, there are a number of ways to specify the dependencies inside the source code (eg. using cclib bignum for foreign libraries, or importx bignum for those written in M). Then it again becomes:
bb prog.m 
Creating a DLL
This is something that BB can finally do itself, after being reliant on external tools. If bignum.m is the library (which can import many other modules), then a DLL is created with:
bb -dll bignum.m 
This creates two files, bignum.dll and bignum.exp. The latter is an interface module automatically created (named .exp so as not to overwrite the implementation file.)
It effectively creates the bindings that are such a big deal when trying to use foreign-language libraries (the subject of my recent thread).
The library can be used in a program using any of:
import bignum # use bignum.m as static part of the app importx bignum # use bignum.exp, and bignum.dll (importd bignum # use bignum.dll only) 
(The last line would be the next step, incorporate the .exp file into .dll, to be extracted by the M compiler. Then just that one file is needed. But probably not worth the trouble for now.)
Exporting Names from a DLL
When generating a DLL file, only names with an 'export' attribute are put into that file. Ordinary names shared across modules have a 'global' attribute; those are not exported. (With C, everything that is not static will be exported from a DLL if you're not careful.)
(M allows functions, variables, named constants, enums, types and macros to be exported from a DLL. Only functions and variables need to be physically inside the DLL, the rest are handled by the language via the .exp file.
However, importing variables from DLL is not supported by M at the moment.)
Documenting DLL Functions
Exported functions can have docstrings (special comments just before and/or inside a function) which can be written out using a -docs option to BB. This a text file (eg. bignum.txt) containg function signatures and comments.
Incorporating Support Files into a Build
These are various files used in addition to the source files of a program. Eg. help files, or other source files pertaining to the application (such as the standard headers of a C compiler).
Such files can be incorporated into the program using directives such as strinclude for text files (as a long string constant) and bininclude for binary files (as a byte array data).
The benefit is having a tidy, self-contained executable.
Conditional Build Elements
This is only handled at the module level, using techniques such as module mapping.
Creating a Single Source File Representation
A project can consist of many source and support files, sometimes across several directories. This option puts them all into a single file:
bb -ma prog.m 
This creates, which concatenates all files, with simple directory info at the start. Unlike ZIP, it is readable text, and can also be directly compiled in that format:
It's a convenient format for copying, emailing, backing up etc. (And a simple utility can extract the discrete files if needed.)
So that's it; the main build tool I use is the compiler itself (currently 450KB - that is, KB not MB - plus its small set of libraries.
In the past, with separate compilation, project files that listed all the modules and files were used to drive the compiler via a crude IDE. They're no longer needed for building, but are still used for browsing and editing a project, and to provide run options.
Here's BB in action compiling itself (taking care not to overwrite itself):
C:\bx>bb bb -out:bb2 Compiling bb.m to bb2.exe 
Any more complex requirements can be taken care of with Windows BAT scripts, or my own scripting language.
Addendum - Generating C Files
This is a sporadic feature, not always supported, which turns an M application into a monolithic C file. It works like this:
mc -c prog.m 
(Uses MC, a version of MM, the last M compiler, as BB does not have a C target.) This creates a one-file C version, using very conservative code, which can basically built as simply as hello.c.
Once again, the simplest possible way to build a project, using only a compiler for the language (M is not the only language where that is possible).
I used this when I wanted to share my projects and using M source involved either bootstrapping problems, or downloading binaries; or for running code on Linux.
(BB may support C again, but it will probably be much lower level, linear C code.)
submitted by bart7796 to ProgrammingLanguages [link] [comments]

Choose Your Own Adventure - Part 2

Part 1

What if it wasn’t about anything related to the text? What if it was similar to the riddles that brought me to those pages? What if the mystery behind them was related to their page numbers, or hell the page numbers in general?
Once at home I went to work. I told myself once more that I needed to get the full picture. So I went to write down all the page numbers in the book, one after another.
When I was done, I took a step back and stared at the result. Yet, there was nothing that stood out to me right away. I haphazardly picked one of the secret pages. Page 427 was in front of page 811. Then I continued.
811, 812, 813, 814, 815, 816, 817, 818, 818, 820, 821, and right after was yet another secret page.
This one was page 528.
And after that, the regular page numbers continued.
822, 823, 824, 825, 826, 827, 828, 829, 830, 831, 832, 833, 834, 835, 836, 837, 838, 839, 840, 841, 842, 843, followed by another one, page 143.
This list of ongoing numbers made me suddenly wonder. My thoughts drifted right back to what had gotten me to do this, the secret pages.
What if they weren’t placed randomly?
Yet, as I checked their distribution, it felt almost too random. I checked the number of regular pages before and after, put them in sequence, but there was no correlation.
Then I got another idea. I added up all the pages before and after, but this also made no sense. Half the results were too big and exceeded the total number of pages in the book, by far.
Then, starting at number 111 to 137, which I’d just added together, I got yet another idea. What if I only added together their last digits?
The result I came up with was 648. Which was exactly the secret page that followed afterward!
My eyes grew wide. I’d had it, hadn’t I? The hint I’d been looking for! I was going livid.
Right away I went to the next one and calculated all the preceding numbers, only to come up with an entirely different result than the page number of the secret page following. Cursing I got up.
It had been another goddamn coincidence. I laughed, but this time in abject misery, mocking my stupidity. How’d it be so damned easy, you idiot? There was no way. None of this was easy. None of it!
But as I stared at the result I’d come up with just now, I noticed something. The result of my calculation was 702. The page number was 351. Wait. Wait. Wait. That’s half of 702! Maybe it really was nothing but a coincidence and I was just grasping at straws, but what else was I to do?
The next result I came up with was 176. If I multiplied it by three, it gave me the page number of the secret page that followed it, 528. The number 715, divided by 5, gave me the page number 143 that followed it.
I continued adding, dividing, and multiplying and it all checked out. All the page numbers of the secret pages resulted from calculations of the last two digits of their preceding pages.
What does it mean though? Does it even mean anything? The exhilaration I’d felt ebbed away, and I sat there, staring at all my calculations wondering if there was any meaning to it. Yet, there had to be, right? This couldn’t have been designed as yet another red herring. This was too damned complex. No, there had to be a reason for this.
What if there was an order? If I went through all the calculations I quickly noticed that the result was never divided by the same number. The highest number that a result was divided by was 26, the highest a result was multiplied by was 27. It was exactly 53 different calculations.
With that, I started ordering them, one by one, starting backward from the highest division, to the highest multiplication. Then I put the topic of each page behind the numbers in the resulting list.
I’d hoped for something. I’d hoped to find it starting with the page about the universe, followed by constellations and stars up to the evolution of apes, plants, and other animals. Yet, it was all mixed-up nonsense. There was no order to it at all! Even when I ordered them in other ways, trying to find any sort of correlation, it was always the same. Nothing, but nonsense.
My hands started shaking as anger flooded through me. I crumbled up the stupid, ordered lists and threw them across the room. Then I cursed in sheer and utter rage. This was freaking stupid. This was insane! This was nothing at all, just pure fucking nonsense. I picked up a random object on my table and hurled it against the wall where it shattered into pieces. Then I threw aside a chair I found standing in my way and kicked over the small couch table, creating general chaos in my living room.
I was stopped from going any further when my neighbors banged against the wall, screaming to knock it off and threatening to call the cops.
That made me stop. The anger went away. I stared in shock at my living room. What the hell was happening to me? Why’d I done that? Why’d I destroyed my things at 1 am in the freaking morning?
Then I slowly smoothed out the lists I’d created and put them on one of the few free spots remaining on my living room wall. Who knows, I might need it later.
I laughed as I looked from them to the rest of the wall which was now entirely covered. Even worse were the stacks of notes that had accumulated in front of them. I was proud all right, but I also knew that this thing was absolutely insane.
Once more, I couldn’t help but wonder what I was doing.
Shaking my head, I turned around and made my way to the bedroom. Yet, as my fingers rested on the light switch, I turned around one last time. I stared at the mad lines, the mad paths who were connecting here and there. There was nothing but lines upon lines. Here and there, if I looked hard and long enough, I could almost make out shapes.
I froze. What if it was a visual puzzle? What if there was a hint hidden in the shapes of the paths?
For days I sat down, drew points and lines and connections, warping them into surreal shapes. This was crazy, wasn’t it? How’d it be visual? There’s probably not a damn thing to be got from this. This was stupid. Yet, I couldn’t stop. Each day, I spent my entire afternoon, my evening, and even half the night, drawing. And eventually, it all came to nothing. There was nothing but mad lines and not a clear shape in sight.
I didn’t give up though, wasn’t discouraged. I was beyond that, far beyond that. What if there was something else? Maybe there was a hidden code between these pages?
When I was at work, I’d completely forgotten about my former vow not to talk about the book or do anything related to it. Instead, I read up on cryptography. Going through article after article. I read up on Caesar Code and Binary Code, on the Polybius Cipher and Hex Code. I went mad with it. Before long I spent more time reading up on things than doing any of my work. Eventually, I even brought pages filled with numbers with me, cross-checking them for hits of any and all codes.
I heard co-workers whispering behind my back, asking me what I was doing and I told them, I just hadn’t closed the weird articles after break time.
They knew it wasn’t the truth. They’d heard me mumble, saw the little notebook I was writing in, noticed the endless lists of numbers I brought with me each day.
My superior eventually came up to me. He asked me what I was doing with all those weird pages. I told him it was nothing but a little puzzle.
“Well, Todd,” he started in a condescending voice. “You’re not here to do any of those ‘little puzzles’, you’re here to do your damn job. Where are the calculations for this month? I’ve been waiting for them all day.”
“Oh, I guess, I’m almost done with them, I just need another hour or-“
My voice trailed off when he picked up one of the pages I’d been looking at mere minutes ago. Suddenly, when I saw him holding it, I felt nervous.
“What even is this? It’s just random numbers.”
He saw my face, saw the way my eyes grew wide when he’d picked it up. The hint of a smile washed over his face as he crumbled it up.
He opened his mouth for another remark, but before he could I jumped up from my chair and ripped the page from his hand. He cringed back a step in shock at my reaction.
“The hell’s wrong with you?” he screamed at me, but I didn’t listen. Instead, I carefully smoothed out the paper and made sure he hadn’t torn it apart.
By now half the office had gotten up to watch the weird exchange. Only now did I realize what I’d done and how everyone was staring at me.
Suddenly I felt very watched and almost sunk back into my chair.
“Sorry, I didn’t mean to,” I mumbled but broke up under the pressure of all those eyes.
“Get back to work and finish those damned calculations! If I see you tinkering with any of this shit again, you can clean out your desk!”
With that, he stormed off. I heard people whispering all around me, some laughing, others speaking in a more reserved tone.
Yep, I thought, it’s official. I’m the office nutjob.
Right away, I forced myself to close all the Wikipedia articles I had still open and put away all my notes. And then, grudgingly, annoyed and half-mad at the distraction it represented, I went back to work. Somehow though, it felt meaningless, calculating all these stupid orders and filling out this customer database. What the hell was I even doing? What if it really was a code? What if it was actually a mixture, a double-code? My mind went wild with ideas. Five minutes later, I found myself holding one of my notes again. I couldn’t even remember taking it out.
Pushing it back, cursing, and not a little afraid, I forced myself to work calculations until the day was over. At the moment my shift ended, I jumped off my chair and rushed for the door. People stared at me, looked after me, their faces a mixture of amusement and worry.
I didn’t care. I had work to do. The important kind of work!
I’d just tried to find another connection between the page numbers of the secret pages when my doorbell rang. I ignored it, but it just kept ringing. When it finally stopped, I sighed in relief. Just leave me alone, I cursed, I’ve got work to do.
Then, mere moments later, my phone vibrated on the other end of the room. Dammit, I’d forgotten to mute it again. I waited for it to stop, but it started up right away. Cursing I went over to see who it was and noticed the name instantly.
It was my friend Andrew. Annoyed, I answered it.
“Yo, Todd, you home?” I heard his voice from the phone next to my ear and more distant, muffled from the front door.
My first reaction was one of annoyance. Then I pushed the thought away. What the hell was wrong with me? This was Andrew. He was my best friend, the only one of our old group who still lived in the same city. Right away, I thought about how long I’d last seen him. Surprised I realized that it must’ve been weeks. One glance at the mad mess in my living room told me why.
“Yeah, sure hold on,” I said over the phone and made my way to the front door.
Andrew smiled at me brightly and held up to six-packs.
“Haven’t seen you in forever, how about we have a few! I got quite the story for you, my man!”
I smiled at him. “Sure, come on in.”
We made our way inside and Andrew had barely set foot into my living room when he stopped. His eyes grew wide as he stared at the wall and the stacks of paper all over the place.
“Holy shit man. I was wondering why I haven’t heard from you. The hell’s all that? You working on some sort of project?”
“Kind of,” I mumbled a little embarrassed.
I quickly picked up the papers on the couch and put them aside to make room for him to sit.
“Sorry about the mess.”
“Nah man, it’s all right. So, the thing I was about to tell you, you remember Thomas, right?”
Thomas, I thought. Did I know a Thomas? Then I remembered him. Of course, I remembered him, he’d been part of our group. I rubbed my temples for a second before I nodded.
“He’s getting married and you won’t believe who the lucky girl is!”
With that, Andrew told me the entire story of how our friend Thomas had been dating Susan, Andrew’s cousin for the past three months, and the two of them had decided to get married. I listened, nodded here and there, even laughed a few times absentmindedly, but my eyes wandered to my notes again and again.
For a moment I spaced out entirely, thinking about an idea that had popped into my mind just before he’d arrived. What if there was something about number sequences? I must’ve sat there for an entire minute, simply holding my beer and staring off at nothing when Andrew waved his hand in front of my face.
“Yo, dude, you listening?”
“What? Oh, sorry, no, I think I spaced out for a moment.”
“All right, man, I got to ask, what’s all this? What sort of crazy thing are you working on? Haven’t seen you this into something in years.”
I smiled at him awkwardly and then sighed and pointed at the book.
“It’s one of those Choose Your Own Adventure books,” I started.
With that, the flood gates broke open, and I told him all about it.
He listened, at first curiously, but after a while, his face changed. There was visible concern, as I rambled on about secret pages, strange objects, and cryptography.
“Todd, hold on, hold on, what the hell are you even talking about?”
I stared at him.
“The book. You know those secret pages must’ve some sort of meaning. At first, I thought there was a simple order to them, but it was too chaotic. If you add up all their page numbers though, you get 20670, and if you divided this up by-“
“All right, man, stop,” he cut me off. “So you’re adding up all those numbers, I get that, but for what?”
I began explaining again, I tried, but he couldn’t follow me.
“Yeah, I don’t get it, man. Just, what the fuck?”
“All right, look,” I said and walked over to the wall covered in lines and numbers and started once more.
I told him about the different adventure paths, the references, the secret pages, and when and how they appeared.
His face was blank as I rambled on and on and on.
“Yo, dude, you might want to take a bit of a break, this sounds, well, a bit crazy.”
For a moment I was quiet, then a short, nervous laugh escaped me.
“Yeah, I guess you’re right.”
He stepped up next to me, staring at the wall.
“Shit man, you did all this? Just for a damned book?”
Before I could answer, he reached out and was about to take one of the pages off the wall. My hand shot forward instinctively, batting his aside.
“Don’t touch it!” I called out before I realized what I’d done.
Andrew stumbled back a few steps, shocked. “Shit man, sorry, I didn’t mean to-“
And then it happened. I didn’t even listen to his words anymore as he bumped against some of the stacks of notes I’d placed neatly in front of the wall. They toppled over one another, the pages scattering all over the floor and intermixing.
My eyes grew wide. Oh god, no, freaking god no. Anger rose in me. It had taken me so goddamn long to sort them all out, to order them. There was a freaking method to it all and now he’d destroyed it. He’d destroyed the work of entire fucking days!
“What the fuck are you doing?” I screamed at him.
He cringed back, only now realizing what had happened.
“Hey, didn’t mean to,” he said and began picking up random pages.
I ripped them from his hand and pushed him back. “No, don’t fucking touch them. Those two don’t belong together you idiot! Are you freaking insane?!”
With an empty face, he watched as I gathered up some of the pages, stared at them, and began sorting them as best as I could.
“You know, Todd, that’s what I should ask you.”
“What the hell do you mean?” I snapped at him. “You destroyed the work of days! Days! This is-“
“This is what, man?” he cut me off once more. “It’s nonsense. It’s a freaking children’s book, nothing else.”
That did the trick. I got up and stepped up right in front of him.
“Nonsense? You’ve got no FUCKING idea, how far I’ve come! You’ve got no clue what’ve done already! And here you are telling me this is NONSENSE?”
His face had grown hard. For a second he was about to say something, but then he simply shook his head and laughed. Without another word, he picked up his things, the beer, and left.
If he said any words in parting, I didn’t hear them. I was already busy re-ordering my notes.
It was hours later, when I was done sorting them all out, that I realized what I’d done and how I’d acted.
For the first time, I grew truly scared.
That hadn’t been normal. That wasn’t me. Why’d I gone crazy like this?
I took first one step back from the wall, then another before I went to pick up my phone. When I tried to call Andrew, he didn’t pick up. Instead, the call went straight to voice mail. Then I saw how late it was, long past three in the morning.
I wrote him a quick message, apologized for my behavior, and told him he was right. I should take a break from this entire thing.
That’s what I did right away. I picked up my laptop, made my way to the bedroom, and this time I turned off the light without looking over my shoulder.
I lay down on my bed and started browsing YouTube and told myself to just enjoy it and take a break.
Yet, even as I watched video after video, the little voice in the back of my head spoke up again. It told me I should go on, told me to go back to the living room.
You almost had it, Todd, you almost had it. Just one more hint and you’re done with it. Then you can let it go and you can-
“Shut up, goddamnit!” I screamed at myself to quiet the subconscious voice in the back of my head.
“I freaking know,” I said quieter. “God, I freaking know.”
I sat in bed, the video that was playing already forgotten. As video, after video played, I was on my phone, checking stars and numbers before I eventually drifted off to sleep.
The next morning I didn’t even get to make myself a coffee. I was mad, pissed off and I wanted to finally make progress. For a while, I tinkered about the various codes I’d read about. What if there was a code, but what but if it concerned the entire book and not just the secret pages? What if it was related to the adventure after all? Maybe you could scramble up page numbers and-
I stopped and rubbed my temples. Calm down, don’t go crazy. Calm down and take a step back. You don’t even know if there are any damned codes hidden in the book. You did well deciphering all the different adventure paths and the connections between them. You did well discovering all the secret pages. But what if there’s something you haven’t discovered yet?
That was the question that told me what I had to do. Something I hadn’t dared to do so far.
I had to go through the entire book.
I had to make my way through it not following the adventure, but going page by page and look out for anything new. There might be chapters I hadn’t discovered yet, hadn’t read yet.
With newfound energy and a new plan, I started right away.
My phone rang shortly after noon, but this time, I didn’t even bother with it. I just ignored it. After all, I had more important things to do.
This time I didn’t just write down chapters, choices, and connections. This time I wrote down every single thing that came up. I took note of every single object that was mentioned then added the page number, the corresponding path, and any reference I knew about it.
It was a momentous task. I spent the entire day doing it and barely made it through the first 130 pages.
The next day, Sunday, I didn’t even finish another hundred. The further I came, the more objects I noticed, the more combinations, and references. At times, I even had to go back, to cross-check things, and to change notes accordingly.
It was the most enduring task I’d ever attempted, concerning this damned book and probably my entire life.
It took me weeks. I finished stacks upon stacks of notes. I went to the office supply store multiple times a week buying stacks of papers I ended up filling by the day.
Work during this time was barely an afterthought. I was barely functioning at all. I was typing in numbers and names almost on autopilot. By now I didn’t even get stares anymore. I was entirely ignored, a shell of a man, a ghost that stumbled to his cubicle in the morning and rushed back home in the evening.
Days went by, then weeks, as I slaved away over the book’s many pages. Until one day, when I was finally done. I can’t even say how many weeks I’d been at it.
There were stacks of hundreds of papers, maybe even more. Notes, references, objects, names, words, anything basically.
I’d just created a table of how often each and every single object appeared and in which setting when I noticed a new hint. I stared at it with a giant grin on my face.
The Ruby Orb had been the very first object I’d added to the table.
It appeared in all paths:
  1. Fantasy - 31 times
  2. Space - 3 times
  3. Stone Age - 2 times
  4. Ocean and Pirates - 11 times
  5. Desert Ruins - 29 times
  6. Mountains - 17 times
  7. City-State - 7 times
  8. Ancient Rome - 5 times
  9. Jungle Tribes - 13 times
  10. Small Village - 19 times
  11. Underwater Civilization - 23 times
As I wrote those numbers down, there was something about them. Somehow I knew those numbers. I went over them, staring at them for a while before it hit me.
I cross-checked it online, and I was right. They were all prime numbers! Yes, I thought, I’d found something new!
I quickly rechecked another object, the Desert Orb, and realized it was the same here, too. This one’s appearances made up a simpler sequence. It only appeared once in the city-state, twice in fantasy, and finally 11 times in the desert ruins.
I couldn’t help but grin. I did it for another object, this one the Ebony Stick. It too appeared in all paths and its number was increased by two, starting at 4 and going up to 26.
That’s when I knew what I had to do. I had to go through all the objects, all the hundreds of objects in the damned book, and check how often they appeared. There was a correlation, another part of the puzzle. I was exhilarated, in a state of glee and unbound excitement.
These number sequences, maybe they were the key to figuring out what the secret pages meant, or maybe the page numbers in general. I started laughing. I could feel it, I was so damn close.
I slept when necessary, ate when necessary, right there on the living room floor. It was only once that I thought about work, only in passing, and the idea that I should go never even came to my mind.
My phone was at the other and of the room. I ignored it entirely during that time. It wasn’t important. This right here, that’s what was important.
I was done by the end of the week. It was long past midnight on Saturday when I’d finally deciphered the number sequences of all 311 objects in the book.
When I was done with my work, I looked at the tables of objects in a state of awe. I spread them out in front of me and marveled at the dozen or so pages. For a moment I was about to dive into them when I realized how tired I was.
For the first time since the beginning of the week, I picked up my phone. It was off, must’ve been for days. I connected it to the charger and turned it on. I was bombarded with a plethora of notifications. For almost a minute the damned thing started ringing and vibrating.
There were a few messages from Andrew, asking how I was doing and if I’d stopped with my damned obsession yet. I laughed and closed the chat.
I’d also received countless emails. Most of them were from work and only now did I remember that I hadn’t shown up for an entire week. They started normal enough, reminding me to call if I was sick, became reproachful after a day or two, and finally angry. The last one told me this was the last straw. I should come in on Monday for a talk and be prepared to clean out my desk.
It was strange how little I felt about it, how little it mattered in the grander scale of things. I almost laughed again as I threw the phone aside and laid down to catch some sleep.
When I woke up, I went right back to work. I tinkered with the number sequences, looked at each one of them, added them up, multiplied, and divided them.
It was the Crown of Ice that finally made me look up. When I added all its appearances together, I came to a total of 1000. This damned thing, I thought, it was by far the most common object in the damned book.
I started to read up on it in my notes. It was said in the Manuscript of the Seven Seas, that the Crown of Ice was found in the Crypt of the Dragon. The Crypt of the Dragon was located in the desert ruins.
I went back to it, page 1544, and read the part again. There were three choices. One sent me to leave without the crown and sent me back to a desert tribe. Destroying the crown ended in painful death while the third option was wearing it.
All right, wearing the crown opened a secret passage that sent me to the location of the Magic Water and from there back on my way through the desert.
Dammit, I thought I had something! I was about to go back to the list. Maybe the number thousand was another coincidence.
Then something made me look up. The crown appeared in the desert ruins a total of 53 times. I thought about it. The desert ruins one was by far the shortest path. How long was it in total again?
I stepped up to my living room wall and counted the chapters. When I followed them, there was only a single path that was longer than 50. It came to a total length of 78 chapters before it started from the beginning.
Chapter 53 described what you found if you opened a chest hidden in the Ancient Pyramid.
I read the entire chapter again. It was titled ‘The Treasure Chest.’ There was a total of 289 gold coins in the chest. When I went back to the list of objects, I noticed that the gold coin was mentioned a total of 289 times. The same was true for the sparkling diamonds. There were a total of 33 in the chest and the object itself came up 33 times in the book.
I almost laughed when I noticed that it was true for the third object in the chest as well.
I got an empty page and like a child, I wrote the words Chest, Pyramid, and Treasure in huge letters at the top of it before I went and added all the two dozen objects in the chest.
While I did it, I wondered if there was something like this for every other object in the book. What if every object’s number of appearances was mentioned somewhere in the book? Not just in this chest, but just somewhere.
And then, on a whim, I asked myself another question. What if certain objects didn’t? What if there were just a few or maybe just one whose number was mentioned nowhere? Maybe those were the important ones!
For the entirety of Sunday, I followed through with this idea. I calculated, I added objects to yet more lists, I followed through paths and loops, studied my notes, and slowly, the number of objects remaining got smaller and smaller.
Eventually, just as I’d hoped, there was a single object whose total number of appearances was mentioned nowhere. It was a small, red die. One that was mentioned here and there, only in passing when people played a game of dice in bars or the streets.
There had to be something to this damned thing, I knew it! After this entire week, no after all these entire months, I finally had something, I’d finally narrowed it all down to a single object.
A shiver went down my spine when I realized that this might be it. This might be the solution that I’d been searching for all this time!
I went back to my notes about the red die and all its appearances. Here a few kids were playing with it in the streets, there was someone holding it in their hand, and here it rolled onto the floor when a fight broke out.
Finally, I found what I’d been looking for. There was only a single instance in the entire book where you could interact with it. It was in a bar in space where you could join a futuristic game of dice.
When the game was done, you could pocket the red die.
The short chapter that followed it was mundane and almost unimportant. But when I read it, I noticed something else, not in the text, but the choices below. Weren’t they the same as in the chapter before?
I went back to the preceding page and reread it. Yes, the same two choices, sending you to the same two pages. Almost as if picking up the die didn’t matter at all. Making it appear as nothing but a red herring.
And I grinned. I grinned wider than I had ever before.
There had to be a hint here, no, there had to be a way of finishing this entire damn thing.
I wrote down the entire paragraph and went back to work, studying it. I checked everything that was mentioned in it: the page number, the chapter title, colors, words, anything I could think of. Until late in the morning hours, I pondered over this one, single paragraph.
I could barely keep my eyes open when I stumbled upon it. It was silly, but I exploded with joy and was suddenly wide awake again.
The number of words in each sentence was eight. The number of sentences was eight as well. There were eight sentences here, with eight words each. This was no coincidence. This was it, the total number of words was 64, the square number of eight. There was too much here for it to be a coincidence.
I rushed back to the buck, almost stumbled over my feet, and threw open page 64. Like a crazed, starved animal I poured over the words on the page, almost pressing my face against it. The chapters, there had to be something here, the solution had to be right in front of me.
Yet when I was done reading it, I was dumbfounded. The entire page comprised a single chapter, a chapter I knew damn well. And I realized that I knew the number 64 damn well, too.
I was at the beginning of the fantasy setting. I read once more that I was a young farmer, standing in front of a burned down far, the bodies of his dead parents next to him and that I was about to set out on a grand adventure.
For the next three hours, I analyzed every single word in the paragraph, every single one and I found as many hints as I could search for. I went back to the die paragraph and slowly I came to another conclusion and then another. The number of certain letters corresponded with the number of other objects in the space path. If you put certain letters from certain words together you ended up with yet another number. I followed every single one of them, but each one ended at another mundane position in the book. I slaved away over those as well, reached and analyzed them and I found more hints, more connections, more clues. And the longer and the more deeply I analyzed them, the more I could find, if only I wanted to. There was almost an endless number of nonsensical clues and hints if you wanted so. They were all leading me on, leading me around in a circle, on and on and on and on.
And I sat there, over the damned book, over hundreds, if not thousands of pages of notes. I sat in front of an entire wall covered in information and I laughed. For long, terrible minutes I couldn’t stop laughing.
This was all crazy. This was all entirely and utterly crazy.
And finally, it clicked. At this singular moment it finally and ultimately clicked.
There was no solution. The book had no solution. It finally made sense.
I’d slaved away for weeks, no for months, and all I’d done was to walk in circles, continue from one hint to another, only to be sent back to the beginning. The entire damned book was a loop, a loop of loops with secret loops that sent you to more secret loops.
And then, for the first time in months, I closed the book and put it away.
After that, I slowly went and took down all the mad pages from my wall, stacked up all the notes, and put them together in a box in an almost apathetic state.
I was done.
All of this had been utterly meaningless, a fundamental waste of time.
That night, I didn’t sleep. I lay in bed, contemplating a lot of things. My life, my work, the book, and why I’d been so taken by it. Yet, as with the book, there was no solution. There was nothing to it all.
The next day, with the book in my backpack, I made my way back to the store.
It felt as heavy as the world, an endless number of possibilities all resting on my back.
I knew I had to return it, I had to get rid of it before it might throw me into another crazy fit.
When I entered the store, the old man looked up.
“Can I help you with,” he started but broke up, a surprised look on his face.
“Well hello there, young man. Haven’t seen you in quite a while.”
I only nodded, took down my backpack, heaved out the book, and brought it to a rest in front of him.
“I’d like to return this.”
The old man probed me for a moment.
“We’ve got a no-money-back policy,” he said and pointed at a small, almost illegible sign behind himself.
“Yeah, that’s fine, I just want to get rid of it. I’m done with it.”
“So, you got your reward then?”
I couldn’t help but laugh a little. “Guess so.”
“What was it?” the old man asked curiously.
“It’s meaningless, there’s no end to it. It just goes on forever.”
“Oh,” he mouthed with an expression of surprise.
“You ever tried it yourself, old man?”
“Did once, when I was younger, but I got nowhere. Was too damned hard for me.”
“There’s one thing I’m wondering about. Who the hell wrote a thing like this? I mean, it’s freaking insane. How’d’you ever write something like this?”
“Well, to tell you the truth, there’s something I didn’t tell you when you first came in. I originally bought the book from a street merchant, half a century ago. He told me a few things, and I learned a few more over the years from other people.”
“Like what?”
“There’s nothing but rumors of course. The merchant told me it was written by the Devil himself. Then someone told me it was supposedly written by Machiavelli back in the day, to confuse a man who’d wronged him and drive him mad. There was also a guy who was convinced it was the work of aliens. The most plausible thing I heard is that there’s no single author, but that it was written over the course of centuries, with each new writer adding to it and extending it, making it better and ever more complicated.”
“Heh, sounds about-“ I started, but the old man raised a hand and pushed his head forward, towards me.
“There’s one more. Someone else told me it was written by no other than God himself as a big, giant joke about our earthly existence itself.”
I laughed, but it was a weak laugh. Nothing but a giant joke, that fit it damn well, didn’t it?
And as I stepped out of the store and stared at the city surrounding me, watching the urban bustle, I began thinking.
People were hurrying past me, on their way to work, cars and buses rushed down the streets. As I watched it all, this ever-repeating bustle of civilization, I realized that it was all another never-ending loop. On and on and on we all went, doing the same thing over and over and over again.
And as I walked on I started laughing. Maybe that was all right and maybe it didn’t matter. Who knows, maybe the book was true.
Maybe all of this, all of life, all of existence, just like the damned book, was nothing but God’s big, giant joke.
submitted by RehnWriter to TheCrypticCompendium [link] [comments]

Gridcoin "Fern" Release
Finally! After over ten months of development and testing, "Fern" has arrived! This is a whopper. 240 pull requests merged. Essentially a complete rewrite that was started with the scraper (the "neural net" rewrite) in "Denise" has now been completed. Practically the ENTIRE Gridcoin specific codebase resting on top of the vanilla Bitcoin/Peercoin/Blackcoin vanilla PoS code has been rewritten. This removes the team requirement at last (see below), although there are many other important improvements besides that.
Fern was a monumental undertaking. We had to encode all of the old rules active for the v10 block protocol in new code and ensure that the new code was 100% compatible. This had to be done in such a way as to clear out all of the old spaghetti and ring-fence it with tightly controlled class implementations. We then wrote an entirely new, simplified ruleset for research rewards and reengineered contracts (which includes beacon management, polls, and voting) using properly classed code. The fundamentals of Gridcoin with this release are now on a very sound and maintainable footing, and the developers believe the codebase as updated here will serve as the fundamental basis for Gridcoin's future roadmap.
We have been testing this for MONTHS on testnet in various stages. The v10 (legacy) compatibility code has been running on testnet continuously as it was developed to ensure compatibility with existing nodes. During the last few months, we have done two private testnet forks and then the full public testnet testing for v11 code (the new protocol which is what Fern implements). The developers have also been running non-staking "sentinel" nodes on mainnet with this code to verify that the consensus rules are problem-free for the legacy compatibility code on the broader mainnet. We believe this amount of testing is going to result in a smooth rollout.
Given the amount of changes in Fern, I am presenting TWO changelogs below. One is high level, which summarizes the most significant changes in the protocol. The second changelog is the detailed one in the usual format, and gives you an inkling of the size of this release.



Note that the protocol changes will not become active until we cross the hard-fork transition height to v11, which has been set at 2053000. Given current average block spacing, this should happen around October 4, about one month from now.
Note that to get all of the beacons in the network on the new protocol, we are requiring ALL beacons to be validated. A two week (14 day) grace period is provided by the code, starting at the time of the transition height, for people currently holding a beacon to validate the beacon and prevent it from expiring. That means that EVERY CRUNCHER must advertise and validate their beacon AFTER the v11 transition (around Oct 4th) and BEFORE October 18th (or more precisely, 14 days from the actual date of the v11 transition). If you do not advertise and validate your beacon by this time, your beacon will expire and you will stop earning research rewards until you advertise and validate a new beacon. This process has been made much easier by a brand new beacon "wizard" that helps manage beacon advertisements and renewals. Once a beacon has been validated and is a v11 protocol beacon, the normal 180 day expiration rules apply. Note, however, that the 180 day expiration on research rewards has been removed with the Fern update. This means that while your beacon might expire after 180 days, your earned research rewards will be retained and can be claimed by advertising a beacon with the same CPID and going through the validation process again. In other words, you do not lose any earned research rewards if you do not stake a block within 180 days and keep your beacon up-to-date.
The transition height is also when the team requirement will be relaxed for the network.


Besides the beacon wizard, there are a number of improvements to the GUI, including new UI transaction types (and icons) for staking the superblock, sidestake sends, beacon advertisement, voting, poll creation, and transactions with a message. The main screen has been revamped with a better summary section, and better status icons. Several changes under the hood have improved GUI performance. And finally, the diagnostics have been revamped.


The wallet sync speed has been DRASTICALLY improved. A decent machine with a good network connection should be able to sync the entire mainnet blockchain in less than 4 hours. A fast machine with a really fast network connection and a good SSD can do it in about 2.5 hours. One of our goals was to reduce or eliminate the reliance on snapshots for mainnet, and I think we have accomplished that goal with the new sync speed. We have also streamlined the in-memory structures for the blockchain which shaves some memory use.
There are so many goodies here it is hard to summarize them all.
I would like to thank all of the contributors to this release, but especially thank @cyrossignol, whose incredible contributions formed the backbone of this release. I would also like to pay special thanks to @barton2526, @caraka, and @Quezacoatl1, who tirelessly helped during the testing and polishing phase on testnet with testing and repeated builds for all architectures.
The developers are proud to present this release to the community and we believe this represents the starting point for a true renaissance for Gridcoin!

Summary Changelog



Most significantly, nodes calculate research rewards directly from the magnitudes in EACH superblock between stakes instead of using a two- or three- point average based on a CPID's current magnitude and the magnitude for the CPID when it last staked. For those long-timers in the community, this has been referred to as "Superblock Windows," and was first done in proof-of-concept form by @denravonska.







As a reminder:









Detailed Changelog

[] 2020-09-03, mandatory, "Fern"





submitted by jamescowens to gridcoin [link] [comments]

External Stepmania Song Management Tool - Feature Requests Appreciated

Way back in 2015 I created a really simple utility to manage my StepMania library that I dubbed StepManiaHelper, which I released on this subreddit to seemingly little interest. Given the simplicity and narrow use-case of the tool though, that was perhaps not surprising.
The original idea of the tool was that I had a song library of over 10k songs, and that caused the game to take a long time to startup. Since many of these songs were ones I'd never play (some were too difficult for me, some were slow and boring, and others were made for keyboards while I play with a dance pad), it seemed kind of silly to have them in my song library slowing down my load time. However, separating out these songs was a task I felt was better automated than done manually.
Recently a user of said tool sent me a request for some additional features, and I thought I'd revisit it to see if I could do better. I've uploaded an in-development screenshot here so that you can get an idea of the current state of things, although the GUI is still very much subject to change as features are added and I have to figure out how to make them all play well together.
Current Workflow:
The current functionality is that you run the program, point it to your StepMania "songs" directory (or a specific song pack directory, or a specific song directory) and hit the "Parse" button in the upper right. This will scan the selected folder for song information and create the grid seen on the right. As this scan is going on, the "Parse/Filter Output" section on the bottom left provides feedback on what it's doing and where it is in the process (for instance "song pack 5 of 100" and "song 3 of 12" [of songs in the song pack]). If the scan is taking too long, you can also cancel it by clicking the "Parse" button a second time (it's text will change to "Cancel" while parsing).
When the scan is complete (or cancelled) a binary file is created in the selected directory which houses all of the information found in the scan. The application will use this in future scans, speeding things up. This allows you to resume scans at a later time, or scan for newly added songs, and not have to do a lengthy re-scan every time you want to use the program.
Once songs have been identified you can define filters for moving songs out of the library using the "Filters" and "Filter Options" on the left, and then hitting the "Apply Filters" button. Again, feedback on the progress will appear in the "Parse/Filter Output" section. Songs that are flagged by the filters will be moved out of the "songs" directory (where StepMania will no longer be able to see them) and into a folder with the name shown in the filter ("_DUPLICATE", "_NONPAD", etc.).
The checkboxes on the right under the filter columns indicate whether the song is located in the filtered folder or the regular songs folder. Checking or unchecking this checkbox will move the folder.
The current filters are:
Features I'm currently investigating/implementing:
The following are the things I currently have plans to work on or at least investigate:
What I want from the community:
If any of you feel that this tool, or something that I could conceivably add to it, might be useful to you, I would love to hear your thoughts on what I could do or change to make it more useful to you. I can't guarantee I'll be able to add everything, and I'm not even sure when I'll be able to release it since I don't have a ton of time to work on it, but any and all feedback is welcome.
submitted by echo404 to Stepmania [link] [comments]

Just want to share my OpenGL / GLFW / Glad project CMakeLists.txt file.

As a pandemic side project, I recently started learning OpenGL in C++.
I haven't programmed in C++ since college and, having coming back to it after programming in other languages (mostly Golang, Python, and JavaScript), C++'s dependency management is... painful.
CMake seems great once you get it working, but it is definitely hard to get going. There seems to be multiple ways of solving the same problem and no clear guide on what features should be used in 2020 and what should be discarded.
There also doesn't seem to be a canonical way to ensure your code dependencies are pinned to particular versions. There are a few projects like Buckaroo or Conan, but they don't seem mature or come with complicated caveats. I am using a combination of Linux package management and git submodules in this project, as that seemed to be the simplest.
In addition to that the open source community seems to have adopted different CMake styles (or different rates of adopting "best practices" and modern features) which make working with lots of different dependencies a pain.
Anyways, after spending the past three days painfully trying to write my CMakeLists.txt file by hand for my exact use case I finally have my code compiling. I thought I'd post my code here in case it proves useful for future google searchers.
Critiques / suggestions greatly appreciated.
My repository layout:
. ├── CMakeLists.txt ├── └── videogame ├── shader │ └── vertex.shader ├── src │ ├── main.cpp │ ├── renderer.cpp │ ├── renderer.hpp │ ├── shader.cpp │ └── shader.hpp └── vendor └── glad 
My CMakeLists.txt file:
cmake_minimum_required(VERSION 3.17) project(videogame VERSION 20.10.0 LANGUAGES CXX C) # Variables set(VENDOR_DIR "${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}/vendor") set(SRC_DIR "${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}/src") set(SHADER_DIR "${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}/shader") # OpenGL Flags set(OpenGL_GL_PREFERENCE GLVND) # GLFW - Installed via: sudo dnf install -y glfw-devel option(GLFW_BUILD_DOCS OFF) option(GLFW_BUILD_EXAMPLES OFF) option(GLFW_BUILD_TESTS OFF) option(GLFW_INSTALL OFF) find_package(glfw3 REQUIRED) # Glad - Installed via: git submodule add [email protected]:Dav1dde/glad.git videogame/vendoglad add_library(glad STATIC ${VENDOR_DIR}/glad/src/glad.c ) target_include_directories(glad PRIVATE ${VENDOR_DIR}/glad/include ) # Project add_executable(${PROJECT_NAME}) target_include_directories(${PROJECT_NAME} PRIVATE ${VENDOR_DIR}/glad/include ) target_sources(${PROJECT_NAME} PRIVATE ${SRC_DIR}/main.cpp ${SRC_DIR}/renderer.hpp ${SRC_DIR}/renderer.cpp ${SRC_DIR}/shader.hpp ${SRC_DIR}/shader.cpp ) target_link_libraries(${PROJECT_NAME} PRIVATE glfw glad ${CMAKE_DL_LIBS} # Needed for glad - ) set_target_properties(${PROJECT_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${PROJECT_NAME} COMPILE_OPTIONS -Werror CXX_STANDARD 20 CXX_STANDARD_REQUIRED ON CXX_EXTENSIONS OFF ) 
Shout out to the Glitter repo for serving as a great launching point.
Edit: spelling
submitted by Shonucic to opengl [link] [comments]

Red Hat OpenShift Container Platform Instruction Manual for Windows Powershell

Introduction to the manual
This manual is made to guide you step by step in setting up an OpenShift cloud environment on your own device. It will tell you what needs to be done, when it needs to be done, what you will be doing and why you will be doing it, all in one convenient manual that is made for Windows users. Although if you'd want to try it on Linux or MacOS we did add the commands necesary to get the CodeReady Containers to run on your operating system. Be warned however there are some system requirements that are necessary to run the CodeReady Containers that we will be using. These requirements are specified within chapter Minimum system requirements.
This manual is written for everyone with an interest in the Red Hat OpenShift Container Platform and has at least a basic understanding of the command line within PowerShell on Windows. Even though it is possible to use most of the manual for Linux or MacOS we will focus on how to do this within Windows.
If you follow this manual you will be able to do the following items by yourself:
● Installing the CodeReady Containers
● Updating OpenShift
● Configuring a CodeReady Container
● Configuring the DNS
● Accessing the OpenShift cluster
● Deploying the Mediawiki application
What is the OpenShift Container platform?
Red Hat OpenShift is a cloud development Platform as a Service (PaaS). It enables developers to develop and deploy their applications on a cloud infrastructure. It is based on the Kubernetes platform and is widely used by developers and IT operations worldwide. The OpenShift Container platform makes use of CodeReady Containers. CodeReady Containers are pre-configured containers that can be used for developing and testing purposes. There are also CodeReady Workspaces, these workspaces are used to provide any member of the development or IT team with a consistent, secure, and zero-configuration development environment.
The OpenShift Container Platform is widely used because it helps the programmers and developers make their application faster because of CodeReady Containers and CodeReady Workspaces and it also allows them to test their application in the same environment. One of the advantages provided by OpenShift is the efficient container orchestration. This allows for faster container provisioning, deploying and management. It does this by streamlining and automating the automation process.
What knowledge is required or recommended to proceed with the installation?
To be able to follow this manual some knowledge is mandatory, because most of the commands are done within the Command Line interface it is necessary to know how it works and how you can browse through files/folders. If you either don’t have this basic knowledge or have trouble with the basic Command Line Interface commands from PowerShell, then a cheat sheet might offer some help. We recommend the following cheat sheet for windows:
Another option is to read through the operating system’s documentation or introduction guides. Though the documentation can be overwhelming by the sheer amount of commands.
Aside from the required knowledge there are also some things that can be helpful to know just to make the use of OpenShift a bit simpler. This consists of some general knowledge on PaaS like Dockers and Kubernetes.

System requirements

Minimum System requirements

The minimum system requirements for the Red Hat OpenShift CodeReady Containers has the following minimum hardware:
Hardware requirements
Code Ready Containers requires the following system resources:
● 4 virtual CPU’s
● 9 GB of free random-access memory
● 35 GB of storage space
● Physical CPU with Hyper-V (intel) or SVM mode (AMD) this has to be enabled in the bios
Software requirements
The minimum system requirements for the Red Hat OpenShift CodeReady Containers has the following minimum operating system requirements:
Microsoft Windows
On Microsoft Windows, the Red Hat OpenShift CodeReady Containers requires the Windows 10 Pro Fall Creators Update (version 1709) or newer. CodeReady Containers does not work on earlier versions or other editions of Microsoft Windows. Microsoft Windows 10 Home Edition is not supported.
On macOS, the Red Hat OpenShift CodeReady Containers requires macOS 10.12 Sierra or newer.
On Linux, the Red Hat OpenShift CodeReady Containers is only supported on Red Hat Enterprise Linux/CentOS 7.5 or newer and on the latest two stable Fedora releases.
When using Red Hat Enterprise Linux, the machine running CodeReady Containers must be registered with the Red Hat Customer Portal.
Ubuntu 18.04 LTS or newer and Debian 10 or newer are not officially supported and may require manual set up of the host machine.

Required additional software packages for Linux

The CodeReady Containers on Linux require the libvirt and Network Manager packages to run. Consult the following table to find the command used to install these packages for your Linux distribution:
Table 1.1 Package installation commands by distribution
Linux Distribution Installation command
Fedora Sudo dnf install NetworkManager
Red Hat Enterprise Linux/CentOS Su -c 'yum install NetworkManager'
Debian/Ubuntu Sudo apt install qemu-kvm libvirt-daemonlibvirt-daemon-system network-manage


Getting started with the installation

To install CodeReady Containers a few steps must be undertaken. Because an OpenShift account is necessary to use the application this will be the first step. An account can be made on “”, where you need to press login and after that select the option “Create one now”
After making an account the next step is to download the latest release of CodeReady Containers and the pulled secret on “”. Make sure to download the version corresponding to your platform and/or operating system. After downloading the right version, the contents have to be extracted from the archive to a location in your $PATH. The pulled secret should be saved because it is needed later.
The command line interface has to be opened before we can continue with the installation. For windows we will use PowerShell. All the commands we use during the installation procedure of this guide are going to be done in this command line interface unless stated otherwise. To be able to run the commands within the command line interface, use the command line interface to go to the location in your $PATH where you extracted the CodeReady zip.
If you have installed an outdated version and you wish to update, then you can delete the existing CodeReady Containers virtual machine with the $crc delete command. After deleting the container, you must replace the old crc binary with a newly downloaded binary of the latest release.
C:\Users\[username]\$PATH>crc delete 
When you have done the previous steps please confirm that the correct and up to date crc binary is in use by checking it with the $crc version command, this should provide you with the version that is currently installed.
C:\Users\[username]\$PATH>crc version 
To set up the host operating system for the CodeReady Containers virtual machine you have to run the $crc setup command. After running crc setup, crc start will create a minimal OpenShift 4 cluster in the folder where the executable is located.
C:\Users\[username]>crc setup 

Setting up CodeReady Containers

Now we need to set up the new CodeReady Containers release with the $crc setup command. This command will perform the operations necessary to run the CodeReady Containers and create the ~/.crc directory if it did not previously exist. In the process you have to supply your pulled secret, once this process is completed you have to reboot your system. When the system has restarted you can start the new CodeReady Containers virtual machine with the $crc start command. The $crc start command starts the CodeReady virtual machine and OpenShift cluster.
You cannot change the configuration of an existing CodeReady Containers virtual machine. So if you have a CodeReady Containers virtual machine and you want to make configuration changes you need to delete the virtual machine with the $crc delete command and create a new virtual machine and start that one with the configuration changes. Take note that deleting the virtual machine will also delete the data stored in the CodeReady Containers. So, to prevent data loss we recommend you save the data you wish to keep. Also keep in mind that it is not necessary to change the default configuration to start OpenShift.
C:\Users\[username]\$PATH>crc setup 
Before starting the machine, you need to keep in mind that it is not possible to make any changes to the virtual machine. For this tutorial however it is not necessary to change the configuration, if you don’t want to make any changes please continue by starting the machine with the crc start command.
C:\Users\[username]\$PATH>crc start 
\ it is possible that you will get a Nameserver error later on, if this is the case please start it with* crc start -n


It is not is not necessary to change the default configuration and continue with this tutorial, this chapter is here for those that wish to do so and know what they are doing. However, for MacOS and Linux it is necessary to change the dns settings.

Configuring the CodeReady Containers

To start the configuration of the CodeReady Containers use the command crc config. This command allows you to configure the crc binary and the CodeReady virtual machine. The command has some requirements before it’s able to configure. This requirement is a subcommand, the available subcommands for this binary and virtual machine are:
get, this command allows you to see the values of a configurable property
set/unset, this command can be used for 2 things. To display the names of, or to set and/or unset values of several options and parameters. These parameters being:
○ Shell options
○ Shell attributes
○ Positional parameters
view, this command starts the configuration in read-only mode.
These commands need to operate on named configurable properties. To list all the available properties, you can run the command $crc config --help.
Throughout this manual we will use the $crc config command a few times to change some properties needed for the configuration.
There is also the possibility to use the crc config command to configure the behavior of the checks that’s done by the $crc start end $crc setup commands. By default, the startup checks will stop with the process if their conditions are not met. To bypass this potential issue, you can set the value of a property that starts with skip-check or warn-check to true to skip the check or warning instead of ending up with an error.
C:\Users\[username]\$PATH>crc config get C:\Users\[username]\$PATH>crc config set C:\Users\[username]\$PATH>crc config unset C:\Users\[username]\$PATH>crc config view C:\Users\[username]\$PATH>crc config --help 

Configuring the Virtual Machine

You can use the CPUs and memory properties to configure the default number of vCPU’s and amount of memory available for the virtual machine.
To increase the number of vCPU’s available to the virtual machine use the $crc config set CPUs . Keep in mind that the default number for the CPU’s is 4 and the number of vCPU’s you wish to assign must be equal or greater than the default value.
To increase the memory available to the virtual machine, use the $crc config set memory . Keep in mind that the default number for the memory is 9216 Mebibytes and the amount of memory you wish to assign must be equal or greater than the default value.
C:\Users\[username]\$PATH>crc config set CPUs  C:\Users\[username]\$PATH>crc config set memory > 

Configuring the DNS

Window / General DNS setup

There are two domain names used by the OpenShift cluster that are managed by the CodeReady Containers, these are:
crc.testing, this is the domain for the core OpenShift services.
apps-crc.testing, this is the domain used for accessing OpenShift applications that are deployed on the cluster.
Configuring the DNS settings in Windows is done by executing the crc setup. This command automatically adjusts the DNS configuration on the system. When executing crc start additional checks to verify the configuration will be executed.

macOS DNS setup

MacOS expects the following DNS configuration for the CodeReady Containers
● The CodeReady Containers creates a file that instructs the macOS to forward all DNS requests for the testing domain to the CodeReady Containers virtual machine. This file is created at /etc/resolvetesting.
● The oc binary requires the following CodeReady Containers entry to function properly, api.crc.testing adds an entry to /etc/hosts pointing at the VM IPaddress.

Linux DNS setup

CodeReady containers expect a slightly different DNS configuration. CodeReady Container expects the NetworkManager to manage networking. On Linux the NetworkManager uses dnsmasq through a configuration file, namely /etc/NetworkManageconf.d/crc-nm-dnsmasq.conf.
To set it up properly the dnsmasq instance has to forward the requests for crc.testing and apps-crc.testing domains to “”. In the /etc/NetworkManageconf.d/crc-nm-dnsmasq.conf this will look like the following:
● Server=/crc. Testing/
● Server=/apps-crc. Testing/

Accessing the Openshift Cluster

Accessing the Openshift web console

To gain access to the OpenShift cluster running in the CodeReady virtual machine you need to make sure that the virtual machine is running before continuing with this chapter. The OpenShift clusters can be accessed through the OpenShift web console or the client binary(oc).
First you need to execute the $crc console command, this command will open your web browser and direct a tab to the web console. After that, you need to select the htpasswd_provider option in the OpenShift web console and log in as a developer user with the output provided by the crc start command.
It is also possible to view the password for kubeadmin and developer users by running the $crc console --credentials command. While you can access the cluster through the kubeadmin and developer users, it should be noted that the kubeadmin user should only be used for administrative tasks such as user management and the developer user for creating projects or OpenShift applications and the deployment of these applications.
C:\Users\[username]\$PATH>crc console C:\Users\[username]\$PATH>crc console --credentials 

Accessing the OpenShift cluster with oc

To gain access to the OpenShift cluster with the use of the oc command you need to complete several steps.
Step 1.
Execute the $crc oc-env command to print the command needed to add the cached oc binary to your PATH:
C:\Users\[username]\$PATH>crc oc-env 
Step 2.
Execute the printed command. The output will look something like the following:
PS C:\Users\OpenShift> crc oc-env $Env:PATH = "CC:\Users\OpenShift\.crc\bin\oc;$Env:PATH" # Run this command to configure your shell: # & crc oc-env | Invoke-Expression 
This means we have to execute* the command that the output gives us, in this case that is:
C:\Users\[username]\$PATH>crc oc-env | Invoke-Expression 
\this has to be executed every time you start; a solution is to move the oc binary to the same path as the crc binary*
To test if this step went correctly execute the following command, if it returns without errors oc is set up properly
Step 3
Now you need to login as a developer user, this can be done using the following command:
$oc login -u developer https://api.crc.testing:6443
Keep in mind that the $crc start will provide you with the password that is needed to login with the developer user.
C:\Users\[username]\$PATH>oc login -u developer https://api.crc.testing:6443 
Step 4
The oc can now be used to interact with your OpenShift cluster. If you for instance want to verify if the OpenShift cluster Operators are available, you can execute the command
$oc get co 
Keep in mind that by default the CodeReady Containers disables the functions provided by the commands $machine-config and $monitoringOperators.
C:\Users\[username]\$PATH>oc get co 


Now that you are able to access the cluster, we will take you on a tour through some of the possibilities within OpenShift Container Platform.
We will start by creating a project. Within this project we will import an image, and with this image we are going to build an application. After building the application we will explain how upscaling and downscaling can be used within the created application.
As the next step we will show the user how to make changes in the network route. We also show how monitoring can be used within the platform, however within the current version of CodeReady Containers this has been disabled.
Lastly, we will show the user how to use user management within the platform.

Creating a project

To be able to create a project within the console you have to login on the cluster. If you have not yet done this, this can be done by running the command crc console in the command line and logging in with the login data from before.
When you are logged in as admin, switch to Developer. If you're logged in as a developer, you don't have to switch. Switching between users can be done with the dropdown menu top left.
Now that you are properly logged in press the dropdown menu shown in the image below, from there click on create a project.
When you press the correct button, the following image will pop up. Here you can give your project a name and description. We chose to name it CodeReady with a displayname CodeReady Container.

Importing image

The Containers in OpenShift Container Platform are based on OCI or Docker formatted images. An image is a binary that contains everything needed to run a container as well as the metadata of the requirements needed for the container.
Within the OpenShift Container Platform it’s possible to obtain images in a number of ways. There is an integrated Docker registry that offers the possibility to download new images “on the fly”. In addition, OpenShift Container Platform can use third party registries such as:
- Https://
- Https://
Within this manual we are going to import an image from the Red Hat container catalog. In this example we’ll be using MediaWiki.
Search for the application in
Navigate to “Get this image”
Follow the steps to “create a registry service account”, after that you can copy the YAML.
After the YAML has been copied we will go to the topology view and click on the YAML button
Then we have to paste in the YAML, put in the name, namespace and your pull secret name (which you created through your registry account) and click on create.
Run the import command within powershell
$oc import-image openshift4/mediawiki --confirm imported 

Creating and managing an application

There are a few ways to create and manage applications. Within this demonstration we’ll show how to create an application from the previously imported image.

Creating the application

To create an image with the previously imported image go back to the console and topology. From here on select container image.
For the option image you'll want to select the “image stream tag from internal registry” option. Give the application a name and then create the deployment.
If everything went right during the creating process you should see the following, this means that the application is successfully running.

Scaling the application

In OpenShift there is a feature called autoscaling. There are two types of application scaling, namely vertical scaling, and horizontal scaling. Vertical scaling is adding only more CPU and hard disk and is no longer supported by OpenShift. Horizontal scaling is increasing the number of machines.
One of the ways to scale an application is by increasing the number of pods. This can be done by going to a pod within the view as seen in the previous step. By either pressing the up or down arrow more pods of the same application can be added. This is similar to horizontal scaling and can result in better performance when there are a lot of active users at the same time.
In the picture above we see the number of nodes and pods and how many resources those nodes and pods are using. This is something to keep in mind if you want to scale up your application, the more you scale it up, the more resources it will take up.


Since OpenShift Container platform is built on Kubernetes it might be interesting to know some theory about its networking. Kubernetes, on which the OpenShift Container platform is built, ensures that the Pods within OpenShift can communicate with each other via the network and assigns them their own IP address. This makes all containers within the Pod behave as if they were on the same host. By giving each pod its own IP address, pods can be treated as physical hosts or virtual machines in terms of port mapping, networking, naming, service discovery, load balancing, application configuration and migration. To run multiple services such as front-end and back-end services, OpenShift Container Platform has a built-in DNS.
One of the changes that can be made to the networking of a Pod is the Route. We’ll show you how this can be done in this demonstration.
The Route is not the only thing that can be changed and or configured. Two other options that might be interesting but will not be demonstrated in this manual are:
- Ingress controller, Within OpenShift it is possible to set your own certificate. A user must have a certificate / key pair in PEM-encoded files, with the certificate signed by a trusted authority.
- Network policies, by default all pods in a project are accessible from other pods and network locations. To isolate one or more pods in a project, it is possible to create Network Policy objects in that project to indicate the allowed incoming connections. Project administrators can create and delete Network Policy objects within their own project.
There is a search function within the Container Platform. We’ll use this to search for the network routes and show how to add a new route.
You can add items that you use a lot to the navigation
For this example, we will add Routes to navigation.
Now that we’ve added Routes to the navigation, we can start the creation of the Route by clicking on “Create route”.
Fill in the name, select the service and the target port from the drop-down menu and click on Create.
As you can see, we’ve successfully added the new route to our application.
OpenShift makes use of Persistent Storage, this type of storage uses persistent volume claims(PVC). PVC’s allow the developer to make persistent volumes without needing any knowledge about the underlying infrastructure.
Within this storage there are a few configuration options:
It is however important to know how to manually reclaim the persistent volumes, since if you delete PV the associated data will not be automatically deleted with it and therefore you cannot reassign the storage to another PV yet.
To manually reclaim the PV, you need to follow the following steps:
Step 1: Delete the PV, this can be done by executing the following command
$oc delete  
Step 2: Now you need to clean up the data on the associated storage asset
Step 3: Now you can delete the associated storage asset or if you with to reuse the same storage asset you can now create a PV with the storage asset definition.
It is also possible to directly change the reclaim policy within OpenShift, to do this you would need to follow the following steps:
Step 1: Get a list of the PVs in your cluster
$oc get pv 
This will give you a list of all the PV’s in your cluster and will display their following attributes: Name, Capacity, Accesmodes, Reclaimpolicy, Statusclaim, Storageclass, Reason and Age.
Step 2: Now choose the PV you wish to change and execute one of the following command’s, depending on your preferred policy:
$oc patch pv  -p '{"spec":{"persistentVolumeReclaimPolicy":"Retain"}}' 
In this example the reclaim policy will be changed to Retain.
$oc patch pv  -p '{"spec":{"persistentVolumeReclaimPolicy":"Recycle"}}' 
In this example the reclaim policy will be changed to Recycle.
$oc patch pv  -p '{"spec":{"persistentVolumeReclaimPolicy":"Delete"}}' 
In this example the reclaim policy will be changed to Delete.

Step 3: After this you can check the PV to verify the change by executing this command again:
$oc get pv 


Within Red Hat OpenShift there is the possibility to monitor the data that has been created by your containers, applications, and pods. To do so, click on the menu option in the top left corner. Check if you are logged in as Developer and click on “Monitoring”. Normally this function is not activated within the CodeReady containers, because it uses a lot of resources (Ram and CPU) to run.
Once you have activated “Monitoring” you can change the “Time Range” and “Refresh Interval” in the top right corner of your screen. This will change the monitoring data on your screen.
Within this function you can also monitor “Events”. These events are records of important information and are useful for monitoring and troubleshooting within the OpenShift Container Platform.

User management

According to the documentation of OpenShift is a user, an entity that interacts with the OpenShift Container Platform API. These can be a developer for developing applications or an administrator for managing the cluster. Users can be assigned to groups, which set the permissions applied to all the group’s members. For example, you can give API access to a group, which gives all members of the group API access.
There are multiple ways to create a user depending on the configured identity provider. The DenyAll identity provider is the default within OpenShift Container Platform. This default denies access for all the usernames and passwords.
First, we’re going to create a new user, the way this is done depends on the identity provider, this depends on the mapping method used as part of the identity provider configuration.
for more information on what mapping methods are and how they function:
With the default mapping method, the steps will be as following
$oc create user  
Next up, we’ll create an OpenShift Container Platform Identity. Use the name of the identity provider and the name that uniquely represents this identity in the scope of the identity provider:
$oc create identity : 
The is the name of the identity provider in the master configuration. For example, the following commands create an Identity with identity provider ldap_provider and the identity provider username mediawiki_s.
$oc create identity ldap_provider:mediawiki_s 
Create a useidentity mapping for the created user and identity:
$oc create useridentitymapping :  
For example, the following command maps the identity to the user:
$oc create useridentitymapping ldap_provider:mediawiki_s mediawiki 
Now were going to assign a role to this new user, this can be done by executing the following command:
$oc create clusterrolebinding  \ --clusterrole= --user= 
There is a --clusterrole option that can be used to give the user a specific role, like a cluster user with admin privileges. The cluster admin has access to all files and is able to manage the access level of other users.
Below is an example of the admin clusterrole command:
$oc create clusterrolebinding registry-controller \ --clusterrole=cluster-admin --user=admin 

What did you achieve?

If you followed all the steps within this manual you now should have a functioning Mediawiki Application running on your own CodeReady Containers. During the installation of this application on CodeReady Containers you have learned how to do the following things:
● Installing the CodeReady Containers
● Updating OpenShift
● Configuring a CodeReady Container
● Configuring the DNS
● Accessing the OpenShift cluster
● Deploying an application
● Creating new users
With these skills you’ll be able to set up your own Container Platform environment and host applications of your choosing.


There is the possibility that your CodeReady container can't connect to the internet due to a Nameserver error. When this is encountered a working fix for us was to stop the machine and then start the CRC machine with the following command:
C:\Users\[username]\$PATH>crc start -n 
Hyper-V admin
Should you run into a problem with Hyper-V it might be because your user is not an admin and therefore can’t access the Hyper-V admin user group.
  1. Click Start > Control Panel > Administration Tools > Computer Management. The Computer Management window opens.
  2. Click System Tools > Local Users and Groups > Groups. The list of groups opens.
  3. Double-click the Hyper-V Administrators group. The Hyper-V Administrators Properties window opens.
  4. Click Add. The Select Users or Groups window opens.
  5. In the Enter the object names to select field, enter the user account name to whom you want to assign permissions, and then click OK.
  6. Click Apply, and then click OK.

Terms and definitions

These terms and definitions will be expanded upon, below you can see an example of how this is going to look like together with a few terms that will require definitions.
Kubernetes is an open-source system for automating deployment, scaling, and management of containerized applications. Openshift is based on Kubernetes.
Clusters are a collection of multiple nodes which communicate with each other to perform a set of operations.
Containers are the basic units of OpenShift applications. These container technologies are lightweight mechanisms for isolating running processes so that they are limited to interacting with only their designated resources.
CodeReady Container is a minimal, preconfigured cluster that is used for development and testing purposes.
CodeReady Workspaces uses Kubernetes and containers to provide any member of the development or IT team with a consistent, secure, and zero-configuration development environment.


submitted by Groep6HHS to openshift [link] [comments]

Binary options - YouTube Best 5 Minutes Binary Options Strategy 2020 - The BLW 5 ... Binary Options - YouTube

The table below is a blacklist consisting of Binary Options brokers who have scammed those who made complaints on Broker Complaint Registry. If you would like to report abuse by any of these brokers please click on the name of the broker in the table and you will be directed to their complaint page. There, you can fill out the form and one of our representatives will get back to you. Search ... 20 Best Binary Options Brokers 2020: This is a review of some of the best binary options brokers. The review is essentially a binary options brokers list 2020. The review will give you a deeper understanding of how they operate. The review seeks to arm you with relevant information before you get involved with binary options. Binary Options Scam Brokers List: As we know that the scams will never end, so that is why it is important to stay alerted from this bogus systems whenever you would come across. Here are some of the Binary Options Scam brokers Lists that one must avoid. The binary code is represented by the number as well as alphanumeric letter. Advantages of Binary Code. Following is the list of advantages that binary code offers. Binary codes are suitable for the computer applications. Binary codes are suitable for the digital communications. Binary codes make the analysis and designing of digital circuits if we use the binary codes. Since only 0 & 1 are ... Binary Options Brokers List 2020. Search Brokers. The word “broker” comes up in about any binary options conversation and that’s because you cannot trade binaries without using one. If you are new to all of this, then you’re probably wondering what brokers are; so here’s the quick rundown: they are the intermediary between the trader and the financial market, so when you want to open ... The US Binary options brokers list above, is tailored to display only brokers that accept US clients. Nadex and CBOE remain the only regulated exchanges however. The Nadex offering delivers binary options that mimic futures contracts more familiar to US pattern day traders. Binary options trading in the USA . Most binary options brokers operate accounts in USD. This is seen as the ‘global ... Binary options allow you to trade on a wide range of underlying markets. One of the advantages of trading binary options is that you are not buying or selling an actual asset, only a contract that determines how that asset performs over a period of time. This limits your risk and makes it easy for anyone to start trading. Available markets. Forex. Major pairs, minor pairs, and Smart FX indices ... DBot Free Binary Options Bot – Click Here to Open an Account! Automated your trading ideas without cost and without writing code; Trade Binary Options and/or Forex using the same login details; Low Minimum Deposit – 5$ Small Minimum Trade Size – 0,35$ for Binary Options & 0.01 Lot for Forex We named it Binary Options Horror Story because that is exactly what it is in all its gory details. If you are new to binary options read, and absorb the above warning signs fully to see how they scammed people out of their money so it does not happen to you. Notice also how the worked with the brokers directly, which implies that they can be directly involved as well. Trading binary options may not be suitable for everyone. Trading CFDs carries a high level of risk since leverage can work both to your advantage and disadvantage. As a result, the products offered on this website may not be suitable for all investors because of the risk of losing all of your invested capital. You should never invest money that you cannot afford to lose, and never trade with ...

[index] [23679] [26557] [22272] [18641] [12439] [21532] [20168] [3940] [19742] [996]

Binary options - YouTube

💰💲FULL BEGINNER? Join My PERSONAL TRAINING!💴💵 BLW Trading Academy: 💲💹Official FREE Telegram Group: ... Binary options trading Binary options signals Hi there! I'm Lady Trader and today I'll show you my binary options strategy 2020 that I use in binary tradin... How to trade binary options successfully using FX Master Code trading signals. Can you really make money with binary options? Well, if you manage risk and trade a binary options trading strategy ... Enjoy the videos and music you love, upload original content, and share it all with friends, family, and the world on YouTube. Sign in now to see your channels and recommendations! Sign in. Watch Queue Queue. Watch Queue Queue. Remove all; Disconnect For the Love of Physics - Walter Lewin - May 16, 2011 - Duration: 1:01:26. Lectures by Walter Lewin. They will make you ♥ Physics. Recommended for you Binary Options Trading System: How To Turn $7 Into $2,300 Every Day With Best Binary Options Broker . by Dog Lovers