yetulax
    • Create new note
    • Create a note from template
      • Sharing URL Link copied
      • /edit
      • View mode
        • Edit mode
        • View mode
        • Book mode
        • Slide mode
        Edit mode View mode Book mode Slide mode
      • Customize slides
      • Note Permission
      • Read
        • Only me
        • Signed-in users
        • Everyone
        Only me Signed-in users Everyone
      • Write
        • Only me
        • Signed-in users
        • Everyone
        Only me Signed-in users Everyone
      • Engagement control Commenting, Suggest edit, Emoji Reply
    • Invite by email
      Invitee

      This note has no invitees

    • Publish Note

      Share your work with the world Congratulations! 🎉 Your note is out in the world Publish Note

      Your note will be visible on your profile and discoverable by anyone.
      Your note is now live.
      This note is visible on your profile and discoverable online.
      Everyone on the web can find and read all notes of this public team.
      See published notes
      Unpublish note
      Please check the box to agree to the Community Guidelines.
      View profile
    • Commenting
      Permission
      Disabled Forbidden Owners Signed-in users Everyone
    • Enable
    • Permission
      • Forbidden
      • Owners
      • Signed-in users
      • Everyone
    • Suggest edit
      Permission
      Disabled Forbidden Owners Signed-in users Everyone
    • Enable
    • Permission
      • Forbidden
      • Owners
      • Signed-in users
    • Emoji Reply
    • Enable
    • Versions and GitHub Sync
    • Note settings
    • Note Insights
    • Engagement control
    • Transfer ownership
    • Delete this note
    • Save as template
    • Insert from template
    • Import from
      • Dropbox
      • Google Drive
      • Gist
      • Clipboard
    • Export to
      • Dropbox
      • Google Drive
      • Gist
    • Download
      • Markdown
      • HTML
      • Raw HTML
Menu Note settings Versions and GitHub Sync Note Insights Sharing URL Create Help
Create Create new note Create a note from template
Menu
Options
Engagement control Transfer ownership Delete this note
Import from
Dropbox Google Drive Gist Clipboard
Export to
Dropbox Google Drive Gist
Download
Markdown HTML Raw HTML
Back
Sharing URL Link copied
/edit
View mode
  • Edit mode
  • View mode
  • Book mode
  • Slide mode
Edit mode View mode Book mode Slide mode
Customize slides
Note Permission
Read
Only me
  • Only me
  • Signed-in users
  • Everyone
Only me Signed-in users Everyone
Write
Only me
  • Only me
  • Signed-in users
  • Everyone
