Sunday, December 6, 2020

Note: Functional Interfaces in Java

 (source: Java SE 8 for the Really Impatient: Programming with Lambdas - 3.3. Choosing a Functional Interface)

Common Functional Interfaces

Functional Interface

Parameter Types

Return Type

Abstract Method Name

Description

Other Methods

Runnable

none

void

run

Runs an action without arguments or return value

Supplier<T>

none

T

get

Supplies a value of type T

Consumer<T>

T

void

accept

Consumes a value of type T

chain

BiConsumer<T, U>

T, U

void

accept

Consumes values of types T and U

chain

Function<T, R>

T

R

apply

A function with argument of type T

compose, andThen, identity

BiFunction<T, U, R>

T, U

R

apply

A function with arguments of types T and U

andThen

UnaryOperator<T>

T

T

apply

A unary operator on the type T

compose, andThen, identity

BinaryOperator<T>

T, T

T

apply

A binary operator on the type T

andThen

Predicate<T>

T

boolean

test

A Boolean-valued function

and, or, negate, isEqual

BiPredicate<T, U>

T, U

boolean

test

A Boolean-valued function with two arguments

and, or, negate

Functional Interfaces for Primitive Types

p, q is int, long, double; P, Q is Int, Long, Double

Functional Interface

Parameter Types

Return Type

Abstract Method Name

BooleanSupplier

none

boolean

getAsBoolean

PSupplier

none

p

getAsP

PConsumer

p

void

accept

ObjPConsumer<T>

T, p

void

accept

PFunction<T>

p

T

apply

PToQFunction

p

q

applyAsQ

ToPFunction<T>

T

p

applyAsP

ToPBiFunction<T, U>

T, U

p

applyAsP

PUnaryOperator

p

p

applyAsP

PBinaryOperator

p, p

p

applyAsP

PPredicate

p

boolean

test

Friday, May 8, 2020

How to update a fork from the original repository

(source)
(more info)

1. [preparation] Clone your fork to have a local copy:
git clone git@github.com:YOUR-USERNAME/YOUR-FORKED-REPO.git
2. [preparation] Add remote from original repository in your forked repository:
cd into/cloned/fork-repo
git remote add upstream git://github.com/ORIGINAL-DEV-USERNAME/REPO-YOU-FORKED-FROM.git
git fetch upstream
3. [routine] Update your (local) fork from original repo:
git pull upstream master
4. [routine] Update your fork's remote:
git push origin master

Wednesday, December 4, 2019

Sunday, August 11, 2019

Idea: Search for .gitconfig in parent folders until found

I manage multiple git remote accounts on a single machine and each has a different user name and user email associated with it.

Forgetting to set the name and email in a newly pulled repo has caused me trouble quite a lot.

It would be so nice, if I could just have one .gitconfig file sitting in each folder that I use to store the repos associated with a single account, and git would just read the nearest config it finds.

Sunday, July 28, 2019

Getting started with Ruby (on Rails)

Ruby language basics

  • Ruby in 20 minutes
    •  the Ruby REPL is irb
    • expressions in a string are escaped with "#{expression}"
    • print function is puts
    • functions are defined like:
      def myfun(somearg = "default")
        # do something with somearg
      end
      • arguments can have default value
      • functions can be called like:
        myfun
        myfun()
        myfun "some other arg"
        myfun("some other arg")
    • classes are defined like:
      class MyClass
        attr_accessor :somearg
        def initialize(somearg = "default")
          @somearg = somearg
        end
        # do something with @somearg anywhere in the class
      end
      • class instantiation is done with the "new" keyword:
        myclass = MyClass.new("some other arg")
      • the instance variable @somearg is private
      • the methods defined in the class are public by default
      • the attribute accessor :somearg allows to get and set the instance variable (public). Usage: myclass.somearg and myclass.somearg= "something new"
    • information about a class can be retrieved with MyClass.instance_methods(show_inherited = true)
    • iterations
      • for each loop
        @names.each do |name|
          puts "Hello #{name}!"
        end
    • conditionals
      • if-else block
        def say_bye
          if @names.nil?
            puts "..."
          elsif @names.respond_to?("join")
            # Join the list elements with commas
            puts "Goodbye #{@names.join(", ")}.  Come back soon!"
          else
            puts "Goodbye #{@names}.  Come back soon!"
          end
        end
