Slow Regeneration in Jekyll - ruby

I'm developing a blog using jekyll and up until now I was very happy with it.
But as I make more posts the regeneration times are getting ridiculous (3-4 minutes). It's just not feasible to wait that long every time you make a change.
Specs:
Ruby 2.2.1
Jekyll 2.5.3
markdown: kramdown
highlighter: pygments
permalink:pretty
Working on a cloud service (Cloud9) with 2 GB of RAM
Not a lot of posts (~10), but I do use a lot of data (10 MB of json files in the "_data" folder, 14 MB of images in "img" folder)
Total size of the "_site" folder is 40 MB
Is it a normal thing with these specifications?
I've updated to Jekyll 3.0 to try incremental regeneration, but it didn't help in my case.
Any ideas?
Thanks!
Willem

Run jekyll serve --profile on your site and check what is taking more time to render. It should output a table that looks something like this.
Filename | Count | Bytes | Time
----------------------------------------------------------------------+-------+----------+------
_layouts/compress.html | 73 | 1649.86K | 1.526
_layouts/default.html | 72 | 1874.79K | 0.445
_layouts/post.html | 58 | 980.02K | 0.307
_posts/2015-12-10-how-to-create-and-host-a-website-on-github-pages.md | 1 | 9.36K | 0.294
feed.xml | 1 | 34.74K | 0.105
_includes/prev-next.html | 58 | 39.17K | 0.053
sitemap.xml | 1 | 19.90K | 0.035
_pages/archive.md | 1 | 28.98K | 0.035
_posts/2017-02-15-jekyll-sort-filters.md | 1 | 16.09K | 0.019
_includes/ga_data_fetch.html | 58 | 41.77K | 0.018
_includes/disqus-script.html | 58 | 30.89K | 0.018
_pages/tags.html | 1 | 14.97K | 0.015
That should give you a fair idea on where the problem exists.
Now while making changes to the site, if you want to render only the changed files then use jekyll serve --incremental or jekyll serve -I.
Incremental build still has some issues that the Jekyll team is working on.
A handy option to render only the latest post that you are writing would be jekyll serve --watch --limit_posts 1. This has saved me a lot of time while writing new posts.

There are a few options
Use --incremental on jekyll build or serve but use with caution
Use --profile on jekyll build to get an output of where time is used up
You could also have different config.yml files where you might include only draft posts for development and not for production.
Consider restructuring your development environment
Development folder with _posts containing just a sample
Production folder with your live set of _posts
copy you dev content over prior to production build

The profiling was showing nothing to worry about, but I was still getting 2-3 seconds regeneration times with a simple one page website.
I used a super simple Gemfile
source 'https://rubygems.org'
ruby "2.4.2"
gem "jekyll", "~> 3.6.2"
Then called bundle install again.
After that, regeneration times were back under 1 second.

Related

sbt - Scala - Brew - MacOS - Unable to connect to sbt shell at all: NoClassDefFoundError