Only me Signed-in users Everyone
Engagement control Commenting, Suggest edit, Emoji Reply
  • Invite by email
    Invitee

    This note has no invitees

  • Publish Note

    Share your work with the world Congratulations! 🎉 Your note is out in the world Publish Note

    Your note will be visible on your profile and discoverable by anyone.
    Your note is now live.
    This note is visible on your profile and discoverable online.
    Everyone on the web can find and read all notes of this public team.
    See published notes
    Unpublish note
    Please check the box to agree to the Community Guidelines.
    View profile
    Engagement control
    Commenting
    Permission
    Disabled Forbidden Owners Signed-in users Everyone
    Enable
    Permission
    • Forbidden
    • Owners
    • Signed-in users
    • Everyone
    Suggest edit
    Permission
    Disabled Forbidden Owners Signed-in users Everyone
    Enable
    Permission
    • Forbidden
    • Owners
    • Signed-in users
    Emoji Reply
    Enable
    Import from Dropbox Google Drive Gist Clipboard
       owned this note    owned this note      
    Published Linked with GitHub
    Subscribed
    • Any changes
      Be notified of any changes
    • Mention me
      Be notified of mention me
    • Unsubscribe
    Subscribe
    # Containers and Workflows in Bioinformatics This is a collaborative "notebook" for the course on "Containers and workflows in bioinformatics", organised in November 2021 at CSC -IT center for Science. Some useful links for course: * [Course page in eLena platform](https://e-learn.csc.fi/course/view.php?id=73) * [Zoom-link for sessions](https://cscfi.zoom.us/j/66318334180?pwd=ZGRwYWVsMUdyOWQ5a0FMWmV4UzVFZz09) :::info :bulb: **Hint:** HackMD is great for sharing information in this kind of courses, as the code formatting is nice & easy with [MarkDown](https://www.markdownguide.org/basic-syntax/)! Just add 3 ticks (``` ` ```) for the``` code blocks ```. Otherwise, it's like a Google doc: it allows simultaneous editing. There's a section for practice down there ⬇️ ::: [ToC] ## 📅 Agenda ### Day 1: 23rd, November :::spoiler | Time | Content | |-------|---------| | 9:00 | Course preliminaries | | 9:20 | Warm up with HackMD Environment | | 9:30 | **Topic 1: Introduction to CSC HPC environment** | | 10:00 | **Topic 2: Tutorial - HPC basics** | | 10:30 | _Break_ | | 10:40 | **Topic 3: Fundamentals of containers** | | 11:10 | **Topic 4: Tutorial - Hello-World example** | | 11:40 | _wrap-up_ | ::: ### Day 2: 24th, November :::spoiler | Time | Content | |-------|---------| | 9:00 | **Topic 6: Using container images in HPC environment** | | 9:30 | **Topic 6:** Tutorials: Using existing Singularity images| | 10:30 | _Break_ | | 10:40 | **Topic 8: Containerised bio applications** | | 10:50 | _Break_ | | 11:10 | **Topic 8:** Tutorial - Containerised bio applications| | 11:40 | Recap | | 12:00 | Finish | ::: ### Day 3: 25th, November :::spoiler | Time | Content | |-------|---------| | 9:00 | **Topic 7: Converting docker images to singularity images** | | 9:30 | **Topic 7:** Tutorials: Converting docker images to singularity images | | 10:30 | _Break_ | | 10:40 | **Topic 7:** Building singularity container images | | 11:10| **Topic 9: Tutorials: Building singularity container images** | 11:40 | Recap | | 12:00 | Finish | ::: ### Day 4: 26th, November :::spoiler | Time | Content | |-------|---------| | 9:00 | **Topic 7: Introduction to nextflow** | | 9:30 | **Topic 7:** Tutorial - hello-world example | | 10:00 | **Topic 9: Using singularity containers in nextflow** | | 10:30 | _Break_ | | 10:40 | **Topic 9:** Tutorial - Using singularity containers in nextflow | | 11:30 | Running nextfflow at CSC | | 12:00 | Finish | ::: --- ## 📝 Q & A Your questions are answered here. We will answer them, and this document will store the answers for you for later use! :rocket: :::info Scroll :arrow_down: to the bottom of the page to submit a question ::: ## General and practical matters - [x] **Q: I have difficulty pasting my questions into HackMD (here). Do you have some instructions on how to write here?** - A: Can you see these three icons on top left corner, next to HackMD text? There’s pencil, this side-by-side symbol, and an eye. In eye view, you can’t edit, you are just viewing. The other two reveal the markdown (MD) version of the page, which you can edit. I find it easiest to edit with the side-by-side view. :::info :bulb: **Hint:** You can also apply styling from the toolbar at the top :arrow_upper_left: of the editing area.![](https://i.imgur.com/Cnle9f9.png) ::: - [x] **Q: Slides available after the course?** - A: They sure are! You will also have the access to this HackMD document (save the link). - The slides and tutorials are available here: **link here** - Access to e-lena (and the quizzes there) may discontinue. - We encourage you to share and use the material also in your own courses. The material is in git, and we welcome all feedback and edit suggestions (pull requests)! - [x] **Q: Has the Zoom meeting already started? I'm just gettin "The meeting has not started" -note.** - A: Make sure you have the full Zoom link when connecting! It's long and contains the password :) - [x] **Q: Should we be able to access the slides in e-elena? I can only see the first slide.** - A: Try navigating with the arrow keys :) ## CSC HPC ENVIRONMENT - [x] **Q: How can you place your own scratch to a global variable (like $WRKDIR), so that you can easily navigate there in each session? Always forgot to export between sessions.** - A: One way is to define alias in bashrc profiles or use export commands in `.bashrc` file so that every time you login those variables are set for you ``` export WRKDIR="/path/to/folder" ``` - Note, that GENERALLY we don't recommend adding stuff to your `.bashrc` as that is likely to cause problems down the line, but this is ok :) Some care should be taken if you are amember in more than one project, of course. - [x] **Q: Where does so called standard out and error go from SLURM jobs?** - A: There will be files created on the same folder where batch job is submitted. By default both stdin and stdout will go to file: `slurm-<jobid>.out`. You can also set them with specific file names in batch scripts using parameters like `--error` and `--output`. - [x] **Q: Will these work in ePouta as well?** - A: ePouta is a cloud service, and things work differently there. What has been described so far is regarding CSCs supercomputers, Puhti and Mahti. - [ ] **Q: I'm quite impressed by the Puhti web-inteface. Do you plan to add more kernels to Jupyter? I regularly use R, someties also python2 and bash in my own Jupyter installations. At least supporting R would be nice.** - A: Yes, we are planning to add more. Any requests and comments are very welcome. The system is still new and developing. - [x] **Q: There is no emacs or nano or pico when ins interactive mode, how to get those?** - A: Try ```module load nano``` - [x] **Q: Running ```esearch -db protein -query "Pythium [ORGN]"``` leads to: ```perl: warning: Setting locale failed. perl: warning: Please check that your locale settings: LANGUAGE = (unset), LC_ALL = (unset), LC_CTYPE = "UTF-8", LANG = "en_US.UTF-8" are supported and installed on your system. perl: warning: Falling back to a fallback locale ("en_US.UTF-8").``` And yes, I guess this is again the same thing I end up often with Puhti, I am using Mac and I think I once fixed this but likely no then. Or then this is something new. It works anyhow, just gives errors on the way.** - A: On Mac sometimes locale is not set. when you ssh from MAC to CSC environment, you see some wanrings on HPC systems. You may export locale settings. ``` export LANG=en_US.UTF-8 or export LC_ALL=C.UTF-8 ``` On Mac you can stop forwarding locale settings as below: ``` sudo vi /etc/ssh/ssh_config ``` comment the following line in `ssh_config` file with (#) ``` SendEnv LANG LC_* ``` After that, you can again ssh into HPC system and check if you have resolved the issue. Usually the issue should not effect the results but warnings are annoying. - Attendant comment: Add entry to ```~/.ssh/config``` for puhti (before general entry) ``` Host puhti.csc.fi SetEnv LC_ALL=en_US.UTF-8 SetEnv LANG=en_US.UTF-8 User cscuserid ```` - [ ] **Q: Can the account for SBATCH be set in an environment variable for the session?** - A:You can at least do the following: ``` export account=project_xxxx sbatch --account=$account batchscript.sh ``` - [x] **Q: I got ```sbatch: error: AssocMaxSubmitJobLimit sbatch: error: Batch job submission failed: Job violates accounting/QOS policy (job submit limit, user's size and/or time limits)``` message when trying to submit the job.** - A: For me it looks like you are launching two interactive sessions or you have wrong project name in batch script. We can surely help you after the presentation if needed - I (Julia) have the same error. I just solved it with Tuomo's tip. Copy&Paste added rogue spaces. (could you please share your script here if it a batch job) - Course participant tip: for me the problem was that when I copied the slurm script directly to nano, comments were broken to different lines. FIxing that fixed the error **<- try this!** (Great! Many thanks; idea is that **batch script should not have empty spaces or line before # (shebang) symbol**) - [x] **Q: Any special steps to end the ```sinteractive```session?** - A: Just use `exit` to come out of `sinteractive` environment - [ ] **Q: What is the most convenient way of getting a notice when a sbatch job is finished, its metrics and output?** - A: you set your e-mail in the SBATCH directives (using `--mail-type=END ` and also optionally setting an e-mail with `-email-user`) . On commandline, you can always monitor your jobs using `squeue -u $USER`. or even with `seff <job id>` to check the status of your job - - [ ] **Q: The job log that is emailed, is it available in the HPC environment? Like billing units used, memory and CPU time used** - Yes try with `seff <job-id>` commdand. You will get more details about the job including the ones you asked - [ ] **Q: Ok that is good, how do I find the job id when it is finished? Now I look in the out file name?** - A: Yes. you can check if you have file names like `out_<job id>.txt` in job-submitted folder. But there are more professional ways finding your jobs using command like 'sacct'. You can get the information on all of your jobs e.g., using `sacct -u $USER --format=JobID,JobName,MaxRSS,Elapsed -S 2021-11-20` (last flag with S is starting time. you can alos change as needed) - [ ] **Q: What is the email note setting in `#SBATCH --mail-user with e-mail id and mail type with --mail-type=END`?** (Works with mail-user set to email address and mail-type set to END; true we want notification when job finished, mail-user seems not to be needed; mail-type is enough) (I think by default it will send to your CSC-registered e-mail) - [ ] **Q: can you comment out SBATCH statements?** - A: try with `# and space before SBATCH ddirective` - [ ] **Q: What's the overhead (space, time) of SquashFS?** - A: I haven't yet really tested e.g. SquasFS vs NVMe. Benefits over lustre are clear. There is some time and memory overhead related to mounting the file, but at this point I don't have any specifics. Does not seem to be too large. I'm planning on doing more benchmarking later this year when I have time. - According to [Wikipedia](https://en.wikipedia.org/wiki/SquashFS) it's RO system and compressed. So I guess there's overhead in building it and it also partially duplicates the data. Useful nevertheless. ## DOCKER CONTAINERS - [ ] **Q: What if I get ```docker: failed to register layer: Error processing tar file(exit status 1): write /usr/bin/wall: no space left on device.``` on PWD?** - Try: Check docker images on host machine if you have downloaded many images using `docker images` command on the terminal - You can delete any images you don't need (use `docker rmi <image id> ` ) - [x] **Q: I have a [program](https://github.com/ariloytynoja/pagan2-msa#1-using-the-precompiled-docker-image-from-docker-hub) that runs with the docker command ```docker run --rm -v `pwd`:/data pagan2 --pileup --homopolymer -q 454_reads.fas -o 454_aligned ```. I can run it with singularity as ```singularity run -B /scratch:/scratch pagan2.sif --pileup --homopolymer -q /scratch/project_2003682/aloytyn/singularity/454_reads.fas -o /scratch/project_2003682/aloytyn/singularity/454_aligned.fas```. Is there possibility to map ```$PWD``` to ```/data``` as with docker.** -A: It works with ```singularity run -B `pwd`:/data pagan2.sif --pileup --homopolymer -q /data/454_reads.fas -o /data/454_aligned.fas```. Singularity doesn't understand Docker's WORKDIR. - [ ] **Q: What is an entrypoint script?** - A: ENTRYPOINT is an instruction in dockerfile to set executables that are run when the container is initiated - [ ] **Q: A general question: What are the drawbacks of Singularity -- or why is it so much less used than Docker? Or is it superior and going to replace Docker over time?** - A: Docker is more flexible if you have root access on machine you are running. (Writable containers etc). Main benefit of Singularity is that it can be run with normal user rights. Docker will probably remain the most popular technology for the foreseeable future, and Singularity will be used mostly for "niche" uses like HPC. - [ ] **Q: I've downloaded and converted a docker container to a singularity container for the proteomics program MaxQuant. I can't figure out how to properly run it if I type ```singularity exec ../maxquant_2.0.1.0.sif maxquant -help``` I get: ```/usr/local/bin/maxquant: line 4: dotnet: command not found```. If I just run the env ```singularity run ../maxquant_2.0.1.0.sif``` and then launch maxquant ```Singularity> maxquant``` I get ```Failed to initialize CoreCLR, HRESULT: 0x80004005```. How should I try to run this?** ## SINGULARITY CONTAINERS - [ ] **Q: Differences between Singularity and Docker?** - A: Docker can't be run with normal user rights, so it can't be run on Puhti. Singularity doesn't need any root rights. - [X] **Q:** There was a mention of ```okd``` container support in Rahti, will singularity containers run there? - A: On Rahti container cloud, singularity containers would work fine. Main thing is that the containerised application should be running under the user, not with root previleges. - [ ] **Q: How do I find the mounted paths from within a singularity session** - A: Can you please specify a bit what you want to find out. At least you can run `df` - I want to know which paths are writable, for eg command outputs. Side question - is there some other sink than ```/dev/null``` which is not writable? - A: Nothing is writable except what you bind on host. Bind targets need not exist inside the container. They will be created if necessary. So you can do something like `$PWD:$PWD` and current directory is writable from container. Stdout from container can be directed to host /dev/null. For other you could bind host /dev: `--bind /dev:/dev`. - [x] **Q:Where is the "hello2" exectuable (suggested by the `singularity run-help tutorial.sif` output)? Can't find it in singularity.sif container** - A: It is in ´found/me/hello2´ - A: How to find it is covered in tomorrow's tutorial - [X] ] **Q: Is headless X11 sessions available in singularity ?** - A: Yes if all necessary libraries are avilable in the container. The $DISPLAY issue I mentioned is at least partly related to this. - - [ ] **Q: I'm getting an error when I run:** ``` singularity exec --bind $SCRATCH:/scratch tutorial.sif ls /scratch WARNING: skipping mount of /scratch/project_2003682/training185: stat /scratch/project_2003682/training185: no such file or directory FATAL: container creation failed: mount /scratch/project_2003682 /training185->/scratch error: while mounting /scratch/project_2003682 /training185: mount source /scratch/project_2003682/training185 doesn't exist ``` - A: Make sure to have folder on host before you bind it in singularity - [X] **Q: In a batch file can --cleanenv be set in #SBATCH statements?** - A: The `--cleanenv` in singularity command can be set in Batch job also but make sure that you are not using any host environment variables inside the singularity container. - [ ] **Q: When using command 'singularity shell' in sinteractive mode then ls gives filesystem of container but when running singularity shell from login node then ls lists the home directory. What is the explanation?** - A: Use full path for listing files; Only login nodes have the HOME directories and are mounted by default `ls /` shows the container root etc. - [X] **Q: What would be the best practices you could recommend when using an containerized environment (my specific reference is R) that you want to enrich with project-specific libraries that should be available to all users in the project in a similar manner. The project-specific libraries may be rapidly evolving.** - A: In CSC envI aironment, r tools actually are rendered as singularity containers and updated with new versions of R all the time. For project-specific installations, we have good documentation on our CSC doc pages here : https://docs.csc.fi/apps/r-env-singularity/. Most relevant information for your question is under the section "R package installations". Please maintain package versions for reproducibility. If you plan to use completely different set of packages that are incompatible some how with currently available container versions at CSC, best is to build container by yourself by modifying one of the dockerfile from Rocker (https://github.com/rocker-org/rocker-versioned2/tree/master/dockerfiles) and add your custom packages on the top of it. And then convert it into singualrity container image. The later approach may be involved and requires bit docker/singularity skills. - [ ] **Q: What is the difference between Docker or Singularity containers and Anaconda environments?** - A: When it's in a container, it's all there (form host point-of view). Anaconda is a folder inside the host system, so it's less isolated from the host system. Conda will use host libraries, so updates might cause problems, unlike with Docker and Singularity. We will learn about this during the course :) - [ ] **Q: Can you explain again what the XDG_RUNTIME_DIR is?** -A: It's an environment variable needed by the host system. By default it is set to /run/user/<userid>. Since that folder does not exist inside the container, you get some (harmless but annoying) warnings. - [X] **Q: Is there a image with singularity installed that is has shown usable available in some image repository?** - A: I think there is some docker image where singularity is installed. I have tested the following image and has singularity installed in it: ``` docker pull quay.io/singularity/singularity:v3.9.1-slim-arm64 ``` You can pick different flavours/versions on quay.io registry - [X] **Q: (Bonus) I installed singularity with default settings in an ubuntu docker container. When trying to build an image I get the error `Failed to create user namespace: not allowed to create user namespace`. Any immediate ideas to resolve this?** - A: are you doing in PWD? PWD is docker-in-docker and might have some limitations. - No, doing it in local Docker installation on laptop. Singularity install page says "Nested installations inside containers are not recommended, and require the outer container to be run with full privilege." - A: The docker container needs to be running with the `--privileged` flag and you may want to look at model dockerfiles here: https://github.com/singularityhub/singularity-docker/blob/v3.9.0-slim/Dockerfile - Is this the definition for the image above? - Yes. You can check similar dockerfiles in the same github for different flavours and corresponding images in quay.io ## NEXTFLOW - [ ] **Q: Where is the `fastqc_demo` folder for Tutorial 2?** - A: It was included in the atr file yoy downloaded in tutorial 1. Go up one directory: `cd ../cd ../fastqc_demo` - [ ] **Q: What is the benefit over Snakemake?** - A: There are some comparison made in the article mentioned in the slides: https://www.nature.com/articles/nbt.3820 Main benefit according to that article is better integration of containers. ## ☃️ ICE BREAKER (HackMD -practice) Let's learn how to use this HackMD document by answering an ice breaker question! - [x] Do you need a course participation certificate from this course? (Format: First name (yes/no)) - Laxman (No) - Jonas (No) :smile: - Matias (yes) - Santtu (Yes) - Nick (no) - Lisa (yes) - Kari (yes) - Tuomo (yes) - Eva (yes) - Julia (yes) - Sonja (yes) - Tiina (yes) - Panu (no) - Sami (no) - Kisun (no) - Carlos (yes) - Binisha (Yes) - Tia (no) - Antti (no) - Tapani (no) - Ari (no) - Neha Goel (yes) - Katariina (no) ## ✏️ Add your questions here Please type your questions here. We will answer them, and organise the document topically. - [x] **Q: Have I clicked the edit mode on?** - A: Probably not yet.. ↖️ - [x] **Q: Should I copy-paste an old question to get started with a new one?** - A: A really good idea! Here's a template for you ⬇️ - [x] **Q: I think there are typos: should be ```python3-dev``` and ``` --recurse-submodules```. Also ```ln -s /usr/bin/python3 /usr/bin/python``` is needed.** - A: - [x] **Q: Can you explain again what the XDG_RUNTIME_DIR is?** - A: It's an environment variable needed by the host system. By default it is set to /run/user/>userid>. Since /run does not exist inside the container, you get some (harmless but annoying) warnings. Tip with environment variables: you can use `echo` command to see their values! - [ ] **Q: Can you somehow wrap-up here those steps you demoed to persist changes in container, or is that in some later tutorial?** - A: Ok, it is basically in tutorial 6, check that one :) - [ ] **Q: Can you please walk through the fastqc example. Why are the files handled as a pair and not as a list? Where does sample_id come from?** - A: Thanks. I just think that fastqc handles one file at time and considering them a pair is not necessary. - [x] **Q: We learned that in NextFlow the channel is implemented as files that are passed on to processes. Could the channels be read and witten from other sources, eg a database or a message queue?** - A: As long as you can get thoses database as variables, you can pass that information to create channels. Although reading those datases as channel object can be tricky. This may require some plug ins. Please read here: https://github.com/nextflow-io/nf-sqldb - [ ] **Q: Can you run some of the nextflow processes as array jobs (like sbatch_commandlist usuage)?** - A: I have not seen this case before. Because nextflow processes are triggered by the data in channels, data will be automically submitted to processes due to implicit parallelism in nextflow. No need to submit as array jobs separately (=nextflow does for you). - [ ] **Q: I'm trying the sarek example but get an error that "tabix" is not available. I supposed that it is in "samtools" and loaded that but it doesn't help. Any idea why is that? More generally, how can I find the content of a specific module? For example, does "samtools" also contain tabix and bcftools?** - A: As all necessary tools for Sarek worflow should be in the singularity image, it is possible that container image has not been built/downloaded properly. Restarting from scratch could help you. No need to load anny modules. --- **Write your questions ABOVE this line** The questions are moved upwards :arrow_up: into their categories when they get an answer.

    Import from clipboard

    Paste your markdown or webpage here...

    Advanced permission required

    Your current role can only read. Ask the system administrator to acquire write and comment permission.

    This team is disabled

    Sorry, this team is disabled. You can't edit this note.

    This note is locked

    Sorry, only owner can edit this note.

    Reach the limit

    Sorry, you've reached the max length this note can be.
    Please reduce the content or divide it to more notes, thank you!

    Import from Gist

    Import from Snippet

    or

    Export to Snippet

    Are you sure?

    Do you really want to delete this note?
    All users will lose their connection.

    Create a note from template

    Create a note from template

    Oops...
    This template has been removed or transferred.
    Upgrade
    All
    • All
    • Team
    No template.

    Create a template

    Upgrade

    Delete template

    Do you really want to delete this template?
    Turn this template into a regular note and keep its content, versions, and comments.

    This page need refresh

    You have an incompatible client version.
    Refresh to update.
    New version available!
    See releases notes here
    Refresh to enjoy new features.
    Your user state has changed.
    Refresh to load new user state.

    Sign in

    Forgot password

    or

    By clicking below, you agree to our terms of service.

    Sign in via Facebook Sign in via Twitter Sign in via GitHub Sign in via Dropbox Sign in with Wallet
    Wallet ( )
    Connect another wallet

    New to HackMD? Sign up

    Help

    • English
    • 中文
    • Français
    • Deutsch
    • 日本語
    • Español
    • Català
    • Ελληνικά
    • Português
    • italiano
    • Türkçe
    • Русский
    • Nederlands
    • hrvatski jezik
    • język polski
    • Українська
    • हिन्दी
    • svenska
    • Esperanto
    • dansk

    Documents

    Help & Tutorial

    How to use Book mode

    Slide Example

    API Docs

    Edit in VSCode

    Install browser extension

    Contacts

    Feedback

    Discord

    Send us email

    Resources

    Releases

    Pricing

    Blog

    Policy

    Terms

    Privacy

    Cheatsheet

    Syntax Example Reference
    # Header Header 基本排版
    - Unordered List
    • Unordered List
    1. Ordered List
    1. Ordered List
    - [ ] Todo List
    • Todo List
    > Blockquote
    Blockquote
    **Bold font** Bold font
    *Italics font* Italics font
    ~~Strikethrough~~ Strikethrough
    19^th^ 19th
    H~2~O H2O
    ++Inserted text++ Inserted text
    ==Marked text== Marked text
    [link text](https:// "title") Link
    ![image alt](https:// "title") Image
    `Code` Code 在筆記中貼入程式碼
    ```javascript
    var i = 0;
    ```
    var i = 0;
    :smile: :smile: Emoji list
    {%youtube youtube_id %} Externals
    $L^aT_eX$ LaTeX
    :::info
    This is a alert area.
    :::

    This is a alert area.

    Versions and GitHub Sync
    Get Full History Access

    • Edit version name
    • Delete

    revision author avatar     named on  

    More Less

    Note content is identical to the latest version.
    Compare
      Choose a version
      No search result
      Version not found
    Sign in to link this note to GitHub
    Learn more
    This note is not linked with GitHub
     

    Feedback

    Submission failed, please try again

    Thanks for your support.

    On a scale of 0-10, how likely is it that you would recommend HackMD to your friends, family or business associates?

    Please give us some advice and help us improve HackMD.

     

    Thanks for your feedback

    Remove version name

    Do you want to remove this version name and description?

    Transfer ownership

    Transfer to
      Warning: is a public team. If you transfer note to this team, everyone on the web can find and read this note.

        Link with GitHub

        Please authorize HackMD on GitHub
        • Please sign in to GitHub and install the HackMD app on your GitHub repo.
        • HackMD links with GitHub through a GitHub App. You can choose which repo to install our App.
        Learn more  Sign in to GitHub

        Push the note to GitHub Push to GitHub Pull a file from GitHub

          Authorize again
         

        Choose which file to push to

        Select repo
        Refresh Authorize more repos
        Select branch
        Select file
        Select branch
        Choose version(s) to push
        • Save a new version and push
        • Choose from existing versions
        Include title and tags
        Available push count

        Pull from GitHub

         
        File from GitHub
        File from HackMD

        GitHub Link Settings

        File linked

        Linked by
        File path
        Last synced branch
        Available push count

        Danger Zone

        Unlink
        You will no longer receive notification when GitHub file changes after unlink.

        Syncing

        Push failed

        Push successfully