Add Dev Container Configuration Files (#7)
This commit is contained in:
parent
4f7ab0ac1b
commit
931b138bb1
68
.devcontainer/Julia.Dockerfile
Normal file
68
.devcontainer/Julia.Dockerfile
Normal file
@ -0,0 +1,68 @@
|
||||
ARG BUILD_ON_IMAGE=glcr.b-data.ch/julia/base
|
||||
ARG JULIA_VERSION=latest
|
||||
|
||||
FROM ${BUILD_ON_IMAGE}:${JULIA_VERSION} as files
|
||||
|
||||
ARG DEBIAN_FRONTEND=noninteractive
|
||||
|
||||
SHELL ["/bin/bash", "-o", "pipefail", "-c"]
|
||||
|
||||
RUN mkdir /files
|
||||
|
||||
COPY julia-base/conf/user /files
|
||||
COPY julia-base/scripts /files
|
||||
|
||||
## Ensure file modes are correct when using CI
|
||||
## Otherwise set to 777 in the target image
|
||||
RUN find /files -type d -exec chmod 755 {} \; \
|
||||
&& find /files -type f -exec chmod 644 {} \; \
|
||||
&& find /files/usr/local/bin -type f -exec chmod 755 {} \;
|
||||
|
||||
FROM ${BUILD_ON_IMAGE}:${JULIA_VERSION}
|
||||
|
||||
ARG DEBIAN_FRONTEND=noninteractive
|
||||
|
||||
## Update environment
|
||||
ARG USE_ZSH_FOR_ROOT
|
||||
ARG SET_LANG
|
||||
ARG SET_TZ
|
||||
|
||||
ENV LANG=${SET_LANG:-$LANG} \
|
||||
TZ=${SET_TZ:-$TZ} \
|
||||
PARENT_IMAGE_BUILD_DATE=${BUILD_DATE}
|
||||
|
||||
SHELL ["/bin/bash", "-o", "pipefail", "-c"]
|
||||
|
||||
## Change root's shell to ZSH
|
||||
RUN if [ ! -z "$USE_ZSH_FOR_ROOT" ]; then \
|
||||
chsh -s /bin/zsh; \
|
||||
fi \
|
||||
## Update timezone if needed
|
||||
&& if [ "$TZ" != "Etc/UTC" ]; then \
|
||||
echo "Setting TZ to $TZ"; \
|
||||
ln -snf /usr/share/zoneinfo/$TZ /etc/localtime \
|
||||
&& echo $TZ > /etc/timezone; \
|
||||
fi \
|
||||
## Add/Update locale if needed
|
||||
&& if [ "$LANG" != "en_US.UTF-8" ]; then \
|
||||
sed -i "s/# $LANG/$LANG/g" /etc/locale.gen; \
|
||||
locale-gen; \
|
||||
echo "Setting LANG to $LANG"; \
|
||||
update-locale --reset LANG=$LANG; \
|
||||
fi \
|
||||
## Allow updating pre-installed Julia packages
|
||||
## Make sure $JULIA_PATH/local/share/julia/registries/* is deleted
|
||||
&& rm -rf ${JULIA_PATH}/local/share/julia/registries/*
|
||||
|
||||
## Pip: Install to the Python user install directory (1) or not (0)
|
||||
ARG PIP_USER=1
|
||||
|
||||
ENV PIP_USER=${PIP_USER}
|
||||
|
||||
## Copy files as late as possible to avoid cache busting
|
||||
COPY --from=files /files /
|
||||
|
||||
## Reset environment variable BUILD_DATE
|
||||
ARG BUILD_START
|
||||
|
||||
ENV BUILD_DATE=${BUILD_START}
|
70
.devcontainer/devcontainer.json
Normal file
70
.devcontainer/devcontainer.json
Normal file
@ -0,0 +1,70 @@
|
||||
{
|
||||
"name": "Julia base",
|
||||
"build": {
|
||||
"dockerfile": "./Julia.Dockerfile",
|
||||
"context": ".",
|
||||
"args": {
|
||||
"BUILD_ON_IMAGE": "glcr.b-data.ch/julia/base",
|
||||
"JULIA_VERSION": "1.7.3",
|
||||
"USE_ZSH_FOR_ROOT": "unset-to-use-bash",
|
||||
"SET_LANG": "en_US.UTF-8",
|
||||
"SET_TZ": "Etc/UTC"
|
||||
}
|
||||
},
|
||||
|
||||
"postStartCommand": {
|
||||
"julia": "postStartCommand.sh"
|
||||
},
|
||||
|
||||
"features": {
|
||||
"ghcr.io/devcontainers/features/common-utils:2": {
|
||||
"configureZshAsDefaultShell": true,
|
||||
"upgradePackages": false,
|
||||
"username": "vscode",
|
||||
"userUid": "automatic",
|
||||
"userGid": "automatic"
|
||||
},
|
||||
"ghcr.io/devcontainers/features/docker-outside-of-docker:1": {
|
||||
"moby": false
|
||||
},
|
||||
// A comma separated list of packages to install
|
||||
"ghcr.io/rocker-org/devcontainer-features/apt-packages:1": {
|
||||
"packages": ""
|
||||
}
|
||||
},
|
||||
|
||||
"customizations": {
|
||||
"vscode": {
|
||||
"extensions": [
|
||||
"editorconfig.editorconfig",
|
||||
"ms-python.python",
|
||||
"mutantdino.resourcemonitor",
|
||||
"julialang.language-julia",
|
||||
"dbaeumer.vscode-eslint",
|
||||
"esbenp.prettier-vscode",
|
||||
"ms-python.black-formatter",
|
||||
"ms-azuretools.vscode-docker"
|
||||
],
|
||||
"settings": {
|
||||
"julia.enableCrashReporter": false,
|
||||
"julia.enableTelemetry": false,
|
||||
"resmon.show.battery": false,
|
||||
"resmon.show.cpufreq": false
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
// Set 'remoteUser' to 'root' to connect as root instead.
|
||||
"remoteUser": "vscode",
|
||||
|
||||
// "remoteUser": "root",
|
||||
|
||||
// By default,
|
||||
// - Julia starts up with a single thread of execution.
|
||||
// - BLAS/OpenMP will use as many threads as possible.
|
||||
// Set the following environment variables to control the exact number to use.
|
||||
"remoteEnv": {
|
||||
// "JULIA_NUM_THREADS": "1",
|
||||
// "OMP_NUM_THREADS": "1"
|
||||
}
|
||||
}
|
@ -0,0 +1,45 @@
|
||||
println("Executing user-specific startup file (", @__FILE__, ")...")
|
||||
|
||||
# https://github.com/julia-vscode/julia-vscode/issues/3304
|
||||
project = (Base.JLOptions().project != C_NULL ?
|
||||
unsafe_string(Base.JLOptions().project) :
|
||||
get(ENV, "JULIA_PROJECT", nothing))
|
||||
if !isnothing(project)
|
||||
Pkg.activate(; io=devnull)
|
||||
end
|
||||
|
||||
try
|
||||
using Revise
|
||||
println("Revise started")
|
||||
catch e
|
||||
@warn "Error initializing Revise" exception=(e, catch_backtrace())
|
||||
end
|
||||
|
||||
if !isnothing(project) &&
|
||||
# https://github.com/julia-vscode/julia-vscode/issues/3304
|
||||
!startswith(Base.load_path_expand(Base.LOAD_PATH[end]), project)
|
||||
|
||||
if startswith(project, "@")
|
||||
if startswith(project, "@.")
|
||||
if isnothing(Base.current_project())
|
||||
Pkg.activate(joinpath("$(ENV["HOME"])", ".julia",
|
||||
"environments", "v$(VERSION.major).$(VERSION.minor)"))
|
||||
else
|
||||
Pkg.activate(Base.current_project(); io=devnull)
|
||||
end
|
||||
else
|
||||
Pkg.activate(Base.load_path_expand(project); io=devnull)
|
||||
end
|
||||
else
|
||||
Pkg.activate(abspath(expanduser(project)); io=devnull)
|
||||
end
|
||||
else
|
||||
if isfile(joinpath(pwd(), "Project.toml")) &&
|
||||
isfile(joinpath(pwd(), "Manifest.toml"))
|
||||
|
||||
Pkg.activate(pwd())
|
||||
else
|
||||
Pkg.activate(joinpath("$(ENV["HOME"])", ".julia", "environments",
|
||||
"v$(VERSION.major).$(VERSION.minor)"))
|
||||
end
|
||||
end
|
@ -0,0 +1,3 @@
|
||||
if !in(MIME("application/pdf"), IJulia.ijulia_mime_types)
|
||||
IJulia.register_mime(MIME("application/pdf"))
|
||||
end
|
17
.devcontainer/julia-base/scripts/usr/local/bin/postStartCommand.sh
Executable file
17
.devcontainer/julia-base/scripts/usr/local/bin/postStartCommand.sh
Executable file
@ -0,0 +1,17 @@
|
||||
#!/usr/bin/env bash
|
||||
# Copyright (c) 2023 b-data GmbH.
|
||||
# Distributed under the terms of the MIT License.
|
||||
|
||||
set -e
|
||||
|
||||
mkdir -p "${HOME}/.julia/config"
|
||||
|
||||
# Copy user-specific startup files if home directory is bind mounted
|
||||
if [ ! -f "${HOME}/.julia/config/startup_ijulia.jl" ]; then
|
||||
cp -a /etc/skel/.julia/config/startup_ijulia.jl \
|
||||
"${HOME}/.julia/config"
|
||||
fi
|
||||
if [ ! -f "${HOME}/.julia/config/startup.jl" ]; then
|
||||
cp -a /etc/skel/.julia/config/startup.jl \
|
||||
"${HOME}/.julia/config"
|
||||
fi
|
72
.devcontainer/julia-pubtools/devcontainer.json
Normal file
72
.devcontainer/julia-pubtools/devcontainer.json
Normal file
@ -0,0 +1,72 @@
|
||||
{
|
||||
"name": "Julia pubtools",
|
||||
"build": {
|
||||
"dockerfile": "../Julia.Dockerfile",
|
||||
"context": "..",
|
||||
"args": {
|
||||
"BUILD_ON_IMAGE": "glcr.b-data.ch/julia/pubtools",
|
||||
"JULIA_VERSION": "1.7.3",
|
||||
"USE_ZSH_FOR_ROOT": "unset-to-use-bash",
|
||||
"SET_LANG": "en_US.UTF-8",
|
||||
"SET_TZ": "Etc/UTC"
|
||||
}
|
||||
},
|
||||
|
||||
"postStartCommand": {
|
||||
"julia": "postStartCommand.sh"
|
||||
},
|
||||
|
||||
"features": {
|
||||
"ghcr.io/devcontainers/features/common-utils:2": {
|
||||
"configureZshAsDefaultShell": true,
|
||||
"upgradePackages": false,
|
||||
"username": "vscode",
|
||||
"userUid": "automatic",
|
||||
"userGid": "automatic"
|
||||
},
|
||||
"ghcr.io/devcontainers/features/docker-outside-of-docker:1": {
|
||||
"moby": false
|
||||
},
|
||||
// A comma separated list of packages to install
|
||||
"ghcr.io/rocker-org/devcontainer-features/apt-packages:1": {
|
||||
"packages": ""
|
||||
}
|
||||
},
|
||||
|
||||
"customizations": {
|
||||
"vscode": {
|
||||
"extensions": [
|
||||
"editorconfig.editorconfig",
|
||||
"ms-python.python",
|
||||
"mutantdino.resourcemonitor",
|
||||
"julialang.language-julia",
|
||||
"James-Yu.latex-workshop",
|
||||
"quarto.quarto",
|
||||
"dbaeumer.vscode-eslint",
|
||||
"esbenp.prettier-vscode",
|
||||
"ms-python.black-formatter",
|
||||
"ms-azuretools.vscode-docker"
|
||||
],
|
||||
"settings": {
|
||||
"julia.enableCrashReporter": false,
|
||||
"julia.enableTelemetry": false,
|
||||
"resmon.show.battery": false,
|
||||
"resmon.show.cpufreq": false
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
// Set 'remoteUser' to 'root' to connect as root instead.
|
||||
"remoteUser": "vscode",
|
||||
|
||||
// "remoteUser": "root",
|
||||
|
||||
// By default,
|
||||
// - Julia starts up with a single thread of execution.
|
||||
// - BLAS/OpenMP will use as many threads as possible.
|
||||
// Set the following environment variables to control the exact number to use.
|
||||
"remoteEnv": {
|
||||
// "JULIA_NUM_THREADS": "1",
|
||||
// "OMP_NUM_THREADS": "1"
|
||||
}
|
||||
}
|
12
README.md
12
README.md
@ -10,6 +10,7 @@ book that has been written by Bogumił Kamiński and has been published by [Mann
|
||||
* [Setting up your environment](#setting-up-your-environment)
|
||||
* [General instructions](#general-instructions)
|
||||
* [Note for Linux users](#note-for-linux-users)
|
||||
* [Dev Containers](#dev-containers)
|
||||
* [Organization of the code](#organization-of-the-code)
|
||||
* [Running the example codes](#running-the-example-codes)
|
||||
* [Accompanying materials](#accompanying-materials)
|
||||
@ -91,6 +92,17 @@ export PATH="$PATH:/opt/julia-1.7.2/bin"
|
||||
|
||||
line (assuming you have downloaded Julia 1.7.2 and extracted it to `/opt` folder).
|
||||
|
||||
### Dev Containers
|
||||
|
||||
Folder `/.devcontainer` contains configuration files for
|
||||
[Dev Containers](https://containers.dev).
|
||||
|
||||
* For use with Github Codespaces, please follow the instruction at
|
||||
[Creating a codespace for a repository](https://docs.github.com/en/codespaces/developing-in-codespaces/creating-a-codespace-for-a-repository#creating-a-codespace-for-a-repository).
|
||||
* For local/'remote host' usage with Visual Studio Code, please follow the
|
||||
instructions at
|
||||
[Developing inside a Container](https://code.visualstudio.com/docs/devcontainers/containers).
|
||||
|
||||
## Organization of the code
|
||||
|
||||
The codes for each chapter are stored in files named *chXX.jl*, where *XX* is
|
||||
|
@ -28,6 +28,17 @@
|
||||
"### Comparison of execution speed of Julia, Java, Python, and C"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "99c45eb6",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"using Pkg\n",
|
||||
"Pkg.activate(Base.current_project())"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 1,
|
||||
|
@ -35,6 +35,17 @@
|
||||
"## Representing values"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "2338b85b",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"using Pkg\n",
|
||||
"Pkg.activate(Base.current_project())"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 1,
|
||||
|
@ -34,6 +34,17 @@
|
||||
"### A single function can have multiple methods"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "b1f7359c",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"using Pkg\n",
|
||||
"Pkg.activate(Base.current_project())"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 1,
|
||||
|
@ -63,6 +63,17 @@
|
||||
"### Getting the data into a matrix"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "5e16f874",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"using Pkg\n",
|
||||
"Pkg.activate(Base.current_project())"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 1,
|
||||
|
@ -34,6 +34,17 @@
|
||||
"### Syntax and meaning of broadcasting in Julia"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "1d9574f4",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"using Pkg\n",
|
||||
"Pkg.activate(Base.current_project())"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 1,
|
||||
|
@ -34,6 +34,17 @@
|
||||
"### Downloading data from the web"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "10d11474",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"using Pkg\n",
|
||||
"Pkg.activate(Base.current_project())"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 1,
|
||||
|
@ -34,6 +34,17 @@
|
||||
"### Standard process of parsing JSON response"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "a179627e",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"using Pkg\n",
|
||||
"Pkg.activate(Base.current_project())"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 1,
|
||||
|
@ -26,6 +26,17 @@
|
||||
"## Fetching, unpacking, and inspecting the Lichess data"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "d2ade007",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"using Pkg\n",
|
||||
"Pkg.activate(Base.current_project())"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 1,
|
||||
|
@ -42,6 +42,17 @@
|
||||
"## Advanced data frame indexing"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "65b9f2cc",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"using Pkg\n",
|
||||
"Pkg.activate(Base.current_project())"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 1,
|
||||
|
@ -34,6 +34,17 @@
|
||||
"## Review of most important ways of creating a data frame"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "b94d80ed",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"using Pkg\n",
|
||||
"Pkg.activate(Base.current_project())"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 1,
|
||||
|
@ -26,6 +26,17 @@
|
||||
"## Converting a data frame to other value types"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "6408a31f",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"using Pkg\n",
|
||||
"Pkg.activate(Base.current_project())"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 1,
|
||||
|
@ -34,6 +34,17 @@
|
||||
"### Fetching GitHub developer data from the web"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "b3a42231",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"using Pkg\n",
|
||||
"Pkg.activate(Base.current_project())"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 1,
|
||||
|
@ -34,6 +34,17 @@
|
||||
"### Loading all required packages"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "f8c7f637",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"using Pkg\n",
|
||||
"Pkg.activate(Base.current_project())"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 1,
|
||||
|
@ -34,6 +34,17 @@
|
||||
"### Calculation of asian option payoff"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "da189a22",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"using Pkg\n",
|
||||
"Pkg.activate(Base.current_project())"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 1,
|
||||
|
Loading…
Reference in New Issue
Block a user