So I'm just trying to get a project set up using JDK 15 / SBT 1.5.4 / Scala 2.13.6 all of which have been installed via brew on MacOS.
However before I even attempt to build via intellij etc. I'm unable to connect to the sbt shell via a normal terminal.
[info] welcome to sbt 1.5.4 (AdoptOpenJDK Java 15.0.2)
[info] loading global plugins from /Users/user/.sbt/1.0/plugins
[warn] Project loading failed: (r)etry, (q)uit, (l)ast, or (i)gnore? (default: r)
Exception in thread "Thread-0" java.lang.NoClassDefFoundError: Could not initialize class com.swoval.runtime.ShutdownHooks
at com.swoval.runtime.ShutdownHooks$1.run(ShutdownHooks.java:25)
I've tried reinstalling all three dependancies a few times and cleared the cache but still nothing. I'm guessing something isn't configured right because it's unable to even connect to the shell.
Thanks!
EDIT: I've just followed the install steps on the sbt docs and the only requirements are JDK 11 or 8 and sbt itself. I've removed scala / JDK15 and re-downloaded JDK 11 via SDK-man this time and i'm still having the same issue.
EDIT 2: I've removed the .sbt directory and reinitiased and now sbt command is showing more output, hopefully this helps a little more.
java.lang.NoClassDefFoundError: Could not initialize class com.swoval.runtime.ShutdownHooks
at com.swoval.runtime.NativeLoader.loadPackaged(NativeLoader.java:143)
at com.swoval.runtime.NativeLoader.loadPackaged(NativeLoader.java:174)
at com.swoval.files.apple.FileEventMonitorImpl.<clinit>(FileEventMonitors.java:127)
at com.swoval.files.apple.FileEventMonitors.get(FileEventMonitors.java:47)
at com.swoval.files.ApplePathWatcher.<init>(ApplePathWatcher.java:258)
at com.swoval.files.ApplePathWatcher.<init>(ApplePathWatcher.java:194)
at com.swoval.files.ApplePathWatchers.get(ApplePathWatcher.java:331)
at com.swoval.files.PathWatchers.get(PathWatchers.java:84)
at com.swoval.files.FileTreeRepositories.get(FileTreeRepositories.java:64)
at com.swoval.files.FileTreeRepositories.get(FileTreeRepositories.java:32)
at sbt.internal.nio.FileTreeRepositoryImpl.<init>(FileTreeRepositoryImpl.scala:46)
at sbt.internal.nio.FileTreeRepository$.default(FileTreeRepository.scala:40)
at sbt.BuiltinCommands$.$anonfun$setupGlobalFileTreeRepository$1(Main.scala:985)
at sbt.BuiltinCommands$.$anonfun$doLoadProject$5(Main.scala:974)
at sbt.Project$.setProject(Project.scala:501)
at sbt.BuiltinCommands$.doLoadProject(Main.scala:974)
at sbt.BuiltinCommands$.$anonfun$loadProjectImpl$2(Main.scala:912)
at sbt.Command$.$anonfun$applyEffect$4(Command.scala:150)
at sbt.Command$.$anonfun$applyEffect$2(Command.scala:145)
at sbt.Command$.process(Command.scala:189)
at sbt.MainLoop$.$anonfun$processCommand$5(MainLoop.scala:245)
at scala.Option.getOrElse(Option.scala:189)
at sbt.MainLoop$.process$1(MainLoop.scala:245)
at sbt.MainLoop$.processCommand(MainLoop.scala:278)
at sbt.MainLoop$.$anonfun$next$5(MainLoop.scala:163)
at sbt.State$StateOpsImpl$.runCmd$1(State.scala:289)
at sbt.State$StateOpsImpl$.process$extension(State.scala:325)
at sbt.MainLoop$.$anonfun$next$4(MainLoop.scala:163)
at sbt.internal.util.ErrorHandling$.wideConvert(ErrorHandling.scala:23)
at sbt.MainLoop$.next(MainLoop.scala:163)
at sbt.MainLoop$.run(MainLoop.scala:144)
at sbt.MainLoop$.$anonfun$runWithNewLog$1(MainLoop.scala:119)
at sbt.io.Using.apply(Using.scala:27)
at sbt.MainLoop$.runWithNewLog(MainLoop.scala:112)
at sbt.MainLoop$.runAndClearLast(MainLoop.scala:66)
at sbt.MainLoop$.runLoggedLoop(MainLoop.scala:51)
at sbt.MainLoop$.runLogged(MainLoop.scala:42)
at sbt.StandardMain$.runManaged(Main.scala:218)
at sbt.xMain$.$anonfun$run$11(Main.scala:133)
at scala.util.DynamicVariable.withValue(DynamicVariable.scala:62)
at scala.Console$.withIn(Console.scala:230)
at sbt.internal.util.Terminal$.withIn(Terminal.scala:560)
at sbt.internal.util.Terminal$.$anonfun$withStreams$1(Terminal.scala:350)
at scala.util.DynamicVariable.withValue(DynamicVariable.scala:62)
at scala.Console$.withOut(Console.scala:167)
at sbt.internal.util.Terminal$.$anonfun$withOut$2(Terminal.scala:550)
at scala.util.DynamicVariable.withValue(DynamicVariable.scala:62)
at scala.Console$.withErr(Console.scala:196)
at sbt.internal.util.Terminal$.withOut(Terminal.scala:550)
at sbt.internal.util.Terminal$.withStreams(Terminal.scala:350)
at sbt.xMain$.withStreams$1(Main.scala:87)
at sbt.xMain$.run(Main.scala:121)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at sbt.internal.XMainConfiguration.run(XMainConfiguration.java:56)
at sbt.xMain.run(Main.scala:46)
at xsbt.boot.Launch$.$anonfun$run$1(Launch.scala:149)
at xsbt.boot.Launch$.withContextLoader(Launch.scala:176)
at xsbt.boot.Launch$.run(Launch.scala:149)
at xsbt.boot.Launch$.$anonfun$apply$1(Launch.scala:44)
at xsbt.boot.Launch$.launch(Launch.scala:159)
at xsbt.boot.Launch$.apply(Launch.scala:44)
at xsbt.boot.Launch$.apply(Launch.scala:21)
at xsbt.boot.Boot$.runImpl(Boot.scala:78)
at xsbt.boot.Boot$.run(Boot.scala:73)
at xsbt.boot.Boot$.main(Boot.scala:21)
at xsbt.boot.Boot.main(Boot.scala)
[error] java.lang.NoClassDefFoundError: Could not initialize class com.swoval.runtime.ShutdownHooks
[error] Use 'last' for the full log.
[warn] Project loading failed: (r)etry, (q)uit, (l)ast, or (i)gnore? (default: r)
Exception in thread "Thread-0" java.lang.NoClassDefFoundError: Could not initialize class com.swoval.runtime.ShutdownHooks
at com.swoval.runtime.ShutdownHooks$1.run(ShutdownHooks.java:25)
EDIT3: Tried creating a new user and just downloading sbt and still getting the same issue. Will attempt completely removing Java as it seems to be the culprit and reinstalling.
Similar to Boris's suggestion the issue lied in the installation version of Java.
There are two versions for AdoptOpenJDK, .j9 an .hs as seen below if you are using sdk-man as a package manager:
AdoptOpenJDK | >>> | 16.0.1.j9 | adpt | installed | 16.0.1.j9-adpt
| | 16.0.1.hs | adpt | | 16.0.1.hs-adpt
| | 11.0.11.j9 | adpt | | 11.0.11.j9-adpt
| | 11.0.11.hs | adpt | | 11.0.11.hs-adpt
For some reason the OpenJDK version .hs-adpt shows this issue for every version but the .j9-adpt version works fine.
TLDR: Install the .j9-adpt version of Java that you need otherwise .hs-adpt is not working for me with sbt version 1.5.4.
I assume the reason - you are using wrong Java JDK for Mac OS with M1 chip. You need to install proper Java JDK version, I use sdkman for that.
Install sdk man:
curl -s "https://get.sdkman.io" | bash
source "$HOME/.sdkman/bin/sdkman-init.sh"
set up sdk man to not use rosetta2_compatbile versions:
vim .sdkman/etc/config
and set sdkman_rosetta2_compatbile=false
choose java JDK from the list:
sdk list java
================================================================================
Available Java Versions
================================================================================
Vendor | Use | Version | Dist | Status | Identifier
--------------------------------------------------------------------------------
Azul Zulu | | 16.0.1 | zulu | | 16.0.1-zulu
| | 11.0.11 | zulu | | 11.0.11-zulu
| | 8.0.292 | zulu | | 8.0.292-zulu
BellSoft | | 16.0.1 | librca | | 16.0.1-librca
| | 11.0.11 | librca | | 11.0.11-librca
| | 8.0.292 | librca | | 8.0.292-librca
Java.net | | 18.ea.3 | open | | 18.ea.3-open
| | 18.ea.2 | open | | 18.ea.2-open
| | 18.ea.1 | open | | 18.ea.1-open
| | 17.ea.28 | open | | 17.ea.28-open
| | 17.ea.27 | open | | 17.ea.27-open
| | 17.ea.26 | open | | 17.ea.26-open
| | 17.ea.25 | open | | 17.ea.25-open
================================================================================
and install it using command sdk install java IDENTIFIER, i.e.:
sdk install java 16.0.1-zulu