Some additional info:

Ruby on Rails basics

rspec testing framework basics

...coming up...
in the meantime here are some resources:


My IDE choice

Monday, July 1, 2019

Developing Gitlab: Setting up a development environment with Vagrant

FYI, I abandoned the Vagrant approach in favor of a VirtualBox machine with Ubuntu.

---
Versions in use:
  • Vagrant 2.2.4
  • VirtualBox 6.0.8-130520
  • gitlab-development-kit revision e519656ac3101770622d9451f500a6c2a08c5250

Set up GDK for the first time

  1. open a CMD with "Run as Administrator" (aka. "elevated") in the gitlab-development-kit directory
  2. follow instructions for Vagrant installation:
    vagrant up --provider=virtualbox --provision

    Troubleshooting
  3. when ready:
    vagrant ssh
  4. cd gitlab-development-kit
  5. follow instructions from gdk install: Option 1 develop in fork
    gdk install gitlab_repo=https://gitlab.com/MY-FORK/gitlab-ce.git

    Troubleshooting
    • fix line endings (because the repo was cloned on a Windows host with windows line endings, but is used on linux)
      1. set the git line endings to retrieve any updates unix style for the gdk repo
        git config core.autocrlf input
      2. install dos2unix on the virtual machine
        sudo apt-get install dos2unix
      3. change the line endings in the support and bin directories
        cd support
        find ./ -type f -exec dos2unix {} \;
        cd ..
        cd bin
        find ./ -type f -exec dos2unix {} \;
        cd ..
  6. Set up tracking of original upstream repo
    support/set-gitlab-upstream
  7. run the server
    gdk run

    Troubleshooting
    • if the run command fails, stop node manually before trying again
      pkill -f node
      gdk run
      
  8. reach it from the Host on localhost:3000 and use the given credentials

Everyday commands

  • vagrant up: starts the virtual machine
  • vagrant ssh: connects the virtual machine
  • cd gitlab-development-kit
  • gdk run: starts the server
  • Ctrl+C: exits the server
  • Ctrl+D: exits the virtual machine
  • vagrant halt: stops the virtual machine
  • How to put a process into background

Restart the whole thing because something went amiss

  • clean your git repos from untracked and ignored files and directories
    • use git clean -ndx to see what would be deleted
    • use git clean -fdx to actually do the deletion
    • don't worry, repositories within a repository are not cleaned by git clean.
      there are 3 repositories in gitlab-development-kit:
      • gitlab-development-kit/gitlab
      • gitlab-development-kit/gitlab-workhorse/src/gitlab.com/gitlab-org/gitlab-workhorse
      • gitlab-development-kit/go-gitlab-shell/src/gitlab.com/gitlab-org/gitlab-shell
    • delete these directories too:
      • gitlab-development-kit/gitlab-workhorse/src
      • gitlab-development-kit/go-gitlab-shell
  • do the "Set up GDK for the first time" part again

Thursday, January 31, 2019

Updating from IntelliJ IDEA Community to Ultimate


  1. export settings from Community and import them to Ultimate
    (see https://intellij-support.jetbrains.com/hc/en-us/community/posts/206858965-Import-Settings-from-Community-Edition-into-Professional-Edition)
  2. install any plugin you had in Community that you miss, like:
    1. Lombok plugin
    2. VueJS plugin
      (see https://www.jetbrains.com/help/idea/vue-js.html)
    3. Markdown file previewer
    4. Java dependency analyzer
  3. add sytax highlighting for any non-default files you usually use, like:
    1. Groovy sytax highlighting to Jenkinsfile (Settings > Editor > File types > Groovy > add "Jenkinsfile*" )
      (see https://stackoverflow.com/questions/47796757/jenkinsfile-syntax-highlighting-in-java-project-using-intellij-idea)​