Merge pull request #425 from dannyrb/docs/update-historical-meteor-docs

Update historical meteor docs
This commit is contained in:
Danny Brown 2019-05-13 15:17:30 -04:00 committed by GitHub
commit 12172eaf48
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
12 changed files with 718 additions and 15 deletions

View File

@ -40,6 +40,7 @@
- [Static](deployment/recipes/static-assets.md)
- [Nginx + Image Archive](deployment/recipes/nginx--image-archive.md)
- [User Account Control](deployment/recipes/user-account-control.md)
- [Google Cloud Healthcare](connecting-to-image-archives/google-cloud-healthcare.md)
---

View File

@ -0,0 +1,124 @@
# Google Cloud Healthcare
> ATTENTION: The original documentation for this integration lives in the legacy
> `version 1` Meteor documentation. You can
> [find it here](/history/v1/connecting-to-image-archives/google-cloud-healthcare.html).
> These docs will mirror the Meteor documentation until our `React`
> implementation has been updated to work with Goolg Cloud Healthcare.
> The [Google Cloud Healthcare API](https://cloud.google.com/healthcare/) is a
> powerful option for storing medical imaging data in the cloud.
An alternative to deploying your own PACS is to use a software-as-a-service
provider such as Google Cloud. The Cloud Healthcare API promises to be a
scalable, secure, cost effective image storage solution for those willing to
store their data in the cloud. It offers an
[almost-entirely complete DICOMWeb API](https://cloud.google.com/healthcare/docs/dicom)
which requires tokens generated via the
[OAuth 2.0 Sign In flow](https://developers.google.com/identity/sign-in/web/sign-in).
Images can even be transcoded on the fly if this is desired. The Cloud
Healthcare API is a very attractive option because it allows us to avoid
deploying the Meteor server entirely. We can just deploy OHIF as a client-only
static site application.
## Setup a Google Cloud Healthcare Project
- Create a Google Cloud account
- Create a project in Google Cloud
- Enable the [Cloud Healthcare API](https://cloud.google.com/healthcare/) for
your project.
- (Optional): Create a Dataset and Data Store for storing your DICOM data
- Enable the
[Cloud Resource Manager API](https://cloud.google.com/resource-manager/) for
your project.
- _Note:_ If you are having trouble finding the APIs, use the search box at
the top of the Cloud console.
- Go to APIs & Services > Credentials to create an OAuth Consent screen and fill
in your application details.
- Under Scopes for Google APIs, click "manually paste scopes".
- Add the following scopes:
- `https://www.googleapis.com/auth/cloudplatformprojects.readonly`
- `https://www.googleapis.com/auth/cloud-healthcare`
- Go to APIs & Services > Credentials to create a new set of credentials:
- Choose the "Web Application" type
- Set up an
[OAuth 2.0 Client ID](https://support.google.com/cloud/answer/6158849?hl=en)
- Add your domain (e.g. `http://localhost:3000`) to Authorized JavaScript
origins.
- Add your domain, plus `_oauth/google` (e.g.
`http://localhost:3000/_oauth/google`) to Authorized Redirect URIs.
- Save your Client ID for later.
- (Optional): Enable Public Datasets that are being hosted by Google:
https://cloud.google.com/healthcare/docs/resources/public-datasets/
## Run the viewer with your OAuth Client ID
1. Open the `config/oidc-googleCloud.json` file and change `YOURCLIENTID` to
your Client ID value.
1. Run the OHIF Viewer using the oidc-googleCloud.json configuration file
```bash
cd OHIFViewer
METEOR_PACKAGE_DIRS="../Packages" meteor npm install
METEOR_PACKAGE_DIRS="../Packages" meteor --settings ../config/oidc-googleCloud.json
```
## Running via Docker
OHIF is also providing a Docker container which can connect to Google Cloud
Healthcare with a Client ID which is provided at runtime. This is a very simple
method to get up and running. Internally, the container is running
[Nginx](https://nginx.org/) to serve the
[Standalone Viewer](../standalone-viewer/usage.md).
1. Install Docker (https://www.docker.com/)
1. Run the Docker container, providing a Client ID as an environment variable.
Client IDs look like `xyz.apps.googleusercontent.com`.
```bash
docker run --env CLIENT_ID=$CLIENT_ID --publish 3000:80 ohif/viewer-google-cloud:latest
```
## Building the ohif/viewer-google-cloud Docker Image
The
[ohif/viewer-google-cloud](https://cloud.docker.com/u/ohif/repository/docker/ohif/viewer-google-cloud)
Docker image is built as follows. The Dockerfile and nginx.conf are in the
`/dockersupport/viewer-google-cloud` folder.
1. [Install Meteor](https://www.meteor.com/install)
1. Clone the repository
```bash
git clone https://github.com/OHIF/Viewers.git
cd Viewers
```
1. Install meteor-build-client-fixed2 so you can build the Standalone Viewer
```bash
npm install -g meteor-build-client-fixed2
```
1. Build the Standalone client-only OHIF Viewer
```bash
cd OHIFViewer/
METEOR_PACKAGE_DIRS="../Packages" meteor npm install
METEOR_PACKAGE_DIRS="../Packages" meteor-build-client-fixed2 ../dockersupport/viewer-google-cloud/build -s ../config/oidc.json
```
1. Build the Docker image
```bash
cd ../dockersupport/viewer-google-cloud
docker build -t ohif/viewer-google-cloud .
```
1. Run the Docker image using an OAuth Client ID
```bash
docker run --env CLIENT_ID={$someID}.apps.googleusercontent.com --publish 3000:80 ohif/viewer-google-cloud
```

View File

@ -0,0 +1,2 @@
This folder contains the OHIF Viewer installation instructions, categorized by operating system

View File

@ -0,0 +1,2 @@
This folder contains the OHIF Viewer installation instructions on the Microsoft Windows operating system

View File

@ -0,0 +1,59 @@
# OHIF Standalone Installation Instructions For Windows Server 2016:
**Note: Turn-Off Windows Defender Realtime protection during this process*
1. Install Chocolatey
a. Go to this URL for instructions:
https://chocolatey.org/install#install-with-cmdexe
b. Execute this command in the cmd line as Admin:
`@"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))" && SET "PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin"`
c. Type `choco -?` to ensure the installation is OK.
2. Install Meteor
a. Type the command: `choco install meteor`
3. Install node.js
a. Download MSI from: https://nodejs.org/en/download/
4. Install MongoDB
a. Download MSI from:
https://www.mongodb.com/download-center/community
5. Install Git
a. https://git-scm.com/download/win
6. Download the OHIF Viewer repository from GitHub, or use Git to clone it (recommended)
a. GitHub Repo: https://github.com/OHIF/Viewers
b. GIT Clone command: `git clone https://github.com/OHIF/Viewers`
7. Set the Meteor Packages folder environment variable
a. Go to Advanced System Settings
b. Under Advanced, click on the "Environment Variables..." button
c. Under System Variables, click "New..."
d. Set the following:
i. Variable name: METEOR_PACKAGE_DIRS
ii. Variable Value: {path to the OHIF Viewer Packages Folder}
example: C:\OHIF\Viewers\Packages
8. Using the command line, navigate/cs to the standalone viewer folder, example: `cd C:\OHIF\Viewers\StandaloneViewer\StandaloneViewer`
9. run the command: `meteor npm install`
10. Run the command: `meteor`
a. if you get this error "Error: EPERM: operation not permitted, unlink" Or,
b. You feel the build is stale for a very long time > 10min with no visual indication, restart the cmd prompt and repeat this step (`meteor`)
# Troubleshooting:
1. If you get an error: Error: EPERM: operation not permitted, unlink 'c:\xxxxx'
a. https://github.com/phoenixframework/phoenix/issues/2464

View File

@ -0,0 +1,2 @@
This folder contains the OHIF Viewer documentation

View File

@ -0,0 +1,395 @@
**Development Environment Installation (Ubuntu)**
**CONFIDENTIAL DOCUMENT**
This is a confidential document and property of Radical Imaging LLC. It shall not be transmitted, copied or sent to anyone without prior authorization.
**Index**
[[TOC]]
<table>
<tr>
<td>Acronyms and definitions</td>
<td></td>
</tr>
<tr>
<td>Acronym/Definition</td>
<td>Meaning</td>
</tr>
<tr>
<td>N/A</td>
<td>N/A</td>
</tr>
</table>
<table>
<tr>
<td>Referenced Documents</td>
<td></td>
</tr>
<tr>
<td>Doc No</td>
<td>Doc Title</td>
</tr>
<tr>
<td>DOC00001</td>
<td>Radical Imaging Official Documents Template</td>
</tr>
</table>
# PURPOSE AND OBJECTIVES
The purpose of this document is to describe the development environment installation of OHIF viewer/Lesion Tracker on Linux Ubuntu.
# DEVELOPMENT ENVIRONMENT INSTALLATION
## Docker
Docker is an open source software platform to create, deploy and manage virtualized application containers on common operating systems, with several allied tools.
To install Docker, follow the instructions below:
1. Open a terminal, and update the apt package index, by running the following command:
sudo apt-get update
Expected result:
![image alt text](image_0.png)
2. Install packages to allow apt to use a repository over HTTPS, by running the following command:
sudo apt-get install apt-transport-https ca-certificates curl software-properties-common
Expected result:
![image alt text](image_1.png)
3. Add Dockers official GPG key, by running the following command:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
Expected result:
![image alt text](image_2.png)
4. Verify that you now have the key with the fingerprint **9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88**, by searching for the last 8 characters of the fingerprint after running the following command:
sudo apt-key fingerprint 0EBFCD88
Expected result:
![image alt text](image_3.png)
5. Use the following command to set up the stable repository.
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
Expected result:
![image alt text](image_4.png)
6. Install the latest version of Docker CE, by running the following command:
sudo apt-get install docker-ce
Expected result:
![image alt text](image_5.png)
7. Verify that Docker CE is installed correctly by running the hello-world image:
sudo docker run hello-world
Expected result:
![image alt text](image_6.png)
**Note**: Additional information about Docker installation on Linux Ubuntu OS can be foud at [https://docs.docker.com/install/linux/docker-ce/ubuntu/](https://docs.docker.com/install/linux/docker-ce/ubuntu/).
## DCM4CHE
Dcm4che ([https://www.dcm4che.org/](https://www.dcm4che.org/)) is a collection of open source applications and utilities for healthcare.
To install Dcm4che, follow the instructions below:
1. Before start, you need to create the following folders on your *Home *directory:
* DCM4CHEE
* dcm4chee-arc
* db
* ldap
* slapd.d
* storage
* wildfly
2. Create the following files on the DCM4CHEE folder, with the correspondent contents:
docker-compose.env
<table>
<tr>
<td>STORAGE_DIR=/storage/fs1
POSTGRES_DB=pacsdb
POSTGRES_USER=pacs
POSTGRES_PASSWORD=pacs</td>
</tr>
</table>
docker-compose.yml
<table>
<tr>
<td>version: "3"
services:
ldap:
image: dcm4che/slapd-dcm4chee:2.4.44-14.1
logging:
driver: json-file
options:
max-size: "10m"
ports:
- "389:389"
env_file: docker-compose.env
volumes:
- /etc/localtime:/etc/localtime:ro
- /etc/timezone:/etc/timezone:ro
- ~/dcm4chee-arc/ldap:/var/lib/ldap
- ~/dcm4chee-arc/slapd.d:/etc/ldap/slapd.d
db:
image: dcm4che/postgres-dcm4chee:10.4-14
logging:
driver: json-file
options:
max-size: "10m"
ports:
- "5432:5432"
env_file: docker-compose.env
volumes:
- /etc/localtime:/etc/localtime:ro
- /etc/timezone:/etc/timezone:ro
- ~/dcm4chee-arc/db:/var/lib/postgresql/data
arc:
image: dcm4che/dcm4chee-arc-psql:5.14.1
logging:
driver: json-file
options:
max-size: "10m"
ports:
- "8080:8080"
- "8443:8443"
- "9990:9990"
- "11112:11112"
- "2575:2575"
env_file: docker-compose.env
environment:
WILDFLY_CHOWN: /opt/wildfly/standalone /storage
WILDFLY_WAIT_FOR: ldap:389 db:5432
depends_on:
- ldap
- db
volumes:
- /etc/localtime:/etc/localtime:ro
- /etc/timezone:/etc/timezone:ro
- ~/dcm4chee-arc/wildfly:/opt/wildfly/standalone
- ~/dcm4chee-arc/storage:/storage</td>
</tr>
</table>
Files/Folder will become like the image above:
![image alt text](image_7.png)
3. Open a terminal inside DCM4CHE folder, and run the following command:
sudo snap install docker
Expected result:
![image alt text](image_8.png)
4. Still inside the DCM4CHE folder, run the following command:
sudo docker-compose -p dcm4chee up -d
Expected result:
![image alt text](image_9.png)
1. The following commands can be used to control DCM4CHE:
Stop all 3 containers: docker-compose -p dcm4chee stop
Start all 3 containers again: docker-compose -p dcm4chee start
Stop and delete all 3 containers: docker-compose -p dcm4chee down
2. Now it is necessary to import some DICOM studies to DCM4CHE. Before importing these studies, you will need to download them. To do so, access the address [http://34.224.187.57:3000/studylist](http://34.224.187.57:3000/studylist), right click one or more studies, and select the option Export:
![image alt text](image_10.png)
3. Confirm the study export on the modal window that will appear:
![image alt text](image_11.png)
4. The study(ies) export will begin. You can follow the exporting progress:
![image alt text](image_12.png)
5. After the exporting progress, the study(ies) will be downloaded in a file called "studies.zip". Create a folder named “Studies” on your Home folder, and extract this and any other studies you download in this folder:
![image alt text](image_13.png)
6. Open the terminal, go to the DCM4CHE folder, and run the following command in order to send the studies to DCM4CHE:
docker run -v ~/Studies/:/tmp --rm --network=dcm4chee_default dcm4che/dcm4che-tools:5.14.0 storescu -cDCM4CHEE@arc:11112 /tmp
Expected result:
![image alt text](image_14.png)
7. Now, go to your browser and access the URL [http://localhost:8080/dcm4chee-arc/ui2/](http://localhost:8080/dcm4chee-arc/ui2/). Once opened, click on the refresh icon on the most right:
![image alt text](image_15.png)
8. The studies received by DCM4CHE will be shown:
![image alt text](image_16.png)
9. Open the terminal, go to your Home folder, and run the following command in order to clone viewers repository to your local:
git clone https://github.com/OHIF/Viewers.git
Expected result:
![image alt text](image_17.png)
10. Then, enter the Viewers folder, and run the following command in order to make sure that you are in master branch:
git checkout master
Expected result:
![image alt text](image_18.png)
11. Now go to OHIFViewer folder and run the following command:
meteor npm install
Expected result:
![image alt text](image_19.png)
12. Still on the OHIFViewer folder, run the following command:
./bin/dcm4cheeDICOMWeb.sh
Expected result:
![image alt text](image_20.png)
13. Now, go to your browser and access the URL [http://localhost:3000](http://localhost:3000). Once opened, change the Study Date filter to start on the year 2000:
![image alt text](image_21.png)
14. The imported studies will be show. Double click a study to open it:
![image alt text](image_22.png)
## Meteor
Meteor is a JavaScript web framework that allows for rapid prototyping and produces cross-platform code.
To install Meteor, follow the instructions below:
**_Remark_***: This guide covers the Linux Ubuntu version. Installation instructions can be different on other operating systems.*
1. Open a terminal, and run the following command:
curl https://install.meteor.com/ | sh
Expected result:
![image alt text](image_23.png)
## Starting OHIF Viewer after system restart
These are the steps to run OHIFVIewer after system restart:.
1. Open terminal
2. Access the DCM4CHEE folder, on your Home folder
3. Run the following command in order to start docker containers:
docker-compose -p dcm4chee start
4. Access the Viewers/OHIFViewer folder, on your Home folder
5. Run the following command in order to run OHIF Viewer:
./bin/dcm4cheeDICOMWeb.sh
6. Access the address [http://localhost:3000](http://localhost:3000)

View File

@ -13,6 +13,7 @@
- Examples
- [dcm4chee w/ Docker](connecting-to-image-archives/dcm4chee-with-docker.md)
- [Orthanc w/ Docker](connecting-to-image-archives/orthanc-with-docker.md)
- [Google Cloud Healthcare](connecting-to-image-archives/google-cloud-healthcare.md)
- [Osirix](connecting-to-image-archives/osirix.md)
- Data Organization
- [Data Hierarchy](data/data-hierarchy.md)

View File

@ -0,0 +1,87 @@
# Google Cloud Healthcare
> The [Google Cloud Healthcare API](https://cloud.google.com/healthcare/) is a powerful option for storing medical imaging data in the cloud.
An alternative to deploying your own PACS is to use a software-as-a-service provider such as Google Cloud. The Cloud Healthcare API promises to be a scalable, secure, cost effective image storage solution for those willing to store their data in the cloud. It offers an [almost-entirely complete DICOMWeb API](https://cloud.google.com/healthcare/docs/dicom) which requires tokens generated via the [OAuth 2.0 Sign In flow](https://developers.google.com/identity/sign-in/web/sign-in). Images can even be transcoded on the fly if this is desired. The Cloud Healthcare API is a very attractive option because it allows us to avoid deploying the Meteor server entirely. We can just deploy OHIF as a client-only static site application.
## Setup a Google Cloud Healthcare Project
1. Create a Google Cloud account
1. Create a project in Google Cloud
1. Enable the [Cloud Healthcare API](https://cloud.google.com/healthcare/) for your project.
1. (Optional): Create a Dataset and Data Store for storing your DICOM data
1. Enable the [Cloud Resource Manager API](https://cloud.google.com/resource-manager/) for your project.
*Note:* If you are having trouble finding the APIs, use the search box at the top of the Cloud console.
1. Go to APIs & Services > Credentials to create an OAuth Consent screen and fill in your application details.
- Under Scopes for Google APIs, click "manually paste scopes".
- Add the following scopes:
- https://www.googleapis.com/auth/cloudplatformprojects.readonly
- https://www.googleapis.com/auth/cloud-healthcare
1. Go to APIs & Services > Credentials to create a new set of credentials:
- Choose the "Web Application" type
- Set up an [OAuth 2.0 Client ID](https://support.google.com/cloud/answer/6158849?hl=en)
- Add your domain (e.g. ```http://localhost:3000```) to Authorized JavaScript origins.
- Add your domain, plus `_oauth/google` (e.g. ```http://localhost:3000/_oauth/google```) to Authorized Redirect URIs.
- Save your Client ID for later.
1. (Optional): Enable Public Datasets that are being hosted by Google: https://cloud.google.com/healthcare/docs/resources/public-datasets/
## Run the viewer with your OAuth Client ID
1. Open the `config/oidc-googleCloud.json` file and change `YOURCLIENTID` to your Client ID value.
1. Run the OHIF Viewer using the oidc-googleCloud.json configuration file
````bash
cd OHIFViewer
METEOR_PACKAGE_DIRS="../Packages" meteor npm install
METEOR_PACKAGE_DIRS="../Packages" meteor --settings ../config/oidc-googleCloud.json
````
## Running via Docker
OHIF is also providing a Docker container which can connect to Google Cloud Healthcare with a Client ID which is provided at runtime. This is a very simple method to get up and running. Internally, the container is running [Nginx](https://nginx.org/) to serve the [Standalone Viewer](../standalone-viewer/usage.md).
1. Install Docker (https://www.docker.com/)
1. Run the Docker container, providing a Client ID as an environment variable. Client IDs look like `xyz.apps.googleusercontent.com`.
````bash
docker run --env CLIENT_ID=$CLIENT_ID --publish 3000:80 ohif/viewer-google-cloud:latest
````
## Building the ohif/viewer-google-cloud Docker Image
The [ohif/viewer-google-cloud](https://cloud.docker.com/u/ohif/repository/docker/ohif/viewer-google-cloud) Docker image is built as follows. The Dockerfile and nginx.conf are in the `/dockersupport/viewer-google-cloud` folder.
1. [Install Meteor](https://www.meteor.com/install)
1. Clone the repository
```bash
git clone https://github.com/OHIF/Viewers.git
cd Viewers
```
1. Install meteor-build-client-fixed2 so you can build the Standalone Viewer
```bash
npm install -g meteor-build-client-fixed2
```
1. Build the Standalone client-only OHIF Viewer
```bash
cd OHIFViewer/
METEOR_PACKAGE_DIRS="../Packages" meteor npm install
METEOR_PACKAGE_DIRS="../Packages" meteor-build-client-fixed2 ../dockersupport/viewer-google-cloud/build -s ../config/oidc.json
```
1. Build the Docker image
```bash
cd ../dockersupport/viewer-google-cloud
docker build -t ohif/viewer-google-cloud .
```
1. Run the Docker image using an OAuth Client ID
```bash
docker run --env CLIENT_ID={$someID}.apps.googleusercontent.com --publish 3000:80 ohif/viewer-google-cloud
```

View File

@ -29,16 +29,16 @@ http://localhost:3000/testDICOMs
It is possible to build this standalone viewer to run as a client-only bundle of HTML, JavaScript, and CSS.
1. First, install [meteor-build-client-fixed](https://github.com/brettg2/meteor-build-client/).
1. First, install [meteor-build-client-fixed2](https://www.npmjs.com/package/meteor-build-client-fixed2).
````bash
sudo npm install -g meteor-build-client-fixed
sudo npm install -g meteor-build-client-fixed2
````
2. Next, build the client bundle into an output folder ("myOutputFolder") with a base URL ("localhost:3000"). In production, this would be the URL where the Viewer is available.
````
METEOR_PACKAGE_DIRS="../../Packages" meteor-build-client-fixed ../myOutputFolder -u localhost:3000
METEOR_PACKAGE_DIRS="../../Packages" meteor-build-client-fixed2 ../myOutputFolder -u localhost:3000 --legacy
````
3. Test the bundled client-side package locally.
@ -70,6 +70,16 @@ It is possible to build this standalone viewer to run as a client-only bundle of
Open your web browser and navigate to http://localhost:3000/sampleJPEG.json or http://localhost:3000/sampleDICOM.json
## Authorization Header
A ```token``` fragment parameter can be specified. If present this value will be used for http bearer authorization when making requests for the above JSON, and when retrieving images using the Cornerstone Image Loaders.
Example :
```
http://localhost:3000/sampleDICOM.json#token=1a2b3c4d
```
### Testing the Sample client-only build
For the sake of simplicity we have also included a pre-built client-only version of the standalone viewer, which can be found in the SampleClientOnlyBuild folder.

9
docs/v1/update-docs.sh Normal file
View File

@ -0,0 +1,9 @@
rm -rf _book
gitbook install
gitbook build
cp assets/CNAME _book/CNAME
cd _book
git init
git add -A
git commit -m 'Update compiled GitBook (this commit is automatic)'
git push -f git@github.com:OHIF/Viewers.git master:gh-pages

View File

@ -1,4 +1,9 @@
cd docs
#!/bin/bash
# Set directory to location of this script
# https://stackoverflow.com/a/3355423/1867984
cd "$(dirname "$0")"
yarn -v
node -v
echo 'Installing Gitbook CLI'
@ -7,18 +12,22 @@ yarn global add gitbook-cli
echo 'Running Gitbook installation'
# Generate all version's GitBook output
# For each directory in /docs ...
cd ./docs/
for D in *; do
if [ -d "${D}" ]; then
echo "Generating output for: ${D}"
cd "${D}"
# Clear previous output, generate new
rm -rf _book
gitbook install
gitbook build
echo "Generating output for: ${D}"
cd "${D}"
cd ..
fi
# Clear previous output, generate new
rm -rf _book
gitbook install
gitbook build
cd ..
fi
done
# Move CNAME File into `latest`
@ -30,11 +39,13 @@ mkdir ./latest/_book/history
# Move each version's files to latest's history folder
for D in *; do
if [ -d "${D}" ]; then
if [[ "${D}" == v* ]] ; then
echo "Moving ${D} to the latest version's history folder"
if [ "${D}" == v* ] ; then
echo "Moving ${D} to the latest version's history folder"
mkdir "./latest/_book/history/${D}"
mv -v "./${D}/_book"/* "./latest/_book/history/${D}"
cp -v -r "./${D}/_book"/* "./latest/_book/history/${D}"
fi
fi
done