How to create a substraste chain?

I need HELP
I have two major errors in creating my first substraste chain (cf. https://substrate.dev/docs/en/tutorials/create-your-first-substrate-chain/setup)
Error in Installing the Front-End Template
~/Bureau/ETH-BIT/substrate/substrate-front-end-template$ ls LICENSE
package.json public README.md src yarn.lock
pclf#ubuntu:~/Bureau/ETH-BIT/substrate/substrate-front-end-template$
yarn install
ERROR: [Errno 2] No such file or directory: 'install'
Error in compiling Substrate
cargo build --release
error: failed to run custom build command for node-template-runtime v2.0.0 (/home/pclf/Bureau/ETH-BIT/substrate/substrate-node-template/runtime)
Caused by: process didn't exit successfully:
/home/pclf/Bureau/ETH-BIT/substrate/substrate-node-template/target/release/build/node-template-runtime-663c8dc25926c960/build-script-build
(exit code: 1) --- stdout Executing build command: "rustup" "run"
"nightly" "cargo" "rustc" "--target=wasm32-unknown-unknown"
"--manifest-path=/home/pclf/Bureau/ETH-BIT/substrate/substrate-node-template/target/release/wbuild/node-template-runtime/Cargo.toml" "--color=always" "--release"
--- stderr
Compiling wasm-build-runner-impl v1.0.0 (/home/pclf/Bureau/ETH-BIT/substrate/substrate-node-template/target/release/wbuild-runner/node-template-runtime4021631938540302808)
Finished release [optimized] target(s) in 7.49s
Running /home/pclf/Bureau/ETH-BIT/substrate/substrate-node-template/target/release/wbuild-runner/node-template-runtime4021631938540302808/target/x86_64-unknown-linux-gnu/release/wasm-build-runner-impl
Compiling sp-arithmetic v2.0.0
Compiling sp-io v2.0.0
Compiling sp-inherents v2.0.0
Compiling frame-metadata v12.0.0
Compiling sp-finality-tracker v2.0.0 error[E0282]: type annotations needed
--> /home/pclf/.cargo/registry/src/github.com-1ecc6299db9ec823/sp-arithmetic-2.0.0/src/fixed_point.rs:541:9
| 541 | let accuracy = P::ACCURACY.saturated_into();
| ^^^^^^^^ consider giving accuracy a type ... 1595 | / implement_fixed!( 1596 | | FixedI64,
1597 | | test_fixed_i64, 1598 | | i64, ... | 1601 | |
"Fixed Point 64 bits signed, range = [-9223372036.854775808,
9223372036.854775807]", 1602 | | );
| |__- in this macro invocation
|
= note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info)
error[E0282]: type annotations needed
--> /home/pclf/.cargo/registry/src/github.com-1ecc6299db9ec823/sp-arithmetic-2.0.0/src/fixed_point.rs:541:9
| 541 | let accuracy = P::ACCURACY.saturated_into();
| ^^^^^^^^ consider giving accuracy a type ... 1604 | / implement_fixed!( 1605 | | FixedI128,
1606 | | test_fixed_i128, 1607 | | i128, ... | 1611 |
| [-170141183460469231731.687303715884105728,
170141183460469231731.687303715884105727]_", 1612 | | );
| |__- in this macro invocation
|
= note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info)
error[E0282]: type annotations needed
--> /home/pclf/.cargo/registry/src/github.com-1ecc6299db9ec823/sp-arithmetic-2.0.0/src/fixed_point.rs:541:9
| 541 | let accuracy = P::ACCURACY.saturated_into();
| ^^^^^^^^ consider giving accuracy a type ... 1614 | / implement_fixed!( 1615 | | FixedU128,
1616 | | test_fixed_u128, 1617 | | u128, ... | 1621 |
| [0.000000000000000000,
340282366920938463463.374607431768211455]_", 1622 | | );
| |__- in this macro invocation
|
= note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info)
error: aborting due to 3 previous errors
For more information about this error, try rustc --explain E0282.
error: could not compile sp-arithmetic
error: build failed
You can just run yarn in the front end template directory, it will work. But where is the "Is LICENCE public" message coming from? You shouldn't see that. Did you clone the substrate-front-end-template repo or just create the directory? The exact process is:
clone it with git clone https://github.com/substrate-developer-hub/substrate-front-end-template
enter folder with cd substrate-front-end-template
run yarn
As for the Substrate compilation error, please downgrade your nightly to an older version, it happens due to a bug in Rust. Here is how to do that:
rustup uninstall nightly
rustup install nightly-2020-10-01
rustup target add wasm32-unknown-unknown --toolchain nightly-2020-10-01
First thing first solve the Substrate compiling first.
run this scrip
https://github.com/substrate-developer-hub/substrate-node-template/blob/master/scripts/init.sh
When you get the node up and running then start using frontend.

