feat: header & footer

This commit is contained in:
Ricardo
2020-12-10 11:58:10 +00:00
parent aa9872458d
commit 8fbd0a22be
50 changed files with 39795 additions and 314 deletions
+1 -1
View File
@@ -1,6 +1,6 @@
The MIT License (MIT)
Copyright (c) 2016 Protocol Labs
Copyright (c) 2020 Protocol Labs
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
-94
View File
@@ -1,94 +0,0 @@
# IPFS Blog Pipeline
This document describes the IPFS Blog work pipeline. This is the protocol of how work happens in this project and repository.
## Pipeline High Level Description (Model)
1. **Idea Generation** - The first step of the pipeline is to generate a set of blog post ideas. An idea should include a name, and a single sentence description of the thrust of the post, and a short abstract. (these will change over time, of course, but it's useful to be able to refer to the post ideas by name).
2. **Selection** - the maintainer and other people interested will assign Owners to a given post, decide on rough deadlines, and assign people to support (with image editing, review, QA, etc).
3. **Skeleton** - General list of the headings, things which we want to exposé, and code segments that will be relevant
4. **Research** - Identify the key points to discuss in the piece. This can cycle back to improve the skeleton as well.
5. **Writing** - Flesh out the material into smooth, interesting prose. This is the most writing-craft part of the pipeline.
6. **Review** - Review is an iterative process where the writer(s) and reviewer(s) discuss various facets of the post and refine it. This process is similar to Code Review. Review involves different pieces:
a. **Content Review** is focused on refining the quality of the written content, this involves review of the ideas, the points, the technical discussion, any assets (like images), and so on. This is the space for reviewing what the piece says.
b. **Technical Review** is focused on ensuring the content is technically correct. It is important that developers review and address any issues.
c. **Cohesion Review** is focused on how this post relates to others, and to the rest of the project. The goal is to surface any intersection points with other content, other projects, and so on. This makes the post richer, and makes it fit better in the larger context.
d. **Mechanics Review** is focused on things about our particular blog publishing process, things making sure all embedded assets are included directly in the post directory, links are relative, etc. (this needs to be a checklist)
7. **Backlog** - Once the post has finished review, it is marked ready to publish. This promotes the post into a backlog. The queue is not sequential, meaning that posts that enter it after others may be published before. The goal of the backlog is to aggregate content **_READY TO PUBLISH_** to create a better, more regular experience for blog readers.
8. **Publish** - Publishing the post involves pushing it to our blog website and various other communication channels. For example:
- Publishing on the blog website (and/or ipfs.io website)
- Publishing posts on Twitter, IRC, mailing lists, and so on.
- If relevant, promote on related publications
- Mail to specific interested groups or individuals.
## Pipeline Implementation
This is how the pipeline described above is actually implemented. We discuss the roles being played by various participants, the mechanics in GitHub (issues, pull requests, labels), and the artifacts (the text, markdown files, image assets, etc).
- **Repo:** We will run this pipeline primarily through a repository on github: https://github.com/ipfs/blog, we will use issues to source ideas for posts, and pull requests for fleshing out, writing, and reviewing posts.
### Pipeline Roles
- **Maintainer:** The pipeline has a "maintainer" that ensures the pipelines is progressing smoothly, and is there to ensure adherence to the guidelines and help address issues.
- **Owner:** Each post will have an "owner" that will pick up the post at Step 2 (Skeleton) and be responsible for running it through the pipeline to its conclusion. The owner can change, it just needs to be an explicit hand off, as the owner will be directly responsible individual for finishing and publishing post. The owner will work with whoever else is relevant to achieve the rest of the steps in the pipeline.
- **Reviewers:** Each post will have a set of reviewers that will come in during the review step of the pipeline.
- **Publishers:** The final step, publishing, may involve other people independent of the pipeline, that manage the various communication channels (blog website, mailing lists, social media, etc). It is the responsibility of the **Owner** to get what they need from the **Publishers** to deliver. **Important Note:** it is up to the **Maintainer** to figure out and decide when blog posts should be published, because broader context is required.
Note that the role of "author" is not used, as authorship may end up including the owner(s), reviewer(s), maintainer(s), and other writer(s) who help alongside. The final Authors of the piece are established based on the contribution. Hence, let's not say "author" when we mean "owner" or "writer".
### Pipeline Stage Mechanics
**Important Note** each of the pipeline stages has an associated **Github Label**, please use them! We use these labels to figure out where the blog post is in the pipeline. Post **Owners**: make sure both the issue and pull requests for your post have the right label, and are assigned to you. **Pipeline Maintainer**: please verify posts carry the right labels and are assigned to the owners.
1. **Idea Generation:** this part happens on the issue tracker: https://github.com/ipfs/blog/issues - each blog post idea is posted as an independent issue, with its own name, sentence description, and short abstract.
2. **Selection:** this part happens in the blog post's issue, with whatever relevant discussion should happen. From there, the issue is assigned to whoever is selected as "Owner".
3. **Skeleton:** this part happens as a pull request. A pull request is created adding a directory (draft), with markdown files for the post content (`index.md`) and the skeleton (`skeleton.md`). Copy the post skeleton directory into a new directory for your post. Fill in the skeleton (take a look at the example, and remove that file). And create a pull request:
```
# clone the repo if you haven't
git clone https://github.com/ipfs/blog
cd blog
# then edit drafts/my-post-draft/skeleton.md
cp -r drafts/post-draft-template drafts/my-post-draft
# remove the example when you're ready
rm drafts/my-post-draft/skeleton-example.md
```
4. **Research**: this should happen in the pull request. Feel free to drop down ideas in the pull request comments section, or in the files themselves. Whatever you find most productive! Feel free to involve others in the pull request. Source the knowledge from wherever you need to. This is a good time to line up any illustrations you may need.
5. **Writing**: this happens in the markdown file. At the end, the draft for review should be committed and on the github pull-request.
6. **Review**: this happens in the blog post pull request. Reviewers will check various parts of the post, for content, technical accuracy, story cohesion, and mechanics. (It is possible that the mechanics part is a checklist, and it may be able to be turned into a CI test). Reviewer and Owner iteration happens in the pull-request. Once the pull-request is ready, and all reviewers have signed off on it, the post can be merged. It will be merged as a draft, into the `drafts/` folder. At this point, the blog post issue moves to the Backlog stage.
7. **Backlog**: in this stage, all the post materials are ready to go and in the `drafts/` folder, and the post issue has the `Backlog` label. The post stays here until publication, which the maintainer and owner figure out together. During this time, the post may get "unfresh" (no longer accurate, or should also incorporate new news), if so, maintainer and owner can file a PR to improve the post.
8. **Publish**: this stage involves the following steps. These are mostly mechanical and involve support from a developer on the infra or web team (@lgierth as of June 2017). It is possible some of this can be automated with scripts, and CI tests.
- [ ] file a PR with changes necessary to publish
- [ ] move the post directory from the `drafts/` folder into `src/`
- [ ] adjust the filenames (to add the sequential number)
- [ ] change the post date to reflect publication date
- [ ] review + merge PR.
- [ ] publish blog website (blog.ipfs.io and on ipfs website)
- [ ] ensure all content is pinned
- [ ] ensure website is live and post is correct
- [ ] post and/or announce on communication channels:
- [ ] publish post in newsletter mailing list
- [ ] tweet out from @IPFSbot and RT
- [ ] post link to tweet in IRC
+3 -3
View File
@@ -27,7 +27,7 @@ With `make`, [`node`](http://nodejs.org) and `npm` installed on your system, you
**Run the site in dev mode**
```console
```bash
$ make dev
...
@@ -42,7 +42,7 @@ Run it and open <http://localhost:1313/> in your browser, and start editing your
**Build the production site**
```console
```bash
$ make
...
@@ -72,7 +72,7 @@ Back in October last year, the Go Core Dev Team for the IPFS, IPLD, and libp2p p
**To create your new post** find the last post in `content/post`, create a copy, and change the file name by incrementing the number in the title, and change the name to be a useful URL slug for your post. e.g.
```console
```bash
$ cd content/post
$ cp 66-london-hack-week-report.md 67-incredible-adventures.md
```
-36
View File
@@ -1,36 +0,0 @@
baseURL = "https://blog.ipfs.io"
relativeURLs = true
googleAnalytics = "UA-52930282-2"
ignoreFiles = [ "\\.js\\.tmp*"]
DefaultContentLanguage = "en"
languageCode = "en-us"
hasCJKLanguage = true
enableMissingTranslationPlaceholders = false
summaryLength = 20
paginate = 9
[params]
domain = "blog.ipfs.io"
name = "IPFS Blog"
title = "IPFS Blog"
description = "A peer-to-peer hypermedia protocol to make the web faster, safer, and more open."
author = "Protocol Labs"
github = "https://github.com/ipfs/blog"
social = [ { title = "Twitter", link = "https://twitter.com/IPFS" },
{ title = "Facebook", link = "https://www.facebook.com/sharer/sharer.php?u=https://ipfs.io" },
{ title = "YouTube", link = "https://www.youtube.com/channel/UCdjsUXJ3QawK4O5L1kqqsew" } ]
[outputs]
home = ["HTML", "RSS", "JSON"]
[languages]
[languages.en]
languageName = "English"
languageCode = "en"
weight = 0
[languages.zh-cn]
languageName = "中文(中国)"
contentDir = "content-i18n/zh-cn"
languageCode = "zh-cn"
weight = 10
+34 -4
View File
@@ -34,11 +34,41 @@ module.exports = {
},
themeConfig: {
dateFormat: 'DD MMMM YYYY',
socialLinks: [],
socialLinks: [
{
text: 'Twitter',
link: 'https://twitter.com/protocollabs',
icon: 'twitter-icon',
},
{
text: 'LinkedIn',
link: 'https://www.linkedin.com/company/protocollabs/',
icon: 'linkedin-icon',
},
{
text: 'YouTube',
link: 'https://www.youtube.com/ProtocolLabs/',
icon: 'youtube-icon',
},
],
footerLinks: [],
footerLegal: '',
headerLinks: [],
mobileNavLinks: [],
headerLinks: [
{ text: 'About', link: 'https://ipfs.io/#why' },
{ text: 'Install', link: 'https://ipfs.io/#install' },
{ text: 'Docs', link: 'https://docs.ipfs.io/' },
{ text: 'Team', link: 'https://ipfs.io/team' },
{ text: 'Blog', link: '/' },
{ text: 'Help', link: 'https://ipfs.io/help' },
],
mobileNavLinks: [
{ text: 'About', link: 'https://ipfs.io/#why' },
{ text: 'Install', link: 'https://ipfs.io/#install' },
{ text: 'Docs', link: 'https://docs.ipfs.io/' },
{ text: 'Team', link: 'https://ipfs.io/team' },
{ text: 'Blog', link: '/' },
{ text: 'Help', link: 'https://ipfs.io/help' },
],
},
plugins: [
['@vuepress/last-updated'],
@@ -91,7 +121,7 @@ module.exports = {
id: 'blog',
dirname: '_blog',
path: '/',
itemPermalink: '/blog/:slug',
itemPermalink: '/:slug',
layout: 'Blog',
itemLayout: 'BlogPost',
frontmatter: {
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
@@ -0,0 +1,44 @@
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8" /><meta content="IE=edge,chrome=1" http-equiv="X-UA-Compatible" />
<script type="text/javascript">window.NREUM||(NREUM={});NREUM.info={"beacon":"bam.nr-data.net","errorBeacon":"bam.nr-data.net","licenseKey":"f2b551a2d0","applicationID":"3289000","transactionName":"ew5WREZdD10GFB9QSVFOWUNXWwpSAhVEQhZLCVdH","queueTime":0,"applicationTime":11,"ttGuid":"","agentToken":null,"agent":"js-agent.newrelic.com/nr-632.min.js","extra":""}</script>
<script type="text/javascript">window.NREUM||(NREUM={}),__nr_require=function(e,n,t){function r(t){if(!n[t]){var o=n[t]={exports:{}};e[t][0].call(o.exports,function(n){var o=e[t][1][n];return r(o?o:n)},o,o.exports)}return n[t].exports}if("function"==typeof __nr_require)return __nr_require;for(var o=0;o<t.length;o++)r(t[o]);return r}({QJf3ax:[function(e,n){function t(e){function n(n,t,a){e&&e(n,t,a),a||(a={});for(var u=c(n),f=u.length,s=i(a,o,r),p=0;f>p;p++)u[p].apply(s,t);return s}function a(e,n){f[e]=c(e).concat(n)}function c(e){return f[e]||[]}function u(){return t(n)}var f={};return{on:a,emit:n,create:u,listeners:c,_events:f}}function r(){return{}}var o="nr@context",i=e("gos");n.exports=t()},{gos:"7eSDFh"}],ee:[function(e,n){n.exports=e("QJf3ax")},{}],3:[function(e,n){function t(e){return function(){r(e,[(new Date).getTime()].concat(i(arguments)))}}var r=e("handle"),o=e(1),i=e(2);"undefined"==typeof window.newrelic&&(newrelic=window.NREUM);var a=["setPageViewName","addPageAction","setCustomAttribute","finished","addToTrace","inlineHit","noticeError"];o(a,function(e,n){window.NREUM[n]=t("api-"+n)}),n.exports=window.NREUM},{1:12,2:13,handle:"D5DuLP"}],"7eSDFh":[function(e,n){function t(e,n,t){if(r.call(e,n))return e[n];var o=t();if(Object.defineProperty&&Object.keys)try{return Object.defineProperty(e,n,{value:o,writable:!0,enumerable:!1}),o}catch(i){}return e[n]=o,o}var r=Object.prototype.hasOwnProperty;n.exports=t},{}],gos:[function(e,n){n.exports=e("7eSDFh")},{}],handle:[function(e,n){n.exports=e("D5DuLP")},{}],D5DuLP:[function(e,n){function t(e,n,t){return r.listeners(e).length?r.emit(e,n,t):(o[e]||(o[e]=[]),void o[e].push(n))}var r=e("ee").create(),o={};n.exports=t,t.ee=r,r.q=o},{ee:"QJf3ax"}],id:[function(e,n){n.exports=e("XL7HBI")},{}],XL7HBI:[function(e,n){function t(e){var n=typeof e;return!e||"object"!==n&&"function"!==n?-1:e===window?0:i(e,o,function(){return r++})}var r=1,o="nr@id",i=e("gos");n.exports=t},{gos:"7eSDFh"}],G9z0Bl:[function(e,n){function t(){var e=d.info=NREUM.info,n=f.getElementsByTagName("script")[0];if(e&&e.licenseKey&&e.applicationID&&n){c(p,function(n,t){n in e||(e[n]=t)});var t="https"===s.split(":")[0]||e.sslForHttp;d.proto=t?"https://":"http://",a("mark",["onload",i()]);var r=f.createElement("script");r.src=d.proto+e.agent,n.parentNode.insertBefore(r,n)}}function r(){"complete"===f.readyState&&o()}function o(){a("mark",["domContent",i()])}function i(){return(new Date).getTime()}var a=e("handle"),c=e(1),u=(e(2),window),f=u.document,s=(""+location).split("?")[0],p={beacon:"bam.nr-data.net",errorBeacon:"bam.nr-data.net",agent:"js-agent.newrelic.com/nr-632.min.js"},d=n.exports={offset:i(),origin:s,features:{}};f.addEventListener?(f.addEventListener("DOMContentLoaded",o,!1),u.addEventListener("load",t,!1)):(f.attachEvent("onreadystatechange",r),u.attachEvent("onload",t)),a("mark",["firstbyte",i()])},{1:12,2:3,handle:"D5DuLP"}],loader:[function(e,n){n.exports=e("G9z0Bl")},{}],12:[function(e,n){function t(e,n){var t=[],o="",i=0;for(o in e)r.call(e,o)&&(t[i]=n(o,e[o]),i+=1);return t}var r=Object.prototype.hasOwnProperty;n.exports=t},{}],13:[function(e,n){function t(e,n,t){n||(n=0),"undefined"==typeof t&&(t=e?e.length:0);for(var r=-1,o=t-n||0,i=Array(0>o?0:o);++r<o;)i[r]=e[n+r];return i}n.exports=t},{}]},{},["G9z0Bl"]);</script><title>asciinema - Record and share your terminal sessions, the right way</title><link href="./ascii.css" media="all" rel="stylesheet" /><script src="./ascii.js"></script> <meta name="robots" content="noindex, nofollow">
<meta name="referrer" content="none">
</head><body class="iframe">
<div class="player"></div>
<div class="processing-info" style="display: none">
<p></p><p> </p>
</div>
<script>
$(function() {
tryCreatePlayer(
$('.player')[0],
{"id":"8pfrqis7qieqyscpivvebne22","duration":71.80826500000001,"stdout_frames_url":"./stdout.json","snapshot":[[["8945bffc4c8b: Download complete ",{}]],[["d304280c8bd1: Download complete ",{}]],[["Status: Image is up to date for jbenet/go-ipfs:latest ",{}]],[["jbenet ",{"fg":6}],["@ ",{}],["erebor ",{"fg":3,"bold":true}],[": ",{}],["~",{"fg":2}],[" ",{}],["% ",{"fg":3,"bold":true}],["mkdir -p /tmp/ipfs-docker-staging ",{}]],[["jbenet ",{"fg":6}],["@ ",{}],["erebor ",{"fg":3,"bold":true}],[": ",{}],["~",{"fg":2}],[" ",{}],["% ",{"fg":3,"bold":true}],["mkdir -p /tmp/ipfs-docker-data ",{}]],[["jbenet ",{"fg":6}],["@ ",{}],["erebor ",{"fg":3,"bold":true}],[": ",{}],["~",{"fg":2}],[" ",{}],["% ",{"fg":3,"bold":true}],["docker run -d --name ipfs-node -v /tmp/ipfs-docker-staging:/export -v /tmp/ipfs-",{}]],[["docker-data:/data/ipfs -p 8080:8080 -p 4001:4001 -p 5001:5001 jbenet/go-ipfs:latest ",{}]],[["faa8f714398c7a1a5a29adc2aed01857b41444ed53ec11863a3136ad37c8064c ",{}]],[["jbenet ",{"fg":6}],["@ ",{}],["erebor ",{"fg":3,"bold":true}],[": ",{}],["~",{"fg":2}],[" ",{}],["% ",{"fg":3,"bold":true}],["docker ps ",{}]],[["CONTAINER ID IMAGE COMMAND CREATED STATUS ",{}]],[[" PORTS NAMES ",{}]],[["faa8f714398c jbenet/go-ipfs:latest \"/usr/local/bin/star 2 seconds ago Up 1 seconds ",{}]],[[" 0.0.0.0:4001->4001/tcp, 0.0.0.0:5001->5001/tcp, 0.0.0.0:8080->8080/tcp ipfs-node ",{}]],[["jbenet ",{"fg":6}],["@ ",{}],["erebor ",{"fg":3,"bold":true}],[": ",{}],["~",{"fg":2}],[" ",{}],["% ",{"fg":3,"bold":true}],["docker exec faa8f714398c ipfs id ",{}]],[["{ ",{}]],[[" \"ID\": \"QmR1orZeiuzzMm1BKv71uqVhJVusyEQro2Lwtpi8gTKsky\", ",{}]],[[" \"PublicKey\": \"CAASpgIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCc9q/wUH0s3qyxP6ZasIaow9Bfj05p",{}]],[["AF2LgnwRNgF+0GLtD+0UjjvU4ZSPlyYmIEfTya5mXJU+NZVkizkrJcFkLGPOo/eN8Xar5aBdysKKmEsPf3CSsY7C7VZlYeGNm2XSiC",{}]],[["qZwaBEJ84y2ZBUjgKfsJ2seD4YNLk3Uj/VYA0ufoLf6VMMactBTwDJ+yXodVSu+69DaCUpuI0LjInyXm/pXR/d05O77lBIDw1ZYexC",{}]],[["G9qLIb297MRRlL9PCUlUzCzhQ9M8WZj5Bi4gdL3lJBVl8RtWs9RmLnJlKSpkCzQnS074zwHvq7GWI1g70ZbCJRXypyB5BCzEUwWrHB",{}]],[["NSpiAlAgMBAAE=\", ",{}]],[[" \"Addresses\": [ ",{}]],[[" \"/ip4/127.0.0.1/tcp/4001/ipfs/QmR1orZeiuzzMm1BKv71uqVhJVusyEQro2Lwtpi8gTKsky\", ",{}]],[[" \"/ip4/172.17.0.13/tcp/4001/ipfs/QmR1orZeiuzzMm1BKv71uqVhJVusyEQro2Lwtpi8gTKsky\" ",{}]],[[" ], ",{}]],[[" \"AgentVersion\": \"go-ipfs/0.3.5\", ",{}]],[[" \"ProtocolVersion\": \"ipfs/0.1.0\" ",{}]],[["}",{}],["%",{"bold":true,"inverse":true}],[" ",{}]],[["jbenet ",{"fg":6}],["@ ",{}],["erebor ",{"fg":3,"bold":true}],[": ",{}],["~",{"fg":2}],[" ",{}],["% ",{"fg":3,"bold":true}],["docker exec faa8f714398c ipfs swarm pe",{}],[" ",{"inverse":true}],[" ",{}]]],"width":102,"height":29},
{
speed: 1.0,
autoPlay: false,
loop: false,
fontSize: 'small',
theme: 'tango'
}
);
});
</script>
<script type="text/javascript">$(function() {
var target = parent.postMessage ? parent : (parent.document.postMessage ? parent.document : undefined);
if (typeof target != "undefined" && window !== window.parent) {
var w = $('.asciinema-player').width();
var h = $(document).height();
target.postMessage(['asciicast:size', { id: '8pfrqis7qieqyscpivvebne22', width: w, height: h }], '*');
}
function onMessage(e) {
var event = e.data[0];
if (event == 'asciicast:play') {
$('.start-prompt').click();
}
}
window.addEventListener("message", onMessage, false);
});</script></body></html>
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
@@ -0,0 +1,44 @@
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8" /><meta content="IE=edge,chrome=1" http-equiv="X-UA-Compatible" />
<script type="text/javascript">window.NREUM||(NREUM={});NREUM.info={"beacon":"bam.nr-data.net","errorBeacon":"bam.nr-data.net","licenseKey":"f2b551a2d0","applicationID":"3289000","transactionName":"ew5WREZdD10GFB9QSVFOWUNXWwpSAhVEQhZLCVdH","queueTime":0,"applicationTime":11,"ttGuid":"","agentToken":null,"agent":"js-agent.newrelic.com/nr-632.min.js","extra":""}</script>
<script type="text/javascript">window.NREUM||(NREUM={}),__nr_require=function(e,n,t){function r(t){if(!n[t]){var o=n[t]={exports:{}};e[t][0].call(o.exports,function(n){var o=e[t][1][n];return r(o?o:n)},o,o.exports)}return n[t].exports}if("function"==typeof __nr_require)return __nr_require;for(var o=0;o<t.length;o++)r(t[o]);return r}({QJf3ax:[function(e,n){function t(e){function n(n,t,a){e&&e(n,t,a),a||(a={});for(var u=c(n),f=u.length,s=i(a,o,r),p=0;f>p;p++)u[p].apply(s,t);return s}function a(e,n){f[e]=c(e).concat(n)}function c(e){return f[e]||[]}function u(){return t(n)}var f={};return{on:a,emit:n,create:u,listeners:c,_events:f}}function r(){return{}}var o="nr@context",i=e("gos");n.exports=t()},{gos:"7eSDFh"}],ee:[function(e,n){n.exports=e("QJf3ax")},{}],3:[function(e,n){function t(e){return function(){r(e,[(new Date).getTime()].concat(i(arguments)))}}var r=e("handle"),o=e(1),i=e(2);"undefined"==typeof window.newrelic&&(newrelic=window.NREUM);var a=["setPageViewName","addPageAction","setCustomAttribute","finished","addToTrace","inlineHit","noticeError"];o(a,function(e,n){window.NREUM[n]=t("api-"+n)}),n.exports=window.NREUM},{1:12,2:13,handle:"D5DuLP"}],"7eSDFh":[function(e,n){function t(e,n,t){if(r.call(e,n))return e[n];var o=t();if(Object.defineProperty&&Object.keys)try{return Object.defineProperty(e,n,{value:o,writable:!0,enumerable:!1}),o}catch(i){}return e[n]=o,o}var r=Object.prototype.hasOwnProperty;n.exports=t},{}],gos:[function(e,n){n.exports=e("7eSDFh")},{}],handle:[function(e,n){n.exports=e("D5DuLP")},{}],D5DuLP:[function(e,n){function t(e,n,t){return r.listeners(e).length?r.emit(e,n,t):(o[e]||(o[e]=[]),void o[e].push(n))}var r=e("ee").create(),o={};n.exports=t,t.ee=r,r.q=o},{ee:"QJf3ax"}],id:[function(e,n){n.exports=e("XL7HBI")},{}],XL7HBI:[function(e,n){function t(e){var n=typeof e;return!e||"object"!==n&&"function"!==n?-1:e===window?0:i(e,o,function(){return r++})}var r=1,o="nr@id",i=e("gos");n.exports=t},{gos:"7eSDFh"}],G9z0Bl:[function(e,n){function t(){var e=d.info=NREUM.info,n=f.getElementsByTagName("script")[0];if(e&&e.licenseKey&&e.applicationID&&n){c(p,function(n,t){n in e||(e[n]=t)});var t="https"===s.split(":")[0]||e.sslForHttp;d.proto=t?"https://":"http://",a("mark",["onload",i()]);var r=f.createElement("script");r.src=d.proto+e.agent,n.parentNode.insertBefore(r,n)}}function r(){"complete"===f.readyState&&o()}function o(){a("mark",["domContent",i()])}function i(){return(new Date).getTime()}var a=e("handle"),c=e(1),u=(e(2),window),f=u.document,s=(""+location).split("?")[0],p={beacon:"bam.nr-data.net",errorBeacon:"bam.nr-data.net",agent:"js-agent.newrelic.com/nr-632.min.js"},d=n.exports={offset:i(),origin:s,features:{}};f.addEventListener?(f.addEventListener("DOMContentLoaded",o,!1),u.addEventListener("load",t,!1)):(f.attachEvent("onreadystatechange",r),u.attachEvent("onload",t)),a("mark",["firstbyte",i()])},{1:12,2:3,handle:"D5DuLP"}],loader:[function(e,n){n.exports=e("G9z0Bl")},{}],12:[function(e,n){function t(e,n){var t=[],o="",i=0;for(o in e)r.call(e,o)&&(t[i]=n(o,e[o]),i+=1);return t}var r=Object.prototype.hasOwnProperty;n.exports=t},{}],13:[function(e,n){function t(e,n,t){n||(n=0),"undefined"==typeof t&&(t=e?e.length:0);for(var r=-1,o=t-n||0,i=Array(0>o?0:o);++r<o;)i[r]=e[n+r];return i}n.exports=t},{}]},{},["G9z0Bl"]);</script><title>asciinema - Record and share your terminal sessions, the right way</title><link href="./ascii.css" media="all" rel="stylesheet" /><script src="./ascii.js"></script> <meta name="robots" content="noindex, nofollow">
<meta name="referrer" content="none">
</head><body class="iframe">
<div class="player"></div>
<div class="processing-info" style="display: none">
<p></p><p> </p>
</div>
<script>
$(function() {
tryCreatePlayer(
$('.player')[0],
{"id":"8pfrqis7qieqyscpivvebne22","duration":71.80826500000001,"stdout_frames_url":"./stdout.json","snapshot":[[["8945bffc4c8b: Download complete ",{}]],[["d304280c8bd1: Download complete ",{}]],[["Status: Image is up to date for jbenet/go-ipfs:latest ",{}]],[["jbenet ",{"fg":6}],["@ ",{}],["erebor ",{"fg":3,"bold":true}],[": ",{}],["~",{"fg":2}],[" ",{}],["% ",{"fg":3,"bold":true}],["mkdir -p /tmp/ipfs-docker-staging ",{}]],[["jbenet ",{"fg":6}],["@ ",{}],["erebor ",{"fg":3,"bold":true}],[": ",{}],["~",{"fg":2}],[" ",{}],["% ",{"fg":3,"bold":true}],["mkdir -p /tmp/ipfs-docker-data ",{}]],[["jbenet ",{"fg":6}],["@ ",{}],["erebor ",{"fg":3,"bold":true}],[": ",{}],["~",{"fg":2}],[" ",{}],["% ",{"fg":3,"bold":true}],["docker run -d --name ipfs-node -v /tmp/ipfs-docker-staging:/export -v /tmp/ipfs-",{}]],[["docker-data:/data/ipfs -p 8080:8080 -p 4001:4001 -p 5001:5001 jbenet/go-ipfs:latest ",{}]],[["faa8f714398c7a1a5a29adc2aed01857b41444ed53ec11863a3136ad37c8064c ",{}]],[["jbenet ",{"fg":6}],["@ ",{}],["erebor ",{"fg":3,"bold":true}],[": ",{}],["~",{"fg":2}],[" ",{}],["% ",{"fg":3,"bold":true}],["docker ps ",{}]],[["CONTAINER ID IMAGE COMMAND CREATED STATUS ",{}]],[[" PORTS NAMES ",{}]],[["faa8f714398c jbenet/go-ipfs:latest \"/usr/local/bin/star 2 seconds ago Up 1 seconds ",{}]],[[" 0.0.0.0:4001->4001/tcp, 0.0.0.0:5001->5001/tcp, 0.0.0.0:8080->8080/tcp ipfs-node ",{}]],[["jbenet ",{"fg":6}],["@ ",{}],["erebor ",{"fg":3,"bold":true}],[": ",{}],["~",{"fg":2}],[" ",{}],["% ",{"fg":3,"bold":true}],["docker exec faa8f714398c ipfs id ",{}]],[["{ ",{}]],[[" \"ID\": \"QmR1orZeiuzzMm1BKv71uqVhJVusyEQro2Lwtpi8gTKsky\", ",{}]],[[" \"PublicKey\": \"CAASpgIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCc9q/wUH0s3qyxP6ZasIaow9Bfj05p",{}]],[["AF2LgnwRNgF+0GLtD+0UjjvU4ZSPlyYmIEfTya5mXJU+NZVkizkrJcFkLGPOo/eN8Xar5aBdysKKmEsPf3CSsY7C7VZlYeGNm2XSiC",{}]],[["qZwaBEJ84y2ZBUjgKfsJ2seD4YNLk3Uj/VYA0ufoLf6VMMactBTwDJ+yXodVSu+69DaCUpuI0LjInyXm/pXR/d05O77lBIDw1ZYexC",{}]],[["G9qLIb297MRRlL9PCUlUzCzhQ9M8WZj5Bi4gdL3lJBVl8RtWs9RmLnJlKSpkCzQnS074zwHvq7GWI1g70ZbCJRXypyB5BCzEUwWrHB",{}]],[["NSpiAlAgMBAAE=\", ",{}]],[[" \"Addresses\": [ ",{}]],[[" \"/ip4/127.0.0.1/tcp/4001/ipfs/QmR1orZeiuzzMm1BKv71uqVhJVusyEQro2Lwtpi8gTKsky\", ",{}]],[[" \"/ip4/172.17.0.13/tcp/4001/ipfs/QmR1orZeiuzzMm1BKv71uqVhJVusyEQro2Lwtpi8gTKsky\" ",{}]],[[" ], ",{}]],[[" \"AgentVersion\": \"go-ipfs/0.3.5\", ",{}]],[[" \"ProtocolVersion\": \"ipfs/0.1.0\" ",{}]],[["}",{}],["%",{"bold":true,"inverse":true}],[" ",{}]],[["jbenet ",{"fg":6}],["@ ",{}],["erebor ",{"fg":3,"bold":true}],[": ",{}],["~",{"fg":2}],[" ",{}],["% ",{"fg":3,"bold":true}],["docker exec faa8f714398c ipfs swarm pe",{}],[" ",{"inverse":true}],[" ",{}]]],"width":102,"height":29},
{
speed: 1.0,
autoPlay: false,
loop: false,
fontSize: 'small',
theme: 'tango'
}
);
});
</script>
<script type="text/javascript">$(function() {
var target = parent.postMessage ? parent : (parent.document.postMessage ? parent.document : undefined);
if (typeof target != "undefined" && window !== window.parent) {
var w = $('.asciinema-player').width();
var h = $(document).height();
target.postMessage(['asciicast:size', { id: '8pfrqis7qieqyscpivvebne22', width: w, height: h }], '*');
}
function onMessage(e) {
var event = e.data[0];
if (event == 'asciicast:play') {
$('.start-prompt').click();
}
}
window.addEventListener("message", onMessage, false);
});</script></body></html>
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
@@ -0,0 +1,44 @@
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8" /><meta content="IE=edge,chrome=1" http-equiv="X-UA-Compatible" />
<script type="text/javascript">window.NREUM||(NREUM={});NREUM.info={"beacon":"bam.nr-data.net","errorBeacon":"bam.nr-data.net","licenseKey":"f2b551a2d0","applicationID":"3289000","transactionName":"ew5WREZdD10GFB9QSVFOWUNXWwpSAhVEQhZLCVdH","queueTime":0,"applicationTime":11,"ttGuid":"","agentToken":null,"agent":"js-agent.newrelic.com/nr-632.min.js","extra":""}</script>
<script type="text/javascript">window.NREUM||(NREUM={}),__nr_require=function(e,n,t){function r(t){if(!n[t]){var o=n[t]={exports:{}};e[t][0].call(o.exports,function(n){var o=e[t][1][n];return r(o?o:n)},o,o.exports)}return n[t].exports}if("function"==typeof __nr_require)return __nr_require;for(var o=0;o<t.length;o++)r(t[o]);return r}({QJf3ax:[function(e,n){function t(e){function n(n,t,a){e&&e(n,t,a),a||(a={});for(var u=c(n),f=u.length,s=i(a,o,r),p=0;f>p;p++)u[p].apply(s,t);return s}function a(e,n){f[e]=c(e).concat(n)}function c(e){return f[e]||[]}function u(){return t(n)}var f={};return{on:a,emit:n,create:u,listeners:c,_events:f}}function r(){return{}}var o="nr@context",i=e("gos");n.exports=t()},{gos:"7eSDFh"}],ee:[function(e,n){n.exports=e("QJf3ax")},{}],3:[function(e,n){function t(e){return function(){r(e,[(new Date).getTime()].concat(i(arguments)))}}var r=e("handle"),o=e(1),i=e(2);"undefined"==typeof window.newrelic&&(newrelic=window.NREUM);var a=["setPageViewName","addPageAction","setCustomAttribute","finished","addToTrace","inlineHit","noticeError"];o(a,function(e,n){window.NREUM[n]=t("api-"+n)}),n.exports=window.NREUM},{1:12,2:13,handle:"D5DuLP"}],"7eSDFh":[function(e,n){function t(e,n,t){if(r.call(e,n))return e[n];var o=t();if(Object.defineProperty&&Object.keys)try{return Object.defineProperty(e,n,{value:o,writable:!0,enumerable:!1}),o}catch(i){}return e[n]=o,o}var r=Object.prototype.hasOwnProperty;n.exports=t},{}],gos:[function(e,n){n.exports=e("7eSDFh")},{}],handle:[function(e,n){n.exports=e("D5DuLP")},{}],D5DuLP:[function(e,n){function t(e,n,t){return r.listeners(e).length?r.emit(e,n,t):(o[e]||(o[e]=[]),void o[e].push(n))}var r=e("ee").create(),o={};n.exports=t,t.ee=r,r.q=o},{ee:"QJf3ax"}],id:[function(e,n){n.exports=e("XL7HBI")},{}],XL7HBI:[function(e,n){function t(e){var n=typeof e;return!e||"object"!==n&&"function"!==n?-1:e===window?0:i(e,o,function(){return r++})}var r=1,o="nr@id",i=e("gos");n.exports=t},{gos:"7eSDFh"}],G9z0Bl:[function(e,n){function t(){var e=d.info=NREUM.info,n=f.getElementsByTagName("script")[0];if(e&&e.licenseKey&&e.applicationID&&n){c(p,function(n,t){n in e||(e[n]=t)});var t="https"===s.split(":")[0]||e.sslForHttp;d.proto=t?"https://":"http://",a("mark",["onload",i()]);var r=f.createElement("script");r.src=d.proto+e.agent,n.parentNode.insertBefore(r,n)}}function r(){"complete"===f.readyState&&o()}function o(){a("mark",["domContent",i()])}function i(){return(new Date).getTime()}var a=e("handle"),c=e(1),u=(e(2),window),f=u.document,s=(""+location).split("?")[0],p={beacon:"bam.nr-data.net",errorBeacon:"bam.nr-data.net",agent:"js-agent.newrelic.com/nr-632.min.js"},d=n.exports={offset:i(),origin:s,features:{}};f.addEventListener?(f.addEventListener("DOMContentLoaded",o,!1),u.addEventListener("load",t,!1)):(f.attachEvent("onreadystatechange",r),u.attachEvent("onload",t)),a("mark",["firstbyte",i()])},{1:12,2:3,handle:"D5DuLP"}],loader:[function(e,n){n.exports=e("G9z0Bl")},{}],12:[function(e,n){function t(e,n){var t=[],o="",i=0;for(o in e)r.call(e,o)&&(t[i]=n(o,e[o]),i+=1);return t}var r=Object.prototype.hasOwnProperty;n.exports=t},{}],13:[function(e,n){function t(e,n,t){n||(n=0),"undefined"==typeof t&&(t=e?e.length:0);for(var r=-1,o=t-n||0,i=Array(0>o?0:o);++r<o;)i[r]=e[n+r];return i}n.exports=t},{}]},{},["G9z0Bl"]);</script><title>asciinema - Record and share your terminal sessions, the right way</title><link href="./ascii.css" media="all" rel="stylesheet" /><script src="./ascii.js"></script> <meta name="robots" content="noindex, nofollow">
<meta name="referrer" content="none">
</head><body class="iframe">
<div class="player"></div>
<div class="processing-info" style="display: none">
<p></p><p> </p>
</div>
<script>
$(function() {
tryCreatePlayer(
$('.player')[0],
{"id":"8pfrqis7qieqyscpivvebne22","duration":71.80826500000001,"stdout_frames_url":"./stdout.json","snapshot":[[["8945bffc4c8b: Download complete ",{}]],[["d304280c8bd1: Download complete ",{}]],[["Status: Image is up to date for jbenet/go-ipfs:latest ",{}]],[["jbenet ",{"fg":6}],["@ ",{}],["erebor ",{"fg":3,"bold":true}],[": ",{}],["~",{"fg":2}],[" ",{}],["% ",{"fg":3,"bold":true}],["mkdir -p /tmp/ipfs-docker-staging ",{}]],[["jbenet ",{"fg":6}],["@ ",{}],["erebor ",{"fg":3,"bold":true}],[": ",{}],["~",{"fg":2}],[" ",{}],["% ",{"fg":3,"bold":true}],["mkdir -p /tmp/ipfs-docker-data ",{}]],[["jbenet ",{"fg":6}],["@ ",{}],["erebor ",{"fg":3,"bold":true}],[": ",{}],["~",{"fg":2}],[" ",{}],["% ",{"fg":3,"bold":true}],["docker run -d --name ipfs-node -v /tmp/ipfs-docker-staging:/export -v /tmp/ipfs-",{}]],[["docker-data:/data/ipfs -p 8080:8080 -p 4001:4001 -p 5001:5001 jbenet/go-ipfs:latest ",{}]],[["faa8f714398c7a1a5a29adc2aed01857b41444ed53ec11863a3136ad37c8064c ",{}]],[["jbenet ",{"fg":6}],["@ ",{}],["erebor ",{"fg":3,"bold":true}],[": ",{}],["~",{"fg":2}],[" ",{}],["% ",{"fg":3,"bold":true}],["docker ps ",{}]],[["CONTAINER ID IMAGE COMMAND CREATED STATUS ",{}]],[[" PORTS NAMES ",{}]],[["faa8f714398c jbenet/go-ipfs:latest \"/usr/local/bin/star 2 seconds ago Up 1 seconds ",{}]],[[" 0.0.0.0:4001->4001/tcp, 0.0.0.0:5001->5001/tcp, 0.0.0.0:8080->8080/tcp ipfs-node ",{}]],[["jbenet ",{"fg":6}],["@ ",{}],["erebor ",{"fg":3,"bold":true}],[": ",{}],["~",{"fg":2}],[" ",{}],["% ",{"fg":3,"bold":true}],["docker exec faa8f714398c ipfs id ",{}]],[["{ ",{}]],[[" \"ID\": \"QmR1orZeiuzzMm1BKv71uqVhJVusyEQro2Lwtpi8gTKsky\", ",{}]],[[" \"PublicKey\": \"CAASpgIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCc9q/wUH0s3qyxP6ZasIaow9Bfj05p",{}]],[["AF2LgnwRNgF+0GLtD+0UjjvU4ZSPlyYmIEfTya5mXJU+NZVkizkrJcFkLGPOo/eN8Xar5aBdysKKmEsPf3CSsY7C7VZlYeGNm2XSiC",{}]],[["qZwaBEJ84y2ZBUjgKfsJ2seD4YNLk3Uj/VYA0ufoLf6VMMactBTwDJ+yXodVSu+69DaCUpuI0LjInyXm/pXR/d05O77lBIDw1ZYexC",{}]],[["G9qLIb297MRRlL9PCUlUzCzhQ9M8WZj5Bi4gdL3lJBVl8RtWs9RmLnJlKSpkCzQnS074zwHvq7GWI1g70ZbCJRXypyB5BCzEUwWrHB",{}]],[["NSpiAlAgMBAAE=\", ",{}]],[[" \"Addresses\": [ ",{}]],[[" \"/ip4/127.0.0.1/tcp/4001/ipfs/QmR1orZeiuzzMm1BKv71uqVhJVusyEQro2Lwtpi8gTKsky\", ",{}]],[[" \"/ip4/172.17.0.13/tcp/4001/ipfs/QmR1orZeiuzzMm1BKv71uqVhJVusyEQro2Lwtpi8gTKsky\" ",{}]],[[" ], ",{}]],[[" \"AgentVersion\": \"go-ipfs/0.3.5\", ",{}]],[[" \"ProtocolVersion\": \"ipfs/0.1.0\" ",{}]],[["}",{}],["%",{"bold":true,"inverse":true}],[" ",{}]],[["jbenet ",{"fg":6}],["@ ",{}],["erebor ",{"fg":3,"bold":true}],[": ",{}],["~",{"fg":2}],[" ",{}],["% ",{"fg":3,"bold":true}],["docker exec faa8f714398c ipfs swarm pe",{}],[" ",{"inverse":true}],[" ",{}]]],"width":102,"height":29},
{
speed: 1.0,
autoPlay: false,
loop: false,
fontSize: 'small',
theme: 'tango'
}
);
});
</script>
<script type="text/javascript">$(function() {
var target = parent.postMessage ? parent : (parent.document.postMessage ? parent.document : undefined);
if (typeof target != "undefined" && window !== window.parent) {
var w = $('.asciinema-player').width();
var h = $(document).height();
target.postMessage(['asciicast:size', { id: '8pfrqis7qieqyscpivvebne22', width: w, height: h }], '*');
}
function onMessage(e) {
var event = e.data[0];
if (event == 'asciicast:play') {
$('.start-prompt').click();
}
}
window.addEventListener("message", onMessage, false);
});</script></body></html>
@@ -0,0 +1,453 @@
[
[0.190907, "\u001b[?1034hbash-3.2$ "],
[1.132054, "i"],
[0.039645, "p"],
[0.031985, "f"],
[0.119961, "s"],
[0.383748, " "],
[0.16805, "i"],
[0.056155, "n"],
[0.135992, "i"],
[0.032029, "t"],
[0.351979, "\r\n"],
[0.022609, "initializing ipfs node at /Users/richard/.ipfs\r\n"],
[5.9e-5, "generating 2048-bit RSA keypair..."],
[0.140967, "done\r\n"],
[
0.000199,
"peer identity: QmPRG5gkguyRxP5GTPPHhnZoKpQQKh3vX3HhRbr7wWXwVY\r\n"
],
[
0.015911,
"to get started, enter:\r\n\r\n\tipfs cat /ipfs/QmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG/readme\r\n\r\n"
],
[0.030491, "bash-3.2$ "],
[1.437904, "i"],
[0.047972, "p"],
[0.03168, "f"],
[0.096119, "s"],
[0.144211, " "],
[0.135795, "c"],
[0.080171, "o"],
[0.055794, "n"],
[0.072042, "f"],
[0.079943, "i"],
[0.088066, "g"],
[0.095998, " "],
[0.216204, "-"],
[0.095662, "-"],
[0.160232, "j"],
[0.095869, "s"],
[0.096064, "o"],
[0.031834, "n"],
[0.160216, " "],
[1.031837, "D"],
[0.112017, "i"],
[0.0722, "s"],
[0.135807, "c"],
[0.471891, "o"],
[0.135395, "v"],
[0.13661, "e"],
[0.136, "r"],
[0.224181, "y"],
[0.503998, "."],
[0.520034, "M"],
[0.079201, "D"],
[0.136582, "N"],
[0.11198, "S"],
[0.367919, "."],
[0.575559, "E"],
[0.111945, "N"],
[0.656418, "\b\u001b[K"],
[0.151358, "n"],
[0.080652, "a"],
[0.088295, "b"],
[0.143724, "l"],
[0.074351, "e"],
[0.125039, "d"],
[0.335883, " "],
[0.216042, "f"],
[0.135913, "a"],
[0.120002, "l"],
[0.064216, "s"],
[0.120151, "e"],
[0.13631, "\r\n"],
[0.044433, "bash-3.2$ "],
[1.01146, "i"],
[0.04015, "p"],
[0.031628, "f"],
[0.112368, "s"],
[0.11992, " "],
[0.080112, "c"],
[0.079853, "o"],
[0.047993, "n"],
[0.064052, "f"],
[0.095936, "i"],
[0.112057, "g"],
[0.279873, " "],
[0.176094, "-"],
[0.095982, "-"],
[0.160314, "j"],
[0.096008, "s"],
[0.111699, "o"],
[0.032054, "n"],
[0.183832, " "],
[0.304111, "S"],
[0.144091, "w"],
[0.080078, "a"],
[0.128063, "r"],
[0.079913, "m"],
[0.447726, "."],
[0.680275, "A"],
[0.151787, "d"],
[0.119575, "d"],
[0.128313, "r"],
[0.272084, "F"],
[0.088249, "i"],
[0.151761, "l"],
[0.032038, "t"],
[0.12793, "e"],
[0.104202, "r"],
[0.104044, "s"],
[0.799982, " "],
[0.384962, "'[\r\n"],
[0.000285, "> \"/"],
[4.2e-5, "ip4/10.0.0"],
[2.4e-5, ".0/"],
[1.9e-5, "ipc"],
[3e-5, "id"],
[2.8e-5, "r/8"],
[1.8e-5, "\",\r\n"],
[0.000298, "> \""],
[3.9e-5, "/ip4/100."],
[2.6e-5, "64.0"],
[2.6e-5, ".0/"],
[2.2e-5, "ipc"],
[2e-5, "id"],
[2e-5, "r/1"],
[2.1e-5, "0"],
[2e-5, "\",\r\n"],
[0.000264, "> \"/ip"],
[4e-5, "4/169.254"],
[2.4e-5, ".0."],
[2.1e-5, "0/i"],
[2.1e-5, "pc"],
[2.5e-5, "idr"],
[2e-5, "/1"],
[1.7e-5, "6\""],
[1.7e-5, ",\r\n"],
[0.000176, "> \""],
[2.2e-5, "/ip4/172."],
[1.4e-5, "16."],
[1.3e-5, "0."],
[1.2e-5, "0/i"],
[1.2e-5, "pc"],
[1.3e-5, "id"],
[1.3e-5, "r/"],
[1.2e-5, "12"],
[1.2e-5, "\","],
[1.1e-5, "\r\n"],
[0.000158, "> \"/ip"],
[2.6e-5, "4/192.0.0"],
[1.4e-5, ".0/"],
[1.3e-5, "ip"],
[1.2e-5, "ci"],
[1.2e-5, "dr"],
[1.2e-5, "/2"],
[1.4e-5, "4\""],
[1.2e-5, ",\r\n"],
[0.000148, "> \"/i"],
[2.8e-5, "p4/192.0."],
[1.5e-5, "0.0"],
[1.3e-5, "/ip"],
[1.4e-5, "cid"],
[1.3e-5, "r/"],
[1.2e-5, "29"],
[4.6e-5, "\""],
[0.000107, ",\r\n> \"/"],
[1.6e-5, "ip4/19"],
[1.4e-5, "2.0"],
[1.2e-5, ".0."],
[2.1e-5, "8/i"],
[1.4e-5, "pci"],
[1.3e-5, "dr"],
[1.2e-5, "/3"],
[1.2e-5, "2\""],
[1.1e-5, ",\r\n"],
[0.000102, "> "],
[1.3e-5, " \""],
[1.1e-5, "/ip"],
[1.2e-5, "4/1"],
[1.2e-5, "92"],
[1.7e-5, ".0.0"],
[1.2e-5, ".1"],
[1.2e-5, "70"],
[1.1e-5, "/i"],
[1.2e-5, "pc"],
[1.2e-5, "id"],
[1.3e-5, "r/"],
[1.2e-5, "32"],
[1.1e-5, "\","],
[1.4e-5, "\r\n"],
[0.000124, "> \"/ip"],
[2.2e-5, "4/192.0"],
[1.4e-5, ".0.1"],
[1.2e-5, "71"],
[1.3e-5, "/i"],
[1.2e-5, "pc"],
[1.6e-5, "idr"],
[1.2e-5, "/3"],
[1.3e-5, "2\""],
[1.3e-5, ",\r\n"],
[0.0001, "> "],
[1.5e-5, " \"/ip4"],
[1.3e-5, "/19"],
[1.3e-5, "2.0"],
[1.2e-5, ".2"],
[1.2e-5, ".0/"],
[1.6e-5, "ip"],
[1.4e-5, "cid"],
[1.2e-5, "r/"],
[1.3e-5, "24"],
[1.2e-5, "\","],
[1.2e-5, "\r\n"],
[7.3e-5, "> "],
[1.3e-5, " \""],
[1.1e-5, "/ip"],
[1.2e-5, "4/"],
[1.2e-5, "192"],
[1.2e-5, ".16"],
[1.2e-5, "8."],
[1.2e-5, "0."],
[1.1e-5, "0/"],
[1.1e-5, "ip"],
[1.2e-5, "ci"],
[1.2e-5, "dr"],
[1.2e-5, "/1"],
[1.2e-5, "6\""],
[1.2e-5, ",\r\n"],
[9.5e-5, "> "],
[1.8e-5, " \"/ip4"],
[1.8e-5, "/198."],
[1.3e-5, "18"],
[1.9e-5, ".0.0"],
[1.3e-5, "/i"],
[1.3e-5, "pci"],
[1.6e-5, "dr"],
[1.2e-5, "/1"],
[1.1e-5, "5\""],
[1.3e-5, ",\r\n"],
[6.5e-5, "> "],
[1.2e-5, " "],
[1.9e-5, "\"/ip4"],
[1.2e-5, "/19"],
[1.2e-5, "8.5"],
[1.3e-5, "1."],
[1.2e-5, "10"],
[1.3e-5, "0.0"],
[1.1e-5, "/i"],
[1.2e-5, "pc"],
[1.3e-5, "id"],
[1.2e-5, "r/"],
[1.2e-5, "2"],
[1.2e-5, "4\""],
[1.1e-5, ",\r\n"],
[5.5e-5, "> "],
[1.3e-5, " "],
[1.2e-5, "\"/ip"],
[1.3e-5, "4/2"],
[1.1e-5, "03"],
[1.2e-5, ".0."],
[1.3e-5, "11"],
[1.2e-5, "3."],
[1.2e-5, "0/i"],
[1.2e-5, "pc"],
[1.2e-5, "id"],
[1.2e-5, "r/"],
[1.2e-5, "2"],
[1.3e-5, "4\""],
[1.3e-5, ",\r\n"],
[4.4e-5, "> "],
[1.4e-5, " "],
[1.2e-5, "\"/i"],
[1.2e-5, "p4/"],
[1.2e-5, "240"],
[1.3e-5, ".0."],
[1.1e-5, "0."],
[1.2e-5, "0/"],
[1.3e-5, "ip"],
[1.2e-5, "cid"],
[1.2e-5, "r/"],
[1.4e-5, "4\""],
[1.4e-5, "\r\n"],
[3.2e-5, "> "],
[1.2e-5, " ]'"],
[0.714449, "\r\n"],
[0.045413, "bash-3.2$ "],
[1.370534, "i"],
[0.04786, "p"],
[0.026068, "f"],
[0.093892, "s"],
[0.184034, " "],
[0.136132, "d"],
[0.127568, "a"],
[0.088249, "e"],
[0.096181, "m"],
[0.079865, "o"],
[0.063961, "n"],
[0.152096, " "],
[0.407895, "&"],
[0.247394, "\r\n"],
[0.000381, "[1] 35279\r\n"],
[0.011293, "bash-3.2$ "],
[0.008249, "Initializing daemon...\r\nAdjusting current ulimit to 1024.\r\n"],
[
10.014083,
"Swarm listening on /ip4/127.0.0.1/tcp/4001\r\nSwarm listening on /ip4/172.20.20.20/tcp/4001\r\nSwarm listening on /ip4/73.114.35.152/tcp/18405\r\nSwarm listening on /ip6/::1/tcp/4001\r\n"
],
[0.000119, "API server listening on /ip4/127.0.0.1/tcp/5001\r\n"],
[
0.000389,
"Gateway (readonly) server listening on /ip4/127.0.0.1/tcp/8080\r\nDaemon is ready\r\n"
],
[0.964809, "\r\n"],
[0.013156, "bash-3.2$ "],
[1.178453, "e"],
[0.153198, "c"],
[0.094802, "h"],
[0.112018, "o"],
[0.16794, " "],
[0.272266, "\""],
[0.167733, "h"],
[0.079942, "e"],
[0.088267, "l"],
[0.103975, "l"],
[0.119303, "o"],
[0.10486, " "],
[0.079784, "w"],
[0.096028, "o"],
[0.080085, "r"],
[0.087761, "l"],
[0.096235, "d"],
[0.391855, "\""],
[1.007834, " "],
[0.240097, "|"],
[0.112067, " "],
[0.648025, "i"],
[0.064063, "p"],
[0.023682, "f"],
[0.408048, "s"],
[0.439963, " "],
[0.088202, "a"],
[0.136021, "d"],
[0.111779, "d"],
[0.103941, "\r\n"],
[
0.02121,
"\r 12 B / ? [---------------------------------------------------------------=-----------] "
],
[
0.001441,
"\u001b[2K\radded QmT78zSuBmuS4z925WZfrqQ1qHaJ56DQaTfyMUF7F8ff5o QmT78zSuBmuS4z925WZfrqQ1qHaJ56DQaTfyMUF7F8ff5o\r\n"
],
[0.012692, "bash-3.2$ "],
[4.788769, "i"],
[0.031153, "p"],
[0.040482, "f"],
[0.11212, "s"],
[0.144036, " "],
[0.136157, "r"],
[0.135965, "e"],
[0.119678, "f"],
[0.112061, "s"],
[0.088267, " "],
[0.103768, "l"],
[0.111977, "o"],
[0.080035, "c"],
[0.160058, "a"],
[0.063909, "l"],
[0.11171, " "],
[0.203464, "}"],
[0.117103, " "],
[0.47958, "\b\u001b[K"],
[0.112193, "\b\u001b[K"],
[0.151992, "|"],
[0.135862, " "],
[0.272329, "g"],
[0.103978, "r"],
[0.137745, "e"],
[0.06984, "p"],
[0.120127, " "],
[0.144793, "Qm"],
[4.3e-5, "T78z"],
[3.1e-5, "Su"],
[3.1e-5, "Bm"],
[2.8e-5, "u"],
[5.7e-5, "S4"],
[1.9e-5, "z9"],
[1.7e-5, "2"],
[1.7e-5, "5W"],
[2.8e-5, "Z"],
[1.9e-5, "f"],
[1.8e-5, "rq"],
[2.5e-5, "Q"],
[2.1e-5, "1q"],
[1.9e-5, "Ha"],
[1.7e-5, "J"],
[1.8e-5, "56"],
[2.7e-5, "D"],
[1.7e-5, "Qa"],
[7e-5, "Tfy"],
[3e-5, "MUF"],
[2.4e-5, "7"],
[1.9e-5, "F8"],
[3.2e-5, "f"],
[1.8e-5, "f5"],
[6.8e-5, "o"],
[0.19044, "\r\n"],
[0.021628, "QmT78zSuBmuS4z925WZfrqQ1qHaJ56DQaTfyMUF7F8ff5o\r\n"],
[0.011431, "bash-3.2$ "],
[0.951239, "i"],
[0.047796, "p"],
[0.031958, "f"],
[0.087933, "s"],
[0.168199, " "],
[0.303978, "p"],
[0.21601, "i"],
[0.047779, "n"],
[0.184048, " "],
[0.216263, "l"],
[0.095827, "s"],
[0.272105, " "],
[0.247727, "|"],
[0.128116, " "],
[0.255844, "g"],
[0.120095, "r"],
[0.128171, "e"],
[0.079854, "p"],
[0.128151, " "],
[0.144327, "QmT78zSu"],
[3.7e-5, "BmuS4z"],
[2e-5, "92"],
[1.8e-5, "5W"],
[1.9e-5, "Zf"],
[1.9e-5, "r"],
[1.7e-5, "qQ"],
[1.7e-5, "1"],
[2.4e-5, "q"],
[3e-5, "Ha"],
[1.6e-5, "J5"],
[1.7e-5, "6"],
[1.7e-5, "D"],
[1.7e-5, "Q"],
[1.8e-5, "a"],
[6.7e-5, "Tf"],
[2.8e-5, "yMU"],
[5.3e-5, "F7F"],
[2.2e-5, "8f"],
[1.4e-5, "f5"],
[1.8e-5, "o"],
[0.390869, "\r\n"],
[0.02216, "QmT78zSuBmuS4z925WZfrqQ1qHaJ56DQaTfyMUF7F8ff5o recursive\r\n"],
[0.011183, "bash-3.2$ "]
]
@@ -0,0 +1,35 @@
<template>
<div v-if="crumbs" class="flex">
<div v-for="(crumb, index) in crumbs" :key="crumb.title">
<span v-if="index != 0">|</span>
<div class="inline mr-1">
<UnstyledLink
v-if="crumb.link"
class="text-blueGreen hover:underline"
:external="crumb.external"
:to="crumb.link"
>
{{ crumb.title }}
</UnstyledLink>
<span v-else>{{ crumb.title }}</span>
</div>
</div>
</div>
</template>
<script>
import UnstyledLink from '@theme/components/UnstyledLink'
export default {
name: 'Breadcrumbs',
components: {
UnstyledLink,
},
props: {
crumbs: {
type: Array,
required: true,
},
},
}
</script>
+219 -52
View File
@@ -1,67 +1,225 @@
<template>
<footer class="footer bg-deepBlue text-white py-8 md:py-16">
<footer class="footer bg-gradient-6 text-white py-8 md:py-16">
<div class="grid grid-cols-12 grid-margins">
<div class="col-start-2 md:col-start-1 col-span-10 md:col-span-12">
<div class="flex flex-col md:flex-row md:items-top md:justify-between">
<div class="flex flex-col md:flex-row md:items-center mb-8 md:mb-0">
<RouterLink
class="hover:opacity-75 transition transition-opacity duration-300 ease-in-out self-start"
to="/"
>
<SVGIcon
name="logo-icon"
title="Protocol Labs"
:class-list="['w-10', 'h-10', 'fill-current']"
/>
</RouterLink>
<ul class="flex flex-col md:flex-row mt-8 md:mt-0 md:ml-24">
<li
v-for="(item, index) in footerLinks"
:key="'link-' + index"
class="md:mr-10 last:mr-0"
:class="[{ 'mb-4': item.children && item.children.length }]"
<NewsletterForm class="col-start-1 col-span-12 pb-20" />
<div class="col-start-1 col-span-12 flex justify-between">
<div class="">
<ul class="">
<li class="sitemap-head">Protocol Labs</li>
<li>
<a
class="text-blueGreen hover:text-white"
href="https://protocol.ai"
>About</a
>
<NavLink
:item="item"
class="type-p3 hover:opacity-75 transition transition-opacity duration-300 ease-in-out font-semibold"
/>
<ul
v-if="item.children && item.children.length"
class="mt-4 mb-4"
>
<li
v-for="(childItem, childIndex) in item.children"
:key="'link-child' + childIndex"
class="mb-2 last:mb-0"
>
<NavLink
:item="childItem"
class="type-p4 hover:opacity-75 transition transition-opacity duration-300 ease-in-out"
/>
</li>
</ul>
</li>
</ul>
</div>
</li>
<li>
<a
class="text-blueGreen hover:text-white"
href="https://protocol.ai/join"
>Join</a
>
</li>
</ul>
</div>
<div class="grid-flex-cell">
<ul class="">
<li class="sitemap-head">IPFS</li>
<li>
<a
class="text-blueGreen hover:text-white"
href="https://ipfs.io/#install"
>Install</a
>
</li>
<li>
<a
class="text-blueGreen hover:text-white"
href="https://github.com/ipfs/ipfs"
>GitHub</a
>
</li>
<li>
<a
class="text-blueGreen hover:text-white"
href="https://github.com/ipfs/community/blob/master/code-of-conduct.md"
>Code of Conduct</a
>
</li>
<li>
<a
class="text-blueGreen hover:text-white"
href="https://docs.ipfs.io/"
>Docs</a
>
</li>
<li>
<a
class="text-blueGreen hover:text-white"
href="https://docs.ipfs.io/community/"
>Community</a
>
</li>
<li>
<a
class="text-blueGreen hover:text-white"
href="https://ipfs.io/help"
>Help</a
>
</li>
<li>
<a
class="text-blueGreen hover:text-white"
href="https://awesome.ipfs.io/"
>Awesome IPFS</a
>
</li>
<li>
<a
class="text-blueGreen hover:text-white"
href="https://cluster.ipfs.io/"
>IPFS Cluster</a
>
</li>
<li>
<a
class="text-blueGreen hover:text-white"
href="https://ipfs.io/team"
>Team</a
>
</li>
<li>
<a
class="text-blueGreen hover:text-white"
href="https://ipfs.io/media"
>Media</a
>
</li>
<li>
<a class="text-blueGreen hover:text-white" href="//blog.ipfs.io/"
>Blog</a
>
</li>
<li>
<a
class="text-blueGreen hover:text-white"
href="https://ipfs.io/legal/"
>Legal</a
>
</li>
</ul>
</div>
<div class="grid-flex-cell">
<ul class="">
<li class="sitemap-head">ProtoSchool</li>
<li>
<a
class="text-blueGreen hover:text-white"
href="https://proto.school/#/tutorials"
>Tutorials</a
>
</li>
<li>
<a
class="text-blueGreen hover:text-white"
href="https://proto.school/#/chapters"
>Chapters</a
>
</li>
</ul>
</div>
<div class="grid-flex-cell">
<ul class="">
<li class="sitemap-head">Filecoin</li>
<li>
<a
class="text-blueGreen hover:text-white"
href="https://filecoin.io/"
>About</a
>
</li>
<li>
<a
class="text-blueGreen hover:text-white"
href="https://filecoin.io/faqs/"
>FAQ</a
>
</li>
</ul>
<ul class="">
<li class="sitemap-head" style="padding-top: 30px">
Other Projects
</li>
<li>
<a
class="text-blueGreen hover:text-white"
href="https://libp2p.io/"
>libp2p</a
>
</li>
<li>
<a class="text-blueGreen hover:text-white" href="https://ipld.io/"
>IPLD</a
>
</li>
<li>
<a
class="text-blueGreen hover:text-white"
href="https://drand.love/"
>Drand</a
>
</li>
<li>
<a
class="text-blueGreen hover:text-white"
href="https://multiformats.io/"
>Multiformats</a
>
</li>
<li>
<a
class="text-blueGreen hover:text-white"
href="http://testground.ai/"
>Testground</a
>
</li>
</ul>
</div>
</div>
<div class="share-links">
<ul class="share list-unstyled">
<SocialLinks class="flex items-center" />
</div>
<div
v-if="$site.themeConfig.footerLegal"
class="flex justify-end type-p4 pt-16"
>
<p v-html="$site.themeConfig.footerLegal"></p>
</div>
</ul>
</div>
<div class="col-start-1 col-span-12">
<center>
© Protocol Labs | Except as
<a
class="text-blueGreen hover:text-white"
href="https://protocol.ai/legal/"
>noted</a
>, content licensed
<a
class="text-blueGreen hover:text-white"
href="https://creativecommons.org/licenses/by/3.0/"
>CC-BY 3.0.</a
>
</center>
</div>
</div>
</footer>
</template>
<script>
import NavLink from '@theme/components/NavLink.vue'
import SocialLinks from '@theme/components/SocialLinks'
import SVGIcon from '@theme/components/base/SVGIcon'
import NewsletterForm from '@theme/components/blog/NewsletterForm'
export default {
name: 'Footer',
components: { NavLink, SocialLinks, SVGIcon },
components: { SocialLinks, NewsletterForm },
computed: {
footerLinks() {
return this.$site.themeConfig.footerLinks
@@ -69,3 +227,12 @@ export default {
},
}
</script>
<style scoped>
.sitemap-head {
font-weight: 400;
font-style: normal;
text-transform: uppercase;
letter-spacing: 1px;
}
</style>
@@ -0,0 +1,115 @@
<template>
<mq-layout :mq="['sm', 'md']">
<transition name="transition-content" @after-enter="afterEnter">
<div
v-if="mobileNavActive"
v-scroll-lock="mobileNavActive"
class="mobile-nav bg-gradient-6 grid grid-cols-12 fixed h-full top-0 inset-x-0 text-white flex flex-col z-40"
>
<div class="col-span-10 col-start-2 flex flex-col py-8">
<div class="flex-grow justify-center flex flex-col">
<nav>
<ul>
<li
v-for="page in $site.themeConfig.mobileNavLinks"
:key="page.title"
class="mb-3"
>
<Link class="mobile-nav__link type-h1" :item="page" />
</li>
</ul>
</nav>
</div>
<SocialLinks class="mobile-nav_footer flex" />
</div>
</div>
</transition>
</mq-layout>
</template>
<script>
import { mapState } from 'vuex'
import SocialLinks from '@theme/components/SocialLinks'
import Link from '@theme/components/base/Link'
import trapFocus from '@theme/util/trapFocus'
export default {
name: 'MobileNav',
components: {
SocialLinks,
Link,
},
data() {
return {
tabItems: [],
}
},
computed: {
...mapState('appState', ['mobileNavActive', 'routerLocation']),
},
watch: {
routerLocation() {
if (this.mobileNavActive) {
this.$store.commit('appState/toggleMobileNav', false)
}
},
},
destroyed() {
window.removeEventListener('keydown', this.trapFocus)
},
methods: {
closeMenu() {
this.$store.commit('appState/toggleMobileNav', false)
},
setTabItems() {
if (this.tabItems.length) {
window.removeEventListener('keydown', this.trapFocus)
}
const tabItems = [
...Array.from(
this.$parent.$refs.nav.$el.querySelectorAll('.mobile-list-item')
),
...Array.from(this.$el.querySelectorAll('A, button')),
]
this.tabItems = tabItems.filter((el) => {
const style = window.getComputedStyle(el)
return style.display !== 'none'
})
this.trapFocus = trapFocus.bind(null, this.tabItems, this.closeMenu)
window.addEventListener('keydown', this.trapFocus)
},
afterEnter() {
this.setTabItems()
},
},
}
</script>
<style lang="postcss" scoped>
.mobile-nav__link {
position: relative;
}
.mobile-nav__link.router-link-active:after {
content: '';
height: 1px;
bottom: -2px;
background-color: currentColor;
@apply absolute;
@apply w-full;
@apply left-0;
@apply transition-opacity;
@apply duration-200;
}
.transition-content-enter-active,
.transition-content-leave-active {
@apply transition transform duration-300 ease-in-out opacity-100 scale-100;
}
.transition-content-enter,
.transition-content-leave-to {
@apply opacity-0 scale-105;
}
</style>
+211
View File
@@ -0,0 +1,211 @@
<template>
<nav
ref="nav"
class="fixed top-0 inset-x-0 transition duration-300 ease-out transform z-50"
:class="[
displayMode,
{
'-translate-y-full': navVisibility.navSticky,
navVisible: navVisibility.navVisible,
navSticky: navVisibility.navSticky,
mobileNavOpen: mobileNavActive,
},
]"
>
<div class="grid-margins">
<div class="flex justify-between items-center h-20">
<a
class="hover:opacity-75 transition transition-opacity duration-300 ease-in-out mobile-list-item"
href="https://blog.ipfs.io/"
>
<SVGIcon
name="ipfs-logo"
title="IPFS"
:class-list="['w-32', 'fill-current']"
/>
</a>
<ul class="nav__link-list hidden md:flex">
<li
v-for="page in $site.themeConfig.headerLinks"
:key="page.text"
class="nav__link-item ml-16 first:m-0 font-semibold"
>
<Link class="nav__link" :item="page" />
</li>
</ul>
<button
aria-label="Toggle Mobile Menu"
class="sm:visible md:hidden mobile-list-item"
@click="toggleMobileMenu"
>
<div class="hamburger-icon w-8 h-8"></div>
</button>
</div>
</div>
</nav>
</template>
<script>
import { throttle } from 'lodash'
import { mapState } from 'vuex'
import SVGIcon from '@theme/components/base/SVGIcon'
import Link from '@theme/components/base/Link'
export default {
name: 'Nav',
components: {
SVGIcon,
Link,
},
props: {
darkMode: {
type: Boolean,
default: false,
},
},
data() {
return {
navVisibility: {
navVisible: false,
navSticky: false,
},
}
},
computed: {
...mapState('appState', ['mobileNavActive', 'navHeight']),
displayMode() {
return 'text-white'
},
},
mounted() {
this.$store.commit(
'appState/setNavHeight',
this.$refs.nav.getBoundingClientRect().height
)
this.throttledFunction = throttle(this.handleScroll, 100)
window.addEventListener('scroll', this.throttledFunction)
},
destroyed() {
window.removeEventListener('scroll', this.throttledFunction)
},
methods: {
handleScroll() {
// responsive force: lower on mobile higher on desktop
const SCROLL_FORCE = ['sm', 'md'].includes(this.$mq) ? 100 : 250
const currentScrollPosition =
window.pageYOffset || document.documentElement.scrollTop
// ignore negative calculations on mobile
if (currentScrollPosition < 0) {
return
}
// true if scrolling up
this.showNav = currentScrollPosition < this.lastScrollPosition
const isOffset = currentScrollPosition > this.navHeight
const isScrollThresholdMet =
Math.abs(currentScrollPosition - this.lastScrollPosition) > SCROLL_FORCE
const currentVisiblity = this.navVisibility.navVisible
this.navVisibility = {
...this.navVisibility,
...{
navVisible: isOffset
? isScrollThresholdMet
? this.showNav
: currentVisiblity
: false,
navSticky: isOffset,
},
}
this.lastScrollPosition = currentScrollPosition
},
toggleMobileMenu() {
this.$store.commit('appState/toggleMobileNav', !this.mobileNavActive)
},
},
}
</script>
<style lang="postcss" scoped>
.navVisible {
@apply translate-y-0;
}
.navSticky {
@apply bg-gradient-6;
}
.mobileNavOpen {
@apply bg-transparent;
@apply text-white;
}
.hamburger-icon {
@apply relative;
}
.hamburger-icon:before,
.hamburger-icon:after {
content: '';
background-color: currentColor;
height: 2px;
@apply absolute;
@apply w-full;
@apply left-0;
@apply transition-transform;
@apply duration-300;
@apply ease-in-out;
@apply origin-center;
@apply transform;
}
.hamburger-icon:before {
top: 10px;
}
.hamburger-icon:after {
top: 20px;
}
.mobileNavOpen .hamburger-icon:before,
.mobileNavOpen .hamburger-icon:after {
top: 15px;
}
.mobileNavOpen .hamburger-icon:before {
@apply rotate-45;
}
.mobileNavOpen .hamburger-icon:after {
@apply -rotate-45;
}
.nav__link {
position: relative;
}
.nav__link:after {
content: '';
height: 1px;
bottom: -7px;
background-color: currentColor;
@apply absolute;
@apply w-full;
@apply left-0;
@apply opacity-0;
@apply transition-opacity;
@apply duration-200;
}
.nav__link:hover:after {
@apply opacity-100;
}
.nav__link.router-link-active:after {
@apply opacity-100;
}
</style>
@@ -1,6 +1,6 @@
<template>
<div
v-if="activeTags.length"
v-if="activeTags.length || searchedText.length"
class="border border-opacity-10 flex items-center rounded px-1 py-2"
>
<span class="p-1">
@@ -8,7 +8,17 @@
<strong
>{{ numberOfPosts }} result{{ numberOfPosts > 1 ? 's' : '' }}</strong
>
(newest first) with tag{{ numberOfPosts > 1 ? 's' : '' }}:
(newest first)
<span v-if="searchedText.length">
for "
<span v-for="text in searchedText" :key="text" class=""
>{{ text }}
</span>
"
</span>
<span v-if="activeTags.length"
>with tag{{ numberOfPosts > 1 ? 's' : '' }}:</span
>
</span>
<ul class="tags flex" itemprop="keywords">
<li
@@ -34,7 +44,12 @@ export default {
},
computed: {
activeTags() {
return this.$route.query.tags ? this.$route.query.tags.split(',') : []
const queryTags = this.$route.query.tags
return queryTags ? queryTags.split(',') : []
},
searchedText() {
const queryText = this.$route.query.search
return queryText ? queryText.split(',') : []
},
},
methods: {
+22 -74
View File
@@ -1,90 +1,38 @@
<template>
<div
class="card-post group bg-gray-pale rounded overflow-hidden flex flex-col transform hover:scale-105 duration-300 ease-in-out"
itemprop="mainEntityOfPage"
:to="path"
>
<article
itemprop="blogPost"
itemscope
itemtype="https://schema.org/BlogPosting"
>
<div class="cover embed-responsive embed-responsive-og">
<router-link :to="path" class="embed-responsive-item">
<LazyImage
class="h-full p-2"
img-class="h-full"
itemprop="image"
:alt="title"
:src="`/header_images/${
frontmatter.header_image
? frontmatter.header_image
: 'blog-placeholder.png'
}`"
:ctx="regularPath"
/>
</router-link>
</div>
<div class="pt-1 pb-4 px-4 flex flex-grow flex-col">
<router-link :to="path">
<h1 class="type-h5 font-bold text-primary hover:underline">
{{ title }}
</h1>
</router-link>
<div>
<PostMeta
:author="frontmatter.author"
:date="frontmatter.date"
:tags="frontmatter.tags"
class="type-p4 text-primary"
/>
</div>
<footer class="flex-grow">
<p
v-if="frontmatter.description || frontmatter.description"
class="type-p1-serif text-primary"
itemprop="description"
>
{{ frontmatter.description || frontmatter.description }}
</p>
</footer>
</div>
</article>
<div>
<RegularCard v-if="!card.type" v-bind="card" />
<component :is="computedCard" v-bind="card" />
</div>
</template>
<script>
import LazyImage from '@theme/components/base/LazyImage'
import PostMeta from '@theme/components/blog/PostMeta'
import RegularCard from '@theme/components/blog/RegularCard'
import NewslinkCard from '@theme/components/blog/NewslinkCard'
export default {
name: 'BlogCard',
components: { LazyImage, PostMeta },
components: { RegularCard, NewslinkCard },
inheritAttrs: false,
props: {
title: {
type: String,
required: true,
},
frontmatter: {
card: {
type: Object,
default: () => ({}),
validator: function (frontmatter) {
if (frontmatter.description && frontmatter.description.length > 200) {
return false
}
required: true,
},
},
computed: {
computedCard() {
if (!this.card.type) {
return null
}
return true
},
},
regularPath: {
type: String,
required: true,
},
path: {
type: String,
required: true,
switch (this.card.type) {
case 'newslink':
return NewslinkCard
default:
return null
}
},
},
}
@@ -1,5 +1,73 @@
<template>
<div id="#newsletter-form">newsletter form</div>
<div id="newsletter-form" class="flex justify-between items-center">
<div class="flex-shrink max-w-xl">
<h2 class="type-h2">Stay informed</h2>
<p class="mt-2">
Sign up for the IPFS Weekly newsletter (<a
class="text-blueGreen hover:underline"
href="/weekly-110"
>example</a
>) for the latest on releases, upcoming developments, community events,
and more.
</p>
</div>
<form
id="mc-embedded-subscribe-form"
action="https://ipfs.us4.list-manage.com/subscribe/post?u=25473244c7d18b897f5a1ff6b&amp;id=cad54b2230"
method="post"
name="mc-embedded-subscribe-form"
class="flex"
target="_blank"
novalidate
>
<div id="mc_embed_signup_scroll" class="flex">
<div class="fields flex flex-col">
<input
id="mce-EMAIL"
required
type="email"
aria-label="Email Address"
class="text-black p-2 rounded"
placeholder="email@your.domain"
value=""
name="EMAIL"
/>
<label class="pt-2 italic" for="gdpr_28879">
<input
id="gdpr_28879"
type="checkbox"
class=""
name="gdpr[28879]"
value="Y"
/><span class="pl-2">Please send me the newsletter</span>
</label>
</div>
<div class="ml-4">
<input
id="mc-embedded-subscribe"
type="submit"
value="Subscribe"
name="subscribe"
class="p-2 text-white bg-blueGreen rounded"
/>
</div>
</div>
<div id="mergeRow-gdpr">
<div>
<fieldset class="" name="interestgroup_field"></fieldset>
</div>
<div style="position: absolute; left: -5000px" aria-hidden="true">
<input
type="text"
name="b_25473244c7d18b897f5a1ff6b_cad54b2230"
tabindex="-1"
value=""
/>
</div>
<!-- real people should not fill this in and expect good things - do not remove this or risk form bot signups-->
</div>
</form>
</div>
</template>
<script>
@@ -0,0 +1,63 @@
<template>
<div
class="card-post group bg-gray-pale rounded overflow-hidden flex flex-col transform hover:scale-105 duration-300 ease-in-out"
itemprop="mainEntityOfPage"
>
<article
itemprop="blogPost"
itemscope
itemtype="https://schema.org/BlogPosting"
>
<div class="pt-1 pb-4 px-4 flex flex-grow flex-col">
<UnstyledLink :to="path" external>
<h1 class="type-h5 font-bold text-primary hover:underline">
{{ title }}
</h1>
</UnstyledLink>
<div>
<PostMeta
:author="frontmatter.author"
:date="frontmatter.date"
:tags="frontmatter.tags"
class="type-p4 text-primary"
/>
</div>
</div>
</article>
</div>
</template>
<script>
import UnstyledLink from '@theme/components/UnstyledLink'
import PostMeta from '@theme/components/blog/PostMeta'
export default {
name: 'BlogNewslinkCard',
components: {
UnstyledLink,
PostMeta,
},
inheritAttrs: false,
props: {
title: {
type: String,
required: true,
},
frontmatter: {
type: Object,
default: () => ({}),
validator: function (frontmatter) {
if (frontmatter.description && frontmatter.description.length > 200) {
return false
}
return true
},
},
path: {
type: String,
required: true,
},
},
}
</script>
@@ -0,0 +1,91 @@
<template>
<div
class="card-post group bg-gray-pale rounded overflow-hidden flex flex-col transform hover:scale-105 duration-300 ease-in-out"
itemprop="mainEntityOfPage"
:to="path"
>
<article
itemprop="blogPost"
itemscope
itemtype="https://schema.org/BlogPosting"
>
<div class="cover embed-responsive embed-responsive-og">
<router-link :to="path" class="embed-responsive-item">
<LazyImage
class="h-full p-2"
img-class="h-full"
itemprop="image"
:alt="title"
:src="`/header_images/${
frontmatter.header_image
? frontmatter.header_image
: 'blog-placeholder.png'
}`"
:ctx="regularPath"
/>
</router-link>
</div>
<div class="pt-1 pb-4 px-4 flex flex-grow flex-col">
<router-link :to="path">
<h1 class="type-h5 font-bold text-primary hover:underline">
{{ title }}
</h1>
</router-link>
<div>
<PostMeta
:author="frontmatter.author"
:date="frontmatter.date"
:tags="frontmatter.tags"
class="type-p4 text-primary"
/>
</div>
<footer class="flex-grow">
<p
v-if="frontmatter.description || frontmatter.description"
class="type-p1-serif text-primary"
itemprop="description"
>
{{ frontmatter.description || frontmatter.description }}
</p>
</footer>
</div>
</article>
</div>
</template>
<script>
import LazyImage from '@theme/components/base/LazyImage'
import PostMeta from '@theme/components/blog/PostMeta'
export default {
name: 'BlogRegularCard',
components: { LazyImage, PostMeta },
inheritAttrs: false,
props: {
title: {
type: String,
required: true,
},
frontmatter: {
type: Object,
default: () => ({}),
validator: function (frontmatter) {
if (frontmatter.description && frontmatter.description.length > 200) {
return false
}
return true
},
},
regularPath: {
type: String,
required: true,
},
path: {
type: String,
required: true,
},
},
}
</script>
+6
View File
@@ -1,4 +1,6 @@
import './styles/index.css'
import Vuex from 'vuex'
import { createStore } from '@theme/store/store'
import VScrollLock from 'v-scroll-lock'
import VueMq from 'vue-mq'
import { VLazyImagePlugin } from 'v-lazy-image'
@@ -22,9 +24,13 @@ export default ({ Vue, router, siteData }) => {
return originalPush.call(this, location)
}
Vue.use(Vuex)
Vue.use(VScrollLock)
Vue.use(VueMq, { breakpoints })
Vue.use(VLazyImagePlugin)
Vue.directive(Transition.name, Transition.directive)
const store = createStore()
Vue.mixin({ store: store })
}
+32 -12
View File
@@ -1,8 +1,9 @@
<template>
<Layout>
<div class="bg-gradient-6 py-20 text-white">
<div class="grid-margins">
<h1 class="type-h1">
<div class="grid-margins mt-8">
<Breadcrumbs :crumbs="breadcrumbs" />
<h1 class="type-h1 mt-4">
{{ $frontmatter.description }}
</h1>
<h2 class="mt-8 pr-40 type-h4">
@@ -22,7 +23,7 @@
v-for="page in publicPages"
:key="page.key"
class="mb-4"
v-bind="page"
:card="page"
/>
</div>
<div>
@@ -33,7 +34,6 @@
>Next</router-link
>
</div>
<NewsletterForm />
</div>
</Layout>
</template>
@@ -43,35 +43,51 @@ import Layout from '@theme/layouts/Layout.vue'
import Card from '@theme/components/blog/Card'
import SortAndFilter from '@theme/components/blog/SortAndFilter'
import NewsletterForm from '@theme/components/blog/NewsletterForm'
import Breadcrumbs from '@theme/components/Breadcrumbs'
import { getTags } from '@theme/util/tagUtils'
import { parseProtectedPost } from '@theme/util/blogUtils'
const protectedCardTypes = ['newslinks']
export default {
name: 'BlogIndex',
components: {
Card,
Layout,
Breadcrumbs,
SortAndFilter,
NewsletterForm,
},
data: function () {
return {
numberOfPagesToShow: 20,
delayValues: [0, 0.15, 0.3],
tags: [],
breadcrumbs: [
{ title: 'Home', link: 'https://blog.ipfs.io/', external: true },
{ title: 'Blog & News' },
],
}
},
computed: {
activeTags() {
return (this.$route.query.tags || '').split(',')
const queryTags = this.$route.query.tags
return queryTags ? queryTags.split(',') : []
},
searchedText() {
return (this.$route.query.search || '').split(',')
const queryText = this.$route.query.search
return queryText ? queryText.split(',') : []
},
publicPages: function () {
console.log({ tags: this.activeTags, text: this.searchedText })
let result = []
this.$pagination.pages.forEach((page) => {
if (protectedCardTypes.includes(page.frontmatter.url)) {
result = [
...result,
...parseProtectedPost(page, this.activeTags, this.searchedText),
]
return
}
return this.$pagination.pages.filter((page) => {
for (let i = 0; i < this.activeTags.length; i++) {
if (
!page.frontmatter.tags ||
@@ -91,11 +107,15 @@ export default {
}
}
return (
if (
page.frontmatter &&
(page.frontmatter.sitemap ? !page.frontmatter.sitemap.exclude : true)
)
) {
result.push(page)
}
})
return result
},
},
mounted() {
@@ -1,8 +1,11 @@
<template>
<main>
<Nav v-if="shouldDisplay('nav')" ref="nav" />
<MobileNav v-if="shouldDisplay('nav')" />
<Transition :with-key="$page.key" appear :after-leave="leaveScroll">
<component :is="layout" />
</Transition>
<Footer v-if="shouldDisplay('footer')" />
</main>
</template>
@@ -11,12 +14,16 @@ import Vue from 'vue'
import { setGlobalInfo } from '@app/util'
import Transition from '@theme/components/base/Transitions.vue'
import Footer from '@theme/components/Footer.vue'
import Nav from '@theme/components/Nav.vue'
import MobileNav from '@theme/components/MobileNav.vue'
export default {
name: 'GlobalLayout',
components: {
Footer,
Nav,
MobileNav,
Transition,
},
+23
View File
@@ -0,0 +1,23 @@
import Vue from 'vue'
const appState = {
namespaced: true,
state: {
mobileNavActive: false,
routerLocation: {},
navHeight: 0,
},
mutations: {
toggleMobileNav: (state, data) => {
Vue.set(state, 'mobileNavActive', data)
},
setNavHeight: (state, data) => {
Vue.set(state, 'navHeight', data)
},
setRouterLocation: (state, data) => {
Vue.set(state, 'routerLocation', data)
},
},
}
export default appState
+19
View File
@@ -0,0 +1,19 @@
import Vuex from 'vuex'
import appState from './appState'
const store = {
modules: {
appState,
},
}
export const createStore = (moduleState = {}) => {
const modifiedState = Object.assign({}, store)
Object.keys(moduleState).forEach((key) => {
const data = moduleState[key]
modifiedState.modules[key].state = data
})
return new Vuex.Store(modifiedState)
}
@@ -8,7 +8,7 @@
@screen md {
.grid-margins {
@apply mx-58px;
margin: 0 15%;
}
}
/* 1440 max width + 58px left & right padding */
@@ -0,0 +1 @@
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 553 235.3"><defs><style>.cls-1{fill:#fff}.cls-2{fill:#469ea2}.cls-3{fill:#6acad1}.cls-4,.cls-5{fill:#083b54}.cls-4{fill-opacity:.15}.cls-5{fill-opacity:.05}</style></defs><title>IPFS logo (new)</title><path class="cls-1" d="M239 63h17.8v105H239V63zm35.6 0h36.3c7.9 0 14.5.9 19.6 2.6s9.2 4.1 12.1 7.1a24.45 24.45 0 0 1 6.2 10.2 40.75 40.75 0 0 1 1.8 12.1 45.69 45.69 0 0 1-1.8 12.9 26.58 26.58 0 0 1-6.2 10.8 30.59 30.59 0 0 1-12.1 7.3c-5.1 1.8-11.5 2.7-19.3 2.7h-19.1V168h-17.5V63zm36.2 51a38.37 38.37 0 0 0 11.1-1.3 16.3 16.3 0 0 0 6.8-3.7 13.34 13.34 0 0 0 3.5-5.8 29.75 29.75 0 0 0 1-7.6 25.68 25.68 0 0 0-1-7.7 12 12 0 0 0-3.6-5.5 17.15 17.15 0 0 0-6.9-3.4 41.58 41.58 0 0 0-10.9-1.2h-18.5V114h18.5zm119.9-51v15.3h-49.2V108h46.3v15.4h-46.3V168h-17.8V63h67zm26.2 72.9c.8 6.9 3.3 11.9 7.4 15s10.4 4.7 18.6 4.7a32.61 32.61 0 0 0 10.1-1.3 20.52 20.52 0 0 0 6.6-3.5 12 12 0 0 0 3.5-5.2 19.08 19.08 0 0 0 1-6.4 16.14 16.14 0 0 0-.7-4.9 12.87 12.87 0 0 0-2.6-4.5 16.59 16.59 0 0 0-5.1-3.6 35 35 0 0 0-8.2-2.4l-13.4-2.5a89.76 89.76 0 0 1-14.1-3.7 33.51 33.51 0 0 1-10.4-5.8 22.28 22.28 0 0 1-6.3-8.8 34.1 34.1 0 0 1-2.1-12.7 26 26 0 0 1 11.3-22.4 36.35 36.35 0 0 1 12.6-5.6 65.89 65.89 0 0 1 15.8-1.8c7.2 0 13.3.8 18.2 2.5a34.46 34.46 0 0 1 11.9 6.5 28.21 28.21 0 0 1 6.9 9.3 42.1 42.1 0 0 1 3.2 11l-16.8 2.6c-1.4-5.9-3.7-10.2-7.1-13.1s-8.7-4.3-16.1-4.3a43.9 43.9 0 0 0-10.5 1.1 19.47 19.47 0 0 0-6.8 3.1 11.63 11.63 0 0 0-3.7 4.6 14.08 14.08 0 0 0-1.1 5.4c0 4.6 1.2 8 3.7 10.3s6.9 4 13.2 5.3l14.5 2.8c11.1 2.1 19.2 5.6 24.4 10.5s7.8 12.1 7.8 21.4a31.37 31.37 0 0 1-2.4 12.3 25.27 25.27 0 0 1-7.4 9.8 36.58 36.58 0 0 1-12.4 6.6 56 56 0 0 1-17.3 2.4c-13.4 0-24-2.8-31.6-8.5s-11.9-14.4-12.6-26.2h18z"/><path class="cls-2" d="M30.3 164l84 48.5 84-48.5V67l-84-48.5-84 48.5v97z"/><path class="cls-3" d="M105.7 30.1l-61 35.2a18.19 18.19 0 0 1 0 3.3l60.9 35.2a14.55 14.55 0 0 1 17.3 0l60.9-35.2a18.19 18.19 0 0 1 0-3.3L123 30.1a14.55 14.55 0 0 1-17.3 0zm84 48.2l-61 35.6a14.73 14.73 0 0 1-8.6 15l.1 70a15.57 15.57 0 0 1 2.8 1.6l60.9-35.2a14.73 14.73 0 0 1 8.6-15V79.9a20 20 0 0 1-2.8-1.6zm-150.8.4a15.57 15.57 0 0 1-2.8 1.6v70.4a14.38 14.38 0 0 1 8.6 15l60.9 35.2a15.57 15.57 0 0 1 2.8-1.6v-70.4a14.38 14.38 0 0 1-8.6-15L38.9 78.7z"/><path class="cls-2" d="M114.3 29l75.1 43.4v86.7l-75.1 43.4-75.1-43.4V72.3L114.3 29m0-10.3l-84 48.5v97l84 48.5 84-48.5v-97l-84-48.5z"/><path class="cls-2" d="M114.9 132h-1.2A15.66 15.66 0 0 1 98 116.3v-1.2a15.66 15.66 0 0 1 15.7-15.7h1.2a15.66 15.66 0 0 1 15.7 15.7v1.2a15.66 15.66 0 0 1-15.7 15.7zm0 64.5h-1.2a15.65 15.65 0 0 0-13.7 8l14.3 8.2 14.3-8.2a15.65 15.65 0 0 0-13.7-8zm83.5-48.5h-.6a15.66 15.66 0 0 0-15.7 15.7v1.2a15.13 15.13 0 0 0 2 7.6l14.3-8.3V148zm-14.3-89a15.4 15.4 0 0 0-2 7.6v1.2a15.66 15.66 0 0 0 15.7 15.7h.6V67.2L184.1 59zm-69.8-40.3L100 26.9a15.73 15.73 0 0 0 13.7 8.1h1.2a15.65 15.65 0 0 0 13.7-8l-14.3-8.3zM44.6 58.9l-14.3 8.3v16.3h.6a15.66 15.66 0 0 0 15.7-15.7v-1.2a16.63 16.63 0 0 0-2-7.7zM30.9 148h-.6v16.2l14.3 8.3a15.4 15.4 0 0 0 2-7.6v-1.2A15.66 15.66 0 0 0 30.9 148z"/><path class="cls-4" d="M114.3 213.2v-97.1l-84-48.5v97.1z"/><path class="cls-5" d="M198.4 163.8v-97l-84 48.5v97.1z"/></svg>

After

Width:  |  Height:  |  Size: 3.2 KiB

+58
View File
@@ -0,0 +1,58 @@
export const parseProtectedPost = (
post,
activeTags = [],
searchedText = []
) => {
if (!post.frontmatter.data) {
return []
}
const result = []
post.frontmatter.data.forEach((item) => {
for (let i = 0; i < activeTags.length; i++) {
if (!item.tags || !item.tags.includes(activeTags[i])) {
return false
}
}
for (let i = 0; i < searchedText.length; i++) {
if (!item.title.includes(searchedText[i])) {
return false
}
}
result.push({
type: post.frontmatter.type,
date: item.date,
title: item.title,
path: item.path,
...item,
frontmatter: {
date: item.date,
title: item.title,
path: item.path,
...item,
},
})
})
return result
// return post.frontmatter.data.map((item) => {
// return {
// type: post.frontmatter.type,
// date: item.date,
// title: item.title,
// path: item.path,
// ...item,
// frontmatter: {
// date: item.date,
// title: item.title,
// path: item.path,
// ...item,
// },
// }
// })
}
+9 -1
View File
@@ -1,8 +1,16 @@
import { isArray } from 'lodash'
export const getTags = (posts) => {
const tags = []
posts.forEach((post) => {
const postTags = post.frontmatter.tags.replaceAll(', ', ',').split(',')
if (!post.frontmatter.tags) {
return
}
const postTags = isArray(post.frontmatter.tags)
? post.frontmatter.tags
: post.frontmatter.tags.replace(/, /g, ',').split(',')
for (let i = 0; i < postTags.length; i++) {
if (postTags[i] && !tags.includes(postTags[i])) {
+1 -1
View File
@@ -57,5 +57,5 @@ hello from dockerized ipfs
[Kubernetes 1.0](http://kuberneteslaunch.com) comes out next week, so after that, we'll try using it to build a cluster of IPFS nodes that can store any kind of data and be able to retreive it from any other IPFS node. Not just with IPFS nodes in your cluster, but with everyone!
<iframe src="./ascii" style="width: 737px; height: 509px; overflow: hidden;" scrolling="no"></iframe>
<iframe src="/blog/001-run-ipfs-on-docker/ascii" style="width: 737px; height: 509px; overflow: hidden;" scrolling="no"></iframe>
<p class="powered">asciicast powered by <a href="https://asciinema.org/" target="_top">asciinema</a></p>
+2 -1
View File
@@ -37,7 +37,8 @@ It's usually not a good idea to run a public-facing service as root. So we'll cr
## Adding content to IPFS
<!-- {{< asciinema id="player-container" data="asciicast-85339.json" width="88" height="50" >}} -->
<iframe src="/blog/22-run-ipfs-on-a-vps/ascii" style="width: 737px; height: 509px; overflow: hidden;" scrolling="no"></iframe>
<p class="powered">asciicast powered by <a href="https://asciinema.org/" target="_top">asciinema</a></p>
First let's initialize the IPFS config:
+1 -1
View File
@@ -42,7 +42,7 @@ IPNS over pubsub gets the word out quicker to peers that are interested when an
Smoosh your CIDs into whatever version you like - you can now add data under a version 0 CID and get it back using a version 1 CID and vice versa. Now that you have this freedom you can encode them with whatever multibase encoding you like. Version 0 CIDs are all base58btc but if you convert to a version 1 CID you can encode it with base2, base32, base64url or whatever:
```console
```bash
# base2
010111000000010010001000000100011011010100010010000001010010111001110001011010111100010100000111000011101010101010101101111100000001011101110001011110100001000100111010101101010111111001000111110001001010000101100010110000001000011110101110100100010101110110100010110100110000001110
# base32
+2 -2
View File
@@ -18,14 +18,14 @@ header_image: js-ipfs-placeholder.png
As a stepping stone towards switching to CIDv1 by default for all CIDs, we're shipping a small change to v1 CIDs that means their string form is `base32` encoded instead of `base58btc`. So, instead of:
```console
```bash
$ jsipfs add --cid-version 1 guardian.jpg
added zb2rhk6GMPQF3hfzwXTaNYFLKomMeC6UXdUt6jZKPpeVirLtV guardian.jpg
```
You'll now get back a `base32` encoded CID:
```console
```bash
$ jsipfs add --cid-version 1 guardian.jpg
added bafkreibu6pkzh33dfwfa3bg3twih7uiohu6d6cr34txljekdn3cvwoujiu guardian.jpg
```
+4 -4
View File
@@ -9,7 +9,7 @@ header_image: js-ipfs-placeholder.png
> Garbage collection, gossipsub, IPNS support for ipfs resolve, oh my!
```console
```bash
$ npm install -g ipfs
```
@@ -25,7 +25,7 @@ This is essential for keeping your repo to a manageable size, but must be run ma
Use it with the following command:
```console
```bash
$ jsipfs repo gc
removed Qmfoo
removed Qmbar
@@ -33,7 +33,7 @@ removed Qmbar
To prevent blocks being collected, pin them:
```console
```bash
$ jsipfs pin add Qmbaz
pinned Qmbaz recursively
```
@@ -50,7 +50,7 @@ Read more about the design at [`libp2p/specs/pubsub/gossipsub`](https://github.c
You can now resolve [IPNS](https://docs.ipfs.io/guides/concepts/ipns/) names via `ipfs resolve`, what's more the recursive option is now on by default.
```console
```bash
$ jsipfs resolve /ipns/Qmqux
/ipfs/Qmgarply
```
+4 -4
View File
@@ -17,7 +17,7 @@ IPFS now supports the `jsipfs config profile` subcommand which you can use to up
You can examine available profiles with the `jsipfs config profile ls` command:
```console
```bash
$ jsipfs config profile ls
server:
Recommended for nodes with public IPv4 address (servers, VPSes, etc.)...
@@ -35,7 +35,7 @@ default-power:
Apply them with `jsipfs config profile apply`:
```console
```bash
$ jsipfs config profile apply lowpower
... output shows the difference between the old config and the new
```
@@ -44,13 +44,13 @@ You will need to restart your daemon for changes to take effect.
Profiles can also be applied on init:
```console
```bash
$ jsipfs init --profile server
```
Or when starting the daemon (more on that in the 'Init and start' section below):
```console
```bash
$ jsipfs daemon --init-profile server
```
+1 -1
View File
@@ -52,7 +52,7 @@ To ease the transition we support CID v0 converted to v1 (with `dag-pb` multicod
These have been available in core for a while now and we finally got round to surfacing them in the CLI. e.g.
```console
```bash
$ jsipfs dag put '""IPLD RULEZ""'
bafyreia5coklfzblgd3reqwaieafmpasdceqmcnjrowre3623mtb4nxlhm
@@ -35,7 +35,8 @@ collaborative clusters can be found at
and re-start replication whenever you want. Also, here's a quick video to show
how easy it is:
<!-- <script id="asciicast-yV2Bk4nlrPAQ6MQ4w6z3ea0uZ" src="https://asciinema.org/a/yV2Bk4nlrPAQ6MQ4w6z3ea0uZ.js" async></script> -->
<iframe src="https://asciinema.org/a/yV2Bk4nlrPAQ6MQ4w6z3ea0uZ/iframe" style="width: 737px; height: 509px; overflow: hidden;" scrolling="no"></iframe>
<p class="powered">asciicast powered by <a href="https://asciinema.org/" target="_top">asciinema</a></p>
We hope that collaborative clusters will allow the community to participate in
the distribution and seeding of data they care about, enabling easy "mirroring"
+2 -2
View File
@@ -53,7 +53,7 @@ Turns out, it's really important for package managers to retain file metadata, p
For example, there's two new options to `jsipfs add` that allow `mode` and `mtime` to be preserved as the file is added to IPFS:
```console
```bash
$ jsipfs add -r --preserve-mtime --preserve-mode ~/Desktop/gif
added QmT6WX9McZyx5ZoisRgpsjYKDBWnYpMnBLpfAgjW5kavBA gif/yesthisisdog.jpg
added QmXMrFfZ9zHLZKN7xP2dX76YFFhvBJsQkd4fLnTDkyR31Q gif
@@ -61,7 +61,7 @@ added QmXMrFfZ9zHLZKN7xP2dX76YFFhvBJsQkd4fLnTDkyR31Q gif
Ok, no big changes there aside from the new options, buuut, now when you list directory contents you get `Mode` and `Mtime` info:
```console
```bash
$ jsipfs ls QmXMrFfZ9zHLZKN7xP2dX76YFFhvBJsQkd4fLnTDkyR31Q -v
Mode Mtime Hash Size Name
-rw-r--r-- Apr 16, 2018, 12:20:33 PM GMT+1 QmT6WX9McZyx5ZoisRgpsjYKDBWnYpMnBLpfAgjW5kavBA 87779 yesthisisdog.jpg
+5 -5
View File
@@ -21,7 +21,7 @@ We've also merged some of our repos together which were logically intertwined. O
Release Candidate builds of [`js-ipfs`](https://www.npmjs.com/package/ipfs) and [`js-ipfs-http-client`](https://www.npmjs.com/package/ipfs-http-client) are now being published to npm with every build of master, so you can try out the very bleeding edge with:
```console
```bash
$ npm install -g ipfs@next
or
$ npm install ipfs-http-client@next
@@ -33,13 +33,13 @@ This will download and install a version of `js-ipfs` and/or `js-ipfs-http-clien
Publishing to Docker Hub has been restored so you can get a container running the latest and greatest `js-ipfs` with:
```console
```bash
$ docker pull ipfs/js-ipfs
```
You can also pull pre-releases at any time with:
```console
```bash
$ docker pull ipfs/js-ipfs:next
```
@@ -49,13 +49,13 @@ Check out all the releases at: https://hub.docker.com/r/ipfs/js-ipfs
The [MFS][] CLI now supports nanosecond mtimes, use it with the following commands:
```console
```bash
$ jsipfs mkdir /directory --mtime 1000 --mtime-nsecs 5
```
`--mode` and `--mtime` are now also supported when piping files to `jsipfs add`:
```console
```bash
$ cat ./file.txt | jsipfs add --mode 0500
```
+2 -1
View File
@@ -24,7 +24,8 @@ As Testground graduates from the cozy incubation nest of the IPFS Project, we
Testground is a platform for testing, benchmarking, and simulating distributed and p2p systems at scale. It's designed to be multilingual and runtime-agnostic, scaling gracefully from 2 to 10k instances as needed.
<!-- <script src="https://asciinema.org/a/wOeDmrj9HwA4ZYb9fIR6f4dxN.js" id="asciicast-wOeDmrj9HwA4ZYb9fIR6f4dxN" async></script> -->
<iframe src="https://asciinema.org/a/wOeDmrj9HwA4ZYb9fIR6f4dxN/iframe" style="width: 737px; height: 509px; overflow: hidden;" scrolling="no"></iframe>
<p class="powered">asciicast powered by <a href="https://asciinema.org/" target="_top">asciinema</a></p>
Testground aims to support **a variety of testing workflows** such as experimental/iterative development, A/B testing, backwards/forward-compatibility testing, interoperability testing, and CI workflows.
+3 -3
View File
@@ -29,7 +29,7 @@ The full [DHT][] implementation for JS IPFS with all the [changes made in Go IPF
You can enable the [DHT][] for JS IPFS daemons via the command line. To put your node into client mode run:
```console
```bash
$ jsipfs config Routing.Type dhtclient
```
@@ -68,7 +68,7 @@ With the release of `js-IPFS@0.48.0`, all blocks are now stored against the base
You may notice this when starting up your node:
```console
```bash
$ jsipfs daemon
Initializing IPFS daemon...
js-ipfs version: 0.48.0
@@ -79,7 +79,7 @@ Incompatible repo version. Migration needed. Pass --migrate for automatic migrat
Just pass `--migrate` and your blockstore will be converted:
```console
```bash
$ jsipfs daemon --migrate
Initializing IPFS daemon...
js-ipfs version: 0.48.0
+5 -5
View File
@@ -27,7 +27,7 @@ Previously go-ipfs generated 2048 bit RSA keys for new nodes, but it will now us
Along with switching the default key type, we've added support for rotating Identity keys. If you would like to change the key type of your IPFS node, you can now do so with the rotate command. **NOTE: This will affect your Peer Id, so be sure you want to do this!** Your existing identity key will be backed up in the Keystore so that it can still be referenced for things like IPNS records.
```console
```bash
$ ipfs key rotate -o my-old-key -t ed25519
```
@@ -35,7 +35,7 @@ $ ipfs key rotate -o my-old-key -t ed25519
Speaking of backing up keys, we've added commands to allow you to export and import keys from the IPFS Keystore to a local .key file. This does not currently apply to the IPFS identity key, `self`, which is housed in the configuration file.
```console
```bash
$ ipfs key gen mykey
$ ipfs key export -o mykey.key mykey # ./<name>.key is the default path
$ ipfs key import mykey mykey.key # on another node
@@ -47,7 +47,7 @@ Previously go-ipfs encoded the key names for IPNS paths as base58btc multihashes
Many commands will accept a `--ipns-base` option that allows changing command outputs to use a particular encoding (i.e. base58btc multihash, or CIDv1 encoded in any supported base):
```console
```bash
$ ipfs key list -l --ipns-base b58mh
12D3KooWCjhz69LskTZEC5vFWs8eDpHo7kYbGzrC5EjU75BHSmVK self
$ ipfs key list -l --ipns-base base36
@@ -58,7 +58,7 @@ k51qzi5uqu5dh9ihj4p2v5sl3hxvv27ryx2w0xrsv6jmmqi91t9xp8p9kaipc2 self
In preparation for eventually changing the default PeerID representation multiaddresses can now contain strings like `/p2p/k51xyz...` in addition to the default `/p2p/Qmabc...`. There is a corresponding `--peerid-base` option to many functions that output peerIDs:
```console
```bash
$ ipfs id --format "<id>" --peerid-base b58mh
12D3KooWCjhz69LskTZEC5vFWs8eDpHo7kYbGzrC5EjU75BHSmVK
$ ipfs id --format "<id>" --peerid-base base36
@@ -69,7 +69,7 @@ k51qzi5uqu5dh9ihj4p2v5sl3hxvv27ryx2w0xrsv6jmmqi91t9xp8p9kaipc2
Initial support has been added for the `ipfs dag stat` command. Running this command will traverse the DAG for the given root CID and report statistics. By default, progress will be shown as the DAG is traversed. Supported statistics currently include DAG size and number of blocks.
```console
```bash
$ ipfs dag stat bafybeihpetclqvwb4qnmumvcn7nh4pxrtugrlpw4jgjpqicdxsv7opdm6e # the IPFS webui
Size: 30362191, NumBlocks: 346
```
+20
View File
@@ -0,0 +1,20 @@
---
date: 2020-10-21
url: newslinks
title: Newslinks
type: newslink
data:
- name: test
title: newslink to ipfs.io
path: https://ipfs.io/
date: 2020-10-22
tags: weekly
- name: link 2
title: title 2
path: https://ipfs.io/
date: 2020-10-23
- name: link 3
title: title 3
path: https://ipfs.io/
date: 2020-10-24
---
+1 -1
View File
@@ -91,7 +91,7 @@ go-ipfs has support for restricting peer connections to certain IP address range
We had the first ever IPFS meetup in Cambridge, at MIT. It was sponsored by [Consensys](https://consensys.net), and hosted by the [MIT Bitcoin Club](http://bitcoin.mit.edu/). [@jbenet](https://github.com/jbenet), [@nicola](https://github.com/nicola), and [@CReckhow](https://twitter.com/CReckhow) each gave talks. A full writeup will appear on the blog as soon as we have edited the videos and posted them on the IPFS YouTube channel. We'll let you know when that happens, here.
_Photo by [@nicocesar\_](https://twitter.com/nicocesar_).\_
_Photo by [@nicocesar\_](https://twitter.com/nicocesar_)._
### Peergos