Nested stages in CI jobs

In GitLab job description it is possible to specify stages, where jobs will be grouped by stages and executed in parallel. Imagine that I'd like to do the following:
Build a release binary.
Build a release Docker image for release binary.
Build a debug binary.
Build a debug Docker image for debug binary.
With no nested stages, I can try building release and debug binaries at the same time, and later build both images. But, this is terribly inefficient because one of the builds takes a lot longer than the other, yet, I cannot start creating an image for the build that finished first.
If only it was possible to arrange for the Docker image building job to start as soon as either the first build finished, it would be perfect. One way this might have been possible is if I could specify nested stages, where, say, stage build-all had two nested stages: build-release and build-debug, each composed of two jobs: build-release-binary, build-release-image, and, similarly, build-debug-binary, build-debug-image.
Since I'm new to GitLab, I would also appreciate a negative answer, i.e. knowing that it is not possible is also useful.
Problem
To first confirm your problem, I imagine you have a setup like this:
.gitlab-ci.yml:
stages:
- build-binaries
- build-images
# Binaries
build-release-binary:
stage: build-binaries
script:
- make release
build-debug-binary:
stage: build-binaries
script:
- make debug
# Docker Images
build-release-image:
stage: build-images
dependencies:
- build-release-binary
script:
- docker build -t wvxvw:release .
build-debug-image:
stage: build-images
dependencies:
- build-debug-binary
script:
- docker build -t wvxvw:debug .
And that should produce a pipeline like this:
build-binaries build-images
______________________ _____________________
| | | |
| build-release-binary |----+--+--->| build-release-image |
|______________________| / \ |_____________________|
| |
______________________ | | _____________________
| | | | | |
| build-debug-binary |---/ \-->| build-debug-image |
|______________________| |_____________________|
Assessment
You are correct that no jobs from the build-images stage will begin until all jobs from the build-binaries stage complete (even though the job's dependencies are met).
There is a GitLab issue open that discusses this:
gitlab-org/gitlab-ce#49964: Allow running a CI job if its dependencies succeeded
I've added a comment pointing out the improvements that could be made in this case. In the future, the pipeline might then look like this (note the separate connecting lines):
build-binaries build-images
______________________ _____________________
| | | |
| build-release-binary |----------->| build-release-image |
|______________________| |_____________________|
______________________ _____________________
| | | |
| build-debug-binary |----------->| build-debug-image |
|______________________| |_____________________|
Workaround
Sometimes if you have sequential tasks, it's easier to simply run them in a single job. This avoids the overhead of firing up another job, when you already have everything ready to go in the first job.
As a work-around, you could simply flatten your pipeline into a single stage which would build both the binary and the Docker image:
.gitlab-ci.yml:
stages:
- build
build-release:
stage: build
script:
- make release
- docker build -t wvxvw:release .
build-debug:
stage: build
script:
- make debug
- docker build -t wvxvw:debug .
Your pipeline would then of course look like this:
build
_______________
| |
| build-release |
|_______________|
_______________
| |
| build-debug |
|_______________|
I've worked with a team to simplify their pipeline in a similar manner, and we were pleased with the results.
As of Gitlab 12.2, this was fixed with the needs clause, so arbitrary DAGs are now allowed. You can visualize the graph as of Gitlab 13.1 (Beta).
For example, imagine you want to run pylint and unit tests in parallel, and then check the coverage of your unit tests, but without waiting for pylint to finish.
stages:
- Checks
- SecondaryChecks
pylint:
stage: Checks
script: pylint
unittests:
stage: Checks
script: coverage run -m pytest -rs --verbose
testcoverage:
stage: SecondaryChecks
needs: ["unittests"]
script: coverage report -m | grep -q "TOTAL.*100%"
Note that 'needs' only works for targets defined in previous stages. Hence the need for two stages here.

No 'SPI-Provider' Manifest header

When trying to install my application as an osgi bundle with the install command in karaf on the command line, everything seems fine. When I then type start (id) everything still seems fine, but my application does not seem to accept requests. When I then type log:display, I get this:
2016-04-20 13:49:38,251 | INFO | Thread-19 | bundle | 37 - org.apache.aries.spifly.dynamic.bundle - 1.0.1 | Bundle Considered for SPI providers: oms-integrations
2016-04-20 13:49:38,251 | INFO | Thread-19 | bundle | 37 - org.apache.aries.spifly.dynamic.bundle - 1.0.1 | No 'SPI-Provider' Manifest header. Skipping bundle: oms-integrations
I'm new and I have no clue what this means ("No 'SPI-Provider' Manifest header.") or how to solve it?
This is not a problem. It just means that you have Aries spi-fly installed. It scans all bundles for this header and enhances the ones with the header to be able to use the ServiceLoader in OSGi. If you do not use ServiceLoader then you can safely ignore these messages.
You can also configure this logger to WARN to suppress the messsages.

How to include installer dependencies in dmg/pkg on mac

I have a mac application (Eg. Sample.pkg containing Sample.app) along with few pkg dependencies (Eg. A.pkg and B.pkg ). Whenever the user runs the dmg/product archive bundled with these three packages, A.pkg and B.pkg has to be run first before Sample.pkg is installed.
Is there a way where I can specify this dependency while packaging the mac application, without need the user to manually check and install them in the right order?
Solution
There is a way.
You can add such entry to your distribution.xml
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<installer-gui-script minSpecVersion="1">
<title>Application name</title>
<organization>com.organization</organization>
....
<volume-check>
<required-bundles description="Some message which UI Installer doesn't show :(">
<!-- bundle 1 -->
<bundle id="com.organization.app1" path="Applications/App1.app" />
<!-- bundle 2 -->
<bundle id="com.organization.app2" path="Applications/App2.app" />
</required-bundles>
</volume-check>
....
</installer-gui-script>
This is documented here (required-bundles).
Some examples can be found on github.
Disadvantage
There is some bug in Apple Installer, required-bundles description says:
Attributes
|----------------|------------------|------------------------------------------------------------|
| Attribute name | Type | Description |
|----------------|------------------|------------------------------------------------------------|
| | | _Optional._ Values: `true` (default) to require all of |
| `all` | Boolean | the specified bundles, or `false` to require at least one |
| | | of them. |
|----------------|------------------|------------------------------------------------------------|
| `description` | String, | _Optional._ A description of the required bundles, |
| | localization key | displayed to the user if the requirement is not met. |
|----------------|------------------|------------------------------------------------------------|
So the message from description should be shown, but I can't see it anywhere, so user can be confused why he is unable to install application.
It just warns: You can't install <your application> here, <your application> do not allow it. (sorry translation from my localization back to English).
Alternative
I've seen some installation package which was running custom script form installation-check invoking it from installation JavaScript, using system.run('script_name').

Resources