Dublin talk.
authorRichard W.M. Jones <rjones@redhat.com>
Tue, 2 Oct 2012 07:50:55 +0000 (08:50 +0100)
committerRichard W.M. Jones <rjones@redhat.com>
Tue, 2 Oct 2012 12:29:17 +0000 (13:29 +0100)
23 files changed:
2012-dublin/.gitignore [new file with mode: 0644]
2012-dublin/0000-introduction.html [new file with mode: 0644]
2012-dublin/0100-create.html [new file with mode: 0644]
2012-dublin/0200-inspect.html [new file with mode: 0644]
2012-dublin/0300-modify.html [new file with mode: 0644]
2012-dublin/0400-shutdown.html [new file with mode: 0644]
2012-dublin/0500-mount-local.html [new file with mode: 0644]
2012-dublin/0600-demo.d/.dir [new file with mode: 0644]
2012-dublin/0600-demo.term [new file with mode: 0755]
2012-dublin/0700-resizing.html [new file with mode: 0644]
2012-dublin/0800-svirt.html [new file with mode: 0644]
2012-dublin/0900-sparse.d/.dir [new file with mode: 0644]
2012-dublin/0900-sparse.term [new file with mode: 0755]
2012-dublin/1000-auditing.html [new file with mode: 0644]
2012-dublin/1100-summary.html [new file with mode: 0644]
2012-dublin/README [new file with mode: 0644]
2012-dublin/bashrc [new file with mode: 0644]
2012-dublin/code.js [new file with mode: 0644]
2012-dublin/fish.svg [new file with mode: 0644]
2012-dublin/functions [new file with mode: 0644]
2012-dublin/notes.txt [new file with mode: 0644]
2012-dublin/run [new file with mode: 0755]
2012-dublin/style.css [new file with mode: 0644]

diff --git a/2012-dublin/.gitignore b/2012-dublin/.gitignore
new file mode 100644 (file)
index 0000000..f36f5e2
--- /dev/null
@@ -0,0 +1,5 @@
+0600-demo.d/f16x32.img
+0900-sparse.d/f16x32.img
+0900-sparse.d/f16x32.img.xz
+bindings
+history
diff --git a/2012-dublin/0000-introduction.html b/2012-dublin/0000-introduction.html
new file mode 100644 (file)
index 0000000..f9ecd30
--- /dev/null
@@ -0,0 +1,13 @@
+<link rel="stylesheet" href="style.css" type="text/css"/>
+<script src="code.js" type="text/javascript"></script>
+
+<div id="titlepage">
+<p class="title">
+  libguestfs <br/> <br/>
+  tools for viewing and modifying <br/> virtual machine disk images
+</p>
+<p><author>
+Richard W.M. Jones <br/> Red Hat <br/>
+<small>rjones @ redhat.com</small>
+</author></p>
+</div>
diff --git a/2012-dublin/0100-create.html b/2012-dublin/0100-create.html
new file mode 100644 (file)
index 0000000..5012b7e
--- /dev/null
@@ -0,0 +1,37 @@
+<meta charset="utf-8"/>
+<link rel="stylesheet" href="style.css" type="text/css"/>
+<script src="code.js" type="text/javascript"></script>
+
+<div>
+<h1>Using libguestfs from Python<sup>*</sup></h1>
+
+<p id="steps">
+<b>Create handle</b> &mdash;
+Inspect &mdash;
+Modify &mdash;
+Shutdown</p>
+
+<pre class="code">
+<b>import guestfs</b>
+
+input = "f16x32.img"
+
+<b>g = guestfs.GuestFS</b> ()
+
+<b>g.add_drive_opts</b> (input,
+                  format = "raw",
+                  readonly = 0)
+
+<b>g.launch</b> ()
+</pre>
+
+<p>
+<sup>*</sup>
+<small>
+For more examples:
+<a href="http://libguestfs.org/guestfs-python.3.html">http://libguestfs.org/guestfs-python.3.html</a> <br/>
+or <code>man guestfs-python</code>
+</small>
+</p>
+
+</div>
diff --git a/2012-dublin/0200-inspect.html b/2012-dublin/0200-inspect.html
new file mode 100644 (file)
index 0000000..90072b1
--- /dev/null
@@ -0,0 +1,30 @@
+<meta charset="utf-8"/>
+<link rel="stylesheet" href="style.css" type="text/css"/>
+<script src="code.js" type="text/javascript"></script>
+
+<div>
+<h1>Using libguestfs from Python</h1>
+
+<p id="steps">
+Create handle &mdash;
+<b>Inspect</b> &mdash;
+Modify &mdash;
+Shutdown</p>
+
+<pre class="code">
+roots = <b>g.inspect_os</b> ()
+if len (roots) == 0:
+    raise (Error ("no operating systems found"))
+if len (roots) > 1:
+    raise (Error ("multi-boot operating system"))
+root = roots[0]
+
+type = <b>g.inspect_get_type</b> (root)
+distro = <b>g.inspect_get_distro</b> (root)
+major = <b>g.inspect_get_major_version</b> (root)
+minor = <b>g.inspect_get_minor_version</b> (root)
+
+mps = <b>g.inspect_get_mountpoints</b> (root)
+</pre>
+
+</div>
diff --git a/2012-dublin/0300-modify.html b/2012-dublin/0300-modify.html
new file mode 100644 (file)
index 0000000..c3aa1d0
--- /dev/null
@@ -0,0 +1,23 @@
+<meta charset="utf-8"/>
+<link rel="stylesheet" href="style.css" type="text/css"/>
+<script src="code.js" type="text/javascript"></script>
+
+<div>
+<h1>Using libguestfs from Python</h1>
+
+<p id="steps">
+Create handle &mdash;
+Inspect &mdash;
+<b>Modify</b> &mdash;
+Shutdown</p>
+
+<pre class="code">
+if type == "linux" and distro == "fedora":
+    <b>g.mkdir_p</b> ("/etc/profile.d")
+    <b>g.write</b> ("/etc/profile.d/proxy.sh",
+             "http_proxy=http://cache:3128/")
+else
+    # etc
+</pre>
+
+</div>
diff --git a/2012-dublin/0400-shutdown.html b/2012-dublin/0400-shutdown.html
new file mode 100644 (file)
index 0000000..29f8fce
--- /dev/null
@@ -0,0 +1,20 @@
+<meta charset="utf-8"/>
+<link rel="stylesheet" href="style.css" type="text/css"/>
+<script src="code.js" type="text/javascript"></script>
+
+<div>
+<h1>Using libguestfs from Python</h1>
+
+<p id="steps">
+Create handle &mdash;
+Inspect &mdash;
+Modify &mdash;
+<b>Shutdown</b></p>
+
+<pre class="code">
+<b>g.shutdown</b> ()
+
+<b>g.close</b> ()
+</pre>
+
+</div>
diff --git a/2012-dublin/0500-mount-local.html b/2012-dublin/0500-mount-local.html
new file mode 100644 (file)
index 0000000..8365c84
--- /dev/null
@@ -0,0 +1,31 @@
+<meta charset="utf-8"/>
+<link rel="stylesheet" href="style.css" type="text/css"/>
+<script src="code.js" type="text/javascript"></script>
+
+<div>
+<h1>Using libguestfs from Python</h1>
+
+<p id="steps">
+Create handle &mdash;
+Inspect &mdash;
+<b>Modify</b> &mdash;
+Shutdown</p>
+
+<pre class="code">
+os.mkdir ("/mountpoint")
+
+<b>g.mount_local</b> ("/mountpoint")
+
+os.fork ()  ──────────────────────┐
+                                  │
+<b>g.mount_local_run</b> ()              │
+                                  │
+                              run ┆
+                                a ┆
+                           script ┆ in
+                                  ┆ /mountpoint
+                                  ┆
+                               (umount)
+</pre>
+
+</div>
diff --git a/2012-dublin/0600-demo.d/.dir b/2012-dublin/0600-demo.d/.dir
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/2012-dublin/0600-demo.term b/2012-dublin/0600-demo.term
new file mode 100755 (executable)
index 0000000..67da7c5
--- /dev/null
@@ -0,0 +1,13 @@
+#!/bin/bash -
+
+source functions
+
+# History.
+remember 'ls -l -h'
+remember 'file f16x32.img'
+remember 'guestfish -a f16x32.img -i --rw'
+
+echo "Example: Examine a disk image"
+
+cd 0600-demo.d
+terminal
diff --git a/2012-dublin/0700-resizing.html b/2012-dublin/0700-resizing.html
new file mode 100644 (file)
index 0000000..5c847ee
--- /dev/null
@@ -0,0 +1,13 @@
+<meta charset="utf-8"/>
+<link rel="stylesheet" href="style.css" type="text/css"/>
+<script src="code.js" type="text/javascript"></script>
+
+<div>
+<h1>Resizing</h1>
+
+<ul>
+<li> <p class="bubble">virt-resize</p>
+<li> <p class="bubble" style="width: 12em;">virt-alignment-scan</p>
+</ul>
+
+</div>
diff --git a/2012-dublin/0800-svirt.html b/2012-dublin/0800-svirt.html
new file mode 100644 (file)
index 0000000..329f336
--- /dev/null
@@ -0,0 +1,21 @@
+<meta charset="utf-8"/>
+<link rel="stylesheet" href="style.css" type="text/css"/>
+<script src="code.js" type="text/javascript"></script>
+
+<div>
+<h1>sVirt</h1>
+
+<pre>
+        ┌─────────────────────┐
+        │ ☠ evil disk image ☠ │
+        └─────────────────────┘
+      │    appliance kernel     │
+      └─────────────────────────┘
+    │             qemu            │
+    └─────────────────────────────┘
+  <span class="svirt">│          sVirt & SELinux        │
+  └─────────────────────────────────┘</span>
+│              host kernel            │
+└─────────────────────────────────────┘
+</pre>
+</div>
diff --git a/2012-dublin/0900-sparse.d/.dir b/2012-dublin/0900-sparse.d/.dir
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/2012-dublin/0900-sparse.term b/2012-dublin/0900-sparse.term
new file mode 100755 (executable)
index 0000000..dea1e86
--- /dev/null
@@ -0,0 +1,11 @@
+#!/bin/bash -
+
+source functions
+
+# History.
+remember 'ls -l -h'
+
+echo "Example: Sparsifying a disk image"
+
+cd 0900-sparse.d
+terminal
diff --git a/2012-dublin/1000-auditing.html b/2012-dublin/1000-auditing.html
new file mode 100644 (file)
index 0000000..61c51b0
--- /dev/null
@@ -0,0 +1,13 @@
+<meta charset="utf-8"/>
+<link rel="stylesheet" href="style.css" type="text/css"/>
+<script src="code.js" type="text/javascript"></script>
+
+<div>
+<h1>Auditing, CVEs, licensing</h1>
+
+<ul>
+<li> <p class="bubble">virt-ls</p>
+<li> <a href="http://www.open-scap.org">www.open-scap.org</a>
+</ul>
+
+</div>
diff --git a/2012-dublin/1100-summary.html b/2012-dublin/1100-summary.html
new file mode 100644 (file)
index 0000000..60ba3cf
--- /dev/null
@@ -0,0 +1,25 @@
+<meta charset="utf-8"/>
+<link rel="stylesheet" href="style.css" type="text/css"/>
+<script src="code.js" type="text/javascript"></script>
+
+<div>
+<h1>Summary</h1>
+
+<img id="fish" src="fish.svg"/>
+
+<ul>
+<li> <a href="http://libguestfs.org/">libguestfs.org</a>
+<li> guestfs-python
+<li> mount-local
+<li> virt-resize
+<li> virt-alignment-scan
+<li> sVirt
+<li> virt-sparsify
+<li> virt-ls
+<li> SCAP, <a href="http://www.open-scap.org">Open SCAP</a>
+</ul>
+
+<p>
+<a href="http://git.annexia.org/">git.annexia.org</a> &rarr; libguestfs-talks
+
+</div>
diff --git a/2012-dublin/README b/2012-dublin/README
new file mode 100644 (file)
index 0000000..ba6143b
--- /dev/null
@@ -0,0 +1,8 @@
+This was a talk given in private to Red Hat's OpenStack team.
+
+It gives an overview of libguestfs for OpenStack / Python programmers,
+discusses some of the places that libguestfs might be used within
+OpenStack.
+
+The whole talk is designed to take around 10 minutes, with lots of
+time at the end for open discussion.
\ No newline at end of file
diff --git a/2012-dublin/bashrc b/2012-dublin/bashrc
new file mode 100644 (file)
index 0000000..e8fcde3
--- /dev/null
@@ -0,0 +1,14 @@
+# -*- shell-script -*-
+
+# Fancy prompt colours (see
+# https://wiki.archlinux.org/index.php/Color_Bash_Prompt)
+promptcol='\e[0;32m'      ;# colour for the prompt
+commandcol='\e[1;31m'     ;# colour for the typed command
+outputcol='\e[0m'         ;# colour for command output
+
+export PS1="\n\[$promptcol\]\$ \[$commandcol\]"
+
+trap 'echo -ne "$outputcol"' DEBUG
+
+# Load key bindings (if any).
+bind -f $talkdir/bindings
diff --git a/2012-dublin/code.js b/2012-dublin/code.js
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/2012-dublin/fish.svg b/2012-dublin/fish.svg
new file mode 100644 (file)
index 0000000..7768be4
--- /dev/null
@@ -0,0 +1,366 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="392.4054"
+   height="382.01007"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.48.2 r9819"
+   sodipodi:docname="fish.svg"
+   inkscape:export-filename="/home/rjones/fish.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90">
+  <defs
+     id="defs4">
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient6133">
+      <stop
+         style="stop-color:#003555;stop-opacity:1;"
+         offset="0"
+         id="stop6135" />
+      <stop
+         style="stop-color:#003555;stop-opacity:0;"
+         offset="1"
+         id="stop6137" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient5807">
+      <stop
+         id="stop5815"
+         offset="0"
+         style="stop-color:#667200;stop-opacity:0.824;" />
+      <stop
+         style="stop-color:#003555;stop-opacity:0;"
+         offset="1"
+         id="stop5811" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3755"
+       osb:paint="solid">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3757" />
+    </linearGradient>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath5771">
+      <rect
+         style="fill:#00385a;fill-opacity:1;stroke:#000000;stroke-width:3.24642348;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+         id="rect5773"
+         width="277.56537"
+         height="614.0354"
+         x="-372.27765"
+         y="197.69031"
+         transform="scale(-1,1)" />
+    </clipPath>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5807"
+       id="linearGradient5813"
+       x1="97.288727"
+       y1="505.3093"
+       x2="372.27765"
+       y2="505.3093"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5807"
+       id="linearGradient5837"
+       gradientUnits="userSpaceOnUse"
+       x1="97.288727"
+       y1="505.3093"
+       x2="372.27765"
+       y2="505.3093" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5807"
+       id="linearGradient5863"
+       gradientUnits="userSpaceOnUse"
+       x1="97.288727"
+       y1="505.3093"
+       x2="372.27765"
+       y2="505.3093" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient6133"
+       id="linearGradient6148"
+       gradientUnits="userSpaceOnUse"
+       x1="-213.63203"
+       y1="502.83923"
+       x2="86.352829"
+       y2="502.83923" />
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath6154">
+      <rect
+         y="104.38155"
+         x="-212.13203"
+         height="809.04236"
+         width="269.76663"
+         id="rect6156"
+         style="fill:#55004b;fill-opacity:0.56578944;stroke:#000000;stroke-width:1.04515815;stroke-opacity:1" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath6158">
+      <rect
+         y="82.402786"
+         x="-350.09845"
+         height="877.35065"
+         width="297.24725"
+         id="rect6160"
+         style="fill:#55004b;fill-opacity:0.56578944;stroke:#000000;stroke-width:1.14247787;stroke-opacity:1"
+         transform="matrix(-0.99997357,0.00727051,0.07963564,0.99682404,0,0)" />
+    </clipPath>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="0.7"
+     inkscape:cx="32.993046"
+     inkscape:cy="176.30928"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer4"
+     showgrid="false"
+     inkscape:window-width="1024"
+     inkscape:window-height="768"
+     inkscape:window-x="0"
+     inkscape:window-y="25"
+     inkscape:window-maximized="0"
+     showguides="true"
+     inkscape:guide-bbox="true"
+     showborder="true"
+     fit-margin-top="10"
+     fit-margin-left="10"
+     fit-margin-right="10"
+     fit-margin-bottom="10" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:groupmode="layer"
+     id="layer4"
+     inkscape:label="Sea"
+     style="display:inline"
+     transform="translate(-527.74867,-495.15697)" />
+  <g
+     inkscape:groupmode="layer"
+     id="layer2"
+     inkscape:label="Behind body"
+     style="display:inline"
+     transform="translate(-527.74867,-495.15697)" />
+  <g
+     inkscape:groupmode="layer"
+     id="layer5"
+     inkscape:label="XRay"
+     style="display:inline"
+     transform="translate(-527.74867,-495.15697)" />
+  <g
+     inkscape:groupmode="layer"
+     id="layer6"
+     inkscape:label="Reflection"
+     transform="translate(-527.74867,-495.15697)" />
+  <g
+     inkscape:label="Body"
+     inkscape:groupmode="layer"
+     id="layer1"
+     style="display:inline"
+     transform="translate(-527.74867,-495.15697)" />
+  <g
+     inkscape:groupmode="layer"
+     id="layer3"
+     inkscape:label="Eye front"
+     style="display:inline"
+     transform="translate(-527.74867,-495.15697)">
+    <g
+       id="g5558"
+       transform="matrix(0.58765056,0,0,0.58765056,480.5769,388.27746)">
+      <path
+         transform="matrix(0.81786061,0,0,0.66227787,0.24941012,157.87012)"
+         sodipodi:type="arc"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:3;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
+         id="path5236"
+         sodipodi:cx="170"
+         sodipodi:cy="408.07648"
+         sodipodi:rx="50.000004"
+         sodipodi:ry="80"
+         d="m 220,408.07648 c 0,44.18278 -22.38576,80 -50,80 -27.61424,0 -50,-35.81722 -50,-80 0,-44.18278 22.38576,-80 50,-80 27.61424,0 50,35.81722 50,80 z" />
+      <path
+         sodipodi:nodetypes="csssc"
+         inkscape:connector-curvature="0"
+         id="path5212"
+         d="m 356.47596,702.64765 c 35.25059,30.1442 33.46701,30.05783 3.06518,65.00969 -30.40184,34.95186 -30.76651,63.13495 -66.0171,32.99076 -35.25059,-30.14419 -84.89558,-22.91496 -54.49375,-57.86682 6.41862,-7.37924 16.94653,-35.01714 25.52275,-39.77594"
+         style="fill:none;stroke:#000000;stroke-width:3;stroke-miterlimit:4;stroke-opacity:1;display:inline" />
+      <path
+         sodipodi:nodetypes="cssc"
+         inkscape:connector-curvature="0"
+         id="path5209"
+         d="m 253.2701,348.48267 c -24.84022,-31.47437 -13.82202,-73.48088 24.60984,-93.82417 38.43187,-20.34329 122.03476,-22.95542 146.87498,8.51895 17.40329,22.05123 -16.90737,65.21372 -33.82788,87.51554"
+         style="fill:none;stroke:#000000;stroke-width:3;stroke-miterlimit:4;stroke-opacity:1;display:inline"
+         transform="matrix(0.92848409,0,0,1.1049775,18.995693,-64.144632)" />
+      <path
+         sodipodi:nodetypes="csssssssc"
+         inkscape:connector-curvature="0"
+         id="path5206"
+         d="m 452.1512,389.35272 c 34.36125,-52.57386 201.93286,-98.13611 235.06535,-43.6125 4.87656,8.02499 -30.64578,47.38951 -26.66482,62.56625 4.68628,17.8656 43.19243,27.27726 48.97383,49.52202 5.69778,21.92301 -49.12182,44.50322 -47.06821,68.73221 2.02663,23.91071 58.82396,52.47829 66.37454,75.2345 8.15271,24.57097 -59.96813,41.85228 -68.41923,59.33786 -7.35455,15.21679 45.73412,31.62827 40.29331,39.95288 C 670.85078,746.76539 484.75578,643.7834 450.873,605.83275"
+         style="fill:none;stroke:#000000;stroke-width:3;stroke-miterlimit:4;stroke-opacity:1;display:inline" />
+      <path
+         sodipodi:nodetypes="csc"
+         inkscape:connector-curvature="0"
+         id="path5283"
+         d="m 475.71429,423.79075 c 0,0 37.86977,-21.98936 58.57142,-28.57142 22.53085,-7.16365 70,-11.42858 70,-11.42858"
+         style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline" />
+      <path
+         sodipodi:nodetypes="csc"
+         inkscape:connector-curvature="0"
+         id="path5304"
+         d="m 488.57143,476.6479 c 0,0 54.92334,-13.24827 82.85714,-17.14286 C 590.81704,456.80186 630,455.21933 630,455.21933"
+         style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline" />
+      <path
+         sodipodi:nodetypes="cscc"
+         inkscape:connector-curvature="0"
+         id="path5306"
+         d="m 490,523.79075 c 0,0 57.82549,33.12294 88.57143,45.71429 C 591.9521,574.98481 620,582.36218 620,582.36218 l 25.71429,5.71429"
+         style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline" />
+      <path
+         sodipodi:nodetypes="csc"
+         inkscape:connector-curvature="0"
+         id="path5308"
+         d="m 471.42857,572.36218 c 0,0 54.96698,37.35923 84.28571,52.85714 14.70463,7.77289 45.71429,20 45.71429,20"
+         style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline" />
+      <g
+         transform="translate(2.9438002,8.3263245)"
+         id="g5380"
+         style="display:inline">
+        <path
+           transform="matrix(0.57134522,0,0,0.66201098,26.64223,138.40707)"
+           d="m 162.85714,412.36218 c 0,10.25672 -7.67512,18.57143 -17.14286,18.57143 -9.46774,0 -17.14286,-8.31471 -17.14286,-18.57143 0,-10.25671 7.67512,-18.57143 17.14286,-18.57143 9.46774,0 17.14286,8.31472 17.14286,18.57143 z"
+           sodipodi:ry="18.571428"
+           sodipodi:rx="17.142857"
+           sodipodi:cy="412.36218"
+           sodipodi:cx="145.71428"
+           id="path5372"
+           style="fill:#000000;fill-opacity:1;stroke:#282828;stroke-width:3;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+           sodipodi:type="arc" />
+        <path
+           transform="matrix(0.76389907,0,0,0.80242301,-7.1448579,74.201706)"
+           d="m 153.57143,419.14789 c 0,4.93111 -2.55837,8.92857 -5.71428,8.92857 -3.15592,0 -5.71429,-3.99746 -5.71429,-8.92857 0,-4.93112 2.55837,-8.92857 5.71429,-8.92857 3.15591,0 5.71428,3.99745 5.71428,8.92857 z"
+           sodipodi:ry="8.9285707"
+           sodipodi:rx="5.7142854"
+           sodipodi:cy="419.14789"
+           sodipodi:cx="147.85715"
+           id="path5374"
+           style="fill:#ffffff;fill-opacity:1;stroke:none"
+           sodipodi:type="arc" />
+      </g>
+      <path
+         sodipodi:nodetypes="ccsssc"
+         inkscape:connector-curvature="0"
+         id="path2985"
+         d="m 160.36978,371.07052 c 78.85768,-62.41953 217.9214,-92.90386 284.61297,2.32949 36.46808,53.46723 48.80405,84.76776 43.05907,147.30185 -4.40912,47.9933 -45.29885,112.54109 -83.73037,150.50311 C 345.58869,729.21036 228.47753,725.24321 146.60834,623.96524 86.851966,550.04238 99.822173,439.9148 165.43144,369.96011"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:2.6848495;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;display:inline" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5400"
+         d="m 283.86074,705.01524 c -4.69845,-0.6842 -13.51689,-2.5334 -19.59652,-4.10932 -11.32068,-2.93446 -33.28305,-11.23421 -30.07924,-11.36718 3.46881,-0.14398 13.31453,-10.55383 19.75463,-20.88655 25.35385,-40.6786 36.44594,-100.50098 34.41635,-185.61597 -1.50211,-62.99362 -9.51157,-107.46007 -23.96255,-133.0338 -3.87968,-6.86581 -13.11428,-16.48225 -19.1229,-19.91358 -2.20879,-1.26137 -0.34075,-2.17687 11.02063,-5.40107 22.00124,-6.24366 33.34456,-8.06456 56.18698,-9.01952 30.70768,-1.28378 52.02568,2.59843 78.03237,14.21041 26.98816,12.05021 48.84519,35.20813 73.23015,77.58867 18.9995,33.02074 25.75261,64.03458 22.57832,103.69155 -2.31745,28.95248 -9.57768,51.482 -26.28882,81.57797 -20.74985,37.36947 -51.99219,75.57234 -74.05533,90.55423 -27.71676,18.82096 -66.04948,26.97601 -102.11407,21.72416 z m 94.74428,-81.14896 c 15.97737,-8.15104 35.3862,-36.01947 40.97857,-58.83962 2.9634,-12.09242 2.32622,-26.65444 -1.52105,-34.76198 -8.891,-18.73639 -37.33719,-31.05374 -61.96395,-26.83073 -11.32801,1.94254 -17.57982,4.41103 -16.80191,6.63414 0.67508,1.92923 3.7049,1.62892 14.53527,-1.44075 20.70874,-5.86953 50.75571,5.54584 59.44876,22.58561 5.6331,11.0418 4.8859,28.1688 -1.94929,44.68041 -7.43304,17.95588 -25.25678,39.74388 -36.38216,44.47408 -15.75563,6.69884 -35.09237,-4.41752 -44.65946,-25.67398 -2.1784,-4.84005 -5.35891,-14.90724 -7.06779,-22.37152 -4.18648,-18.28629 -4.28827,-18.57143 -6.62919,-18.57143 -2.59926,0 -2.75787,-1.3922 2.20937,19.39261 6.72202,28.1275 15.36925,42.3199 30.32616,49.77324 9.30322,4.636 21.48205,5.02848 29.47667,0.94992 z"
+         style="fill:#ffa100;fill-opacity:1;stroke:none;display:inline" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5402"
+         d="m 223.83195,684.82459 c -6.59286,-2.35198 -26.0225,-14.88254 -37.14286,-23.95415 -13.22676,-10.78996 -35.42773,-34.05229 -44.08537,-46.19299 -8.54831,-11.98737 -18.28708,-30.85503 -22.47284,-43.53836 -1.73006,-5.24228 -3.41894,-10.27567 -3.75306,-11.18528 -0.41782,-1.13747 1.32008,-0.98849 5.56618,0.4772 17.70381,6.11104 47.26269,5.41557 71.77856,-1.68886 16.41115,-4.75577 25.48219,-9.51259 30.37795,-15.93009 3.58722,-4.70224 4.01715,-6.42451 4.01715,-16.09225 0,-12.42702 -1.4715,-19.17215 -3.98126,-18.24936 -0.95316,0.35046 -1.51445,1.52113 -1.24732,2.60149 0.26714,1.08035 0.79692,6.46428 1.17728,11.96428 0.96968,14.02137 -1.62275,18.40349 -14.84859,25.09926 -5.53978,2.80458 -16.41071,6.65164 -24.15764,8.54901 -23.97768,5.87257 -57.83592,4.23887 -68.12036,-3.2869 -4.09831,-2.99898 -7.14256,-26.44615 -6.1677,-47.50423 0.86067,-18.59132 2.31181,-28.13297 6.93291,-45.58594 l 2.99202,-11.30023 2.69339,6.85686 c 5.5005,14.00316 17.35186,26.01143 30.82761,31.23574 9.30848,3.60875 24.23072,3.13023 33.75635,-1.08244 36.90499,-16.32114 45.62883,-71.97114 15.92829,-101.60771 -8.51809,-8.49973 -17.97669,-13.26419 -29.12691,-14.67171 l -8.08664,-1.02079 12.85696,-8.48203 c 14.23378,-9.39035 42.91508,-24.3558 50.75951,-26.48552 22.31432,-6.05821 40.92848,26.76328 49.24328,86.82844 12.20794,88.18869 1.94302,189.74558 -23.8568,236.02962 -13.89806,24.93266 -21.69925,31.8418 -31.86009,28.21694 z"
+         style="fill:#ffeb00;fill-opacity:1;stroke:none;display:inline" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5404"
+         d="m 374.32465,318.77156 c -14.52562,-5.34248 -28.84909,-7.15959 -55.4927,-7.03993 -21.85407,0.0981 -29.02491,0.68217 -41.42857,3.37412 -22.1889,4.81563 -21.33409,4.95439 -25.94946,-4.21239 -13.12454,-26.06719 -7.41389,-59.44574 13.80682,-80.70036 15.02529,-15.0493 36.89838,-23.68804 67.0919,-26.49783 34.82575,-3.24086 64.28968,5.30706 77.3103,22.42886 8.86,11.65068 7.39718,26.83825 -5.10642,53.01715 -6.78478,14.20537 -22.84276,41.70011 -24.296,41.60005 -0.39286,-0.027 -3.064,-0.9134 -5.93587,-1.96967 z"
+         style="fill:#ffbc02;fill-opacity:1;stroke:none;display:inline" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5406"
+         d="m 310.64914,809.43192 c -1.75055,-0.70419 -7.87577,-4.81254 -13.6116,-9.12968 -12.62371,-9.50137 -25.90843,-16.90073 -43.66887,-24.32282 -7.32624,-3.06164 -15.27061,-7.38835 -17.65415,-9.61492 -5.41251,-5.05604 -4.84825,-8.17454 3.67832,-20.32886 3.36209,-4.79254 8.86827,-13.85656 12.23594,-20.14228 3.36768,-6.28571 7.62838,-13.44426 9.46822,-15.90789 l 3.34517,-4.47932 9.69489,2.21226 c 15.0924,3.44391 53.50712,2.99861 68.21827,-0.79079 13.53404,-3.48619 13.14338,-3.6581 28.3719,12.48494 13.86529,14.69794 13.98712,14.22739 -11.81681,45.64401 -6.83145,8.31738 -16.0822,20.37722 -20.55723,26.79964 -12.41698,17.82046 -18.11282,21.43395 -27.70405,17.57571 z"
+         style="fill:#ffbc02;fill-opacity:1;stroke:none;display:inline" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5408"
+         d="m 665.97481,710.03341 c -26.34237,-4.07186 -40.2667,-7.9418 -67.14286,-18.66085 -41.64022,-16.60741 -103.17468,-51.29194 -131.78571,-74.28238 -10.11072,-8.12449 -10.8644,-9.504 -7.69966,-14.09323 1.06876,-1.54983 4.66307,-8.12317 7.98735,-14.60743 3.86761,-7.54406 6.6403,-11.43763 7.69965,-10.81227 0.91053,0.53751 9.23709,6.03499 18.50346,12.2166 31.03832,20.70576 63.75116,39.34956 84.50814,48.16314 11.2053,4.75786 21.07123,8.65066 21.92428,8.65066 4.05586,0 2.77393,-3.15831 -2.10612,-5.18894 -36.93302,-15.3681 -55.18817,-25.29062 -97.38492,-52.9332 -19.92567,-13.05306 -24.59563,-16.71742 -23.83057,-18.69902 4.82724,-12.50304 10.70753,-31.16907 11.51466,-36.55135 0.54662,-3.64512 1.29806,-6.62749 1.66988,-6.62749 0.37182,0 10.1024,5.26587 21.62351,11.70193 45.66695,25.511 77.9499,39.06191 111.66176,46.87053 7.46429,1.72893 15.66072,3.6699 18.21429,4.31324 3.9143,0.98616 4.64286,0.77761 4.64286,-1.329 0,-1.97797 -2.45609,-3.01273 -11.78572,-4.96531 -19.65013,-4.11255 -49.52854,-13.52973 -64.64285,-20.37438 -7.85715,-3.55817 -28.8836,-14.28328 -46.72545,-23.8336 l -32.43973,-17.3642 0.29687,-21.64332 0.29688,-21.64333 10.71428,-2.40432 c 59.5125,-13.35479 89.26304,-17.80012 119.64286,-17.87706 7.54207,-0.0191 8.92871,-0.41083 8.92946,-2.52261 0.001,-2.83075 -0.20682,-2.83231 -35.71517,-0.26915 -25.26851,1.82399 -66.10318,9.05912 -100.21159,17.75557 -3.57205,0.91075 -3.83439,0.61937 -4.70453,-5.22523 -1.617,-10.86124 -5.45138,-25.87145 -8.77596,-34.35476 l -3.22499,-8.22918 15.24425,-8.18355 c 35.59319,-19.10746 58.21948,-25.76652 101.31567,-29.81781 7.85036,-0.73798 10.35715,-1.49529 10.35715,-3.12895 0,-1.81951 -1.72499,-2.00401 -11.07143,-1.18419 -25.73664,2.25747 -54.60914,7.97579 -68.92857,13.6516 -4.32143,1.71288 -17.11388,7.89074 -28.42766,13.72857 -11.31378,5.83782 -20.73304,10.61422 -20.93168,10.61422 -0.19864,0 -1.02112,-1.89316 -1.82774,-4.20703 -0.80662,-2.31387 -4.72665,-9.72645 -8.71118,-16.4724 -3.98453,-6.74595 -7.2446,-12.75465 -7.2446,-13.35267 0,-0.59801 2.73214,-3.70429 6.07143,-6.90282 23.87671,-22.87033 68.56142,-42.63971 119.18616,-52.73024 16.01407,-3.19193 50.52124,-4.32041 62.75252,-2.05218 18.23807,3.38216 32.12513,10.43296 37.6098,19.09541 l 2.82433,4.46072 -5.4913,10.00918 c -3.02021,5.50505 -8.47241,15.15203 -12.116,21.43775 -8.28924,14.30015 -11.13284,23.27282 -9.34794,29.49639 1.78427,6.2214 6.81517,11.22055 22.79671,22.65283 18.73592,13.40261 25.71429,21.192 25.71429,28.70278 0,5.89988 -6.76554,14.78843 -22.03019,28.94316 -17.62283,16.34145 -23.81764,24.58772 -24.7083,32.89057 -1.28087,11.94064 6.91327,22.62977 37.26427,48.61058 23.53488,20.14613 30.44182,28.90325 28.77659,36.48496 -1.32283,6.02281 -9.81646,13.68231 -25.01666,22.55984 -7.46428,4.35945 -18.62157,10.88753 -24.79398,14.50686 -12.83529,7.52627 -19.49173,14.26487 -19.49173,19.73233 0,5.09701 9.22671,13.74933 24.50014,22.97491 6.62683,4.0028 13.1519,8.49675 14.50017,9.98656 2.31832,2.56171 2.31222,2.83471 -0.11243,5.02901 -5.59235,5.061 -20.90101,8.73893 -30.31642,7.28355 l -3e-5,0 z"
+         style="fill:#ffbc02;fill-opacity:1;stroke:none;display:inline" />
+      <path
+         transform="matrix(1,0,0,0.73033368,0,131.61779)"
+         d="m 220,408.07648 c 0,44.18278 -22.38576,80 -50,80 -27.61424,0 -50,-35.81722 -50,-80 0,-44.18278 22.38576,-80 50,-80 27.61424,0 50,35.81722 50,80 z"
+         sodipodi:ry="80"
+         sodipodi:rx="50.000004"
+         sodipodi:cy="408.07648"
+         sodipodi:cx="170"
+         id="path5216"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:3;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+         sodipodi:type="arc" />
+      <path
+         sodipodi:nodetypes="csc"
+         inkscape:connector-curvature="0"
+         id="path5267"
+         d="m 224.07635,509.23876 c 9.08509,34.56535 -4.31764,40.26175 -36.23186,49.05253 -35.18379,9.69139 -72.03637,1.37157 -73.81834,-4.52651"
+         style="fill:none;stroke:#000000;stroke-width:2.7190001;stroke-miterlimit:4;stroke-opacity:1" />
+      <path
+         sodipodi:nodetypes="csssc"
+         inkscape:connector-curvature="0"
+         id="path5251"
+         d="m 340.30688,510.99397 c 19.89892,-13.58823 68.94815,-5.72365 77.65497,25.33145 8.70681,31.05509 -17.60597,70.3932 -37.50489,83.98144 -19.89892,13.58822 -47.39841,-2.66984 -56.10523,-33.72493 -1.0297,-3.67271 -7.21381,-28.47773 -7.76602,-32.39289"
+         style="fill:#ffbc02;fill-opacity:1;stroke:#000000;stroke-width:3;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+      <path
+         sodipodi:nodetypes="cssc"
+         inkscape:connector-curvature="0"
+         id="path5323"
+         d="m 229.59896,331.40004 c 28.35407,-7.60464 53.61362,38.87503 56.93495,145.15751 3.32133,106.28248 -15.76827,158.17647 -29.09155,181.81749 -11.96618,21.233 -22.05557,36.58259 -37.4499,27.20832"
+         style="fill:none;stroke:#282828;stroke-width:3;stroke-miterlimit:4;stroke-opacity:1" />
+      <g
+         transform="translate(7.8212482,8.8314008)"
+         id="g5376">
+        <path
+           sodipodi:type="arc"
+           style="fill:#000000;fill-opacity:1;stroke:#282828;stroke-width:3;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+           id="path5326"
+           sodipodi:cx="145.71428"
+           sodipodi:cy="412.36218"
+           sodipodi:rx="17.142857"
+           sodipodi:ry="18.571428"
+           d="m 162.85714,412.36218 c 0,10.25672 -7.67512,18.57143 -17.14286,18.57143 -9.46774,0 -17.14286,-8.31471 -17.14286,-18.57143 0,-10.25671 7.67512,-18.57143 17.14286,-18.57143 9.46774,0 17.14286,8.31472 17.14286,18.57143 z"
+           transform="matrix(0.74793287,0,0,0.82501496,30.658351,71.442927)" />
+        <path
+           sodipodi:type="arc"
+           style="fill:#ffffff;fill-opacity:1;stroke:none"
+           id="path5341"
+           sodipodi:cx="147.85715"
+           sodipodi:cy="419.14789"
+           sodipodi:rx="5.7142854"
+           sodipodi:ry="8.9285707"
+           d="m 153.57143,419.14789 c 0,4.93111 -2.55837,8.92857 -5.71428,8.92857 -3.15592,0 -5.71429,-3.99746 -5.71429,-8.92857 0,-4.93112 2.55837,-8.92857 5.71429,-8.92857 3.15591,0 5.71428,3.99745 5.71428,8.92857 z"
+           transform="translate(-13.571429,-8.5714286)" />
+      </g>
+    </g>
+  </g>
+</svg>
diff --git a/2012-dublin/functions b/2012-dublin/functions
new file mode 100644 (file)
index 0000000..1e2cd55
--- /dev/null
@@ -0,0 +1,41 @@
+# -*- shell-script -*-
+# This creates some standard functions.  See also $talkdir/bashrc
+# which runs in the same bash context as the terminal.
+
+# Place any local environment variables and settings in "local".
+if [ -f local ]; then source local; fi
+
+# Environment variables.
+export HISTFILE=$talkdir/history
+export PATH=$talkdir:$PATH
+export LIBVIRT_DEFAULT_URI=qemu:///system
+export EDITOR="emacs -nw"
+
+# remember <command> <args ...>
+#
+# This function does two things: (1) It adds the command and arguments
+# to the shell history, so that commands can be recalled using up
+# arrow or reverse search.  (2) It makes a function key recall the
+# command.  The first command is assigned to F2, the second to F3 and
+# so forth.
+
+rm -f $HISTFILE
+touch $HISTFILE
+rm -f $talkdir/bindings
+touch bindings
+
+fnum=2
+keys=(- OP OQ OR OS '[15~' '[17~' '[18~' '[19~' '[20~' '[21~')
+
+remember ()
+{
+    echo "$@" >> $HISTFILE
+    echo \"\\e${keys[$fnum]}\":\"\\C-k \\C-u"$@"\" >> $talkdir/bindings
+    ((fnum++))
+}
+
+terminal ()
+{
+    chmod -w $HISTFILE
+    /bin/bash --rcfile $talkdir/bashrc "$@"
+}
diff --git a/2012-dublin/notes.txt b/2012-dublin/notes.txt
new file mode 100644 (file)
index 0000000..d937b52
--- /dev/null
@@ -0,0 +1,45 @@
+[ ---- 0: Intro slide ---- ]
+
+libguestfs is a C library for viewing and modifying disk images.  It
+lets you open up any disk image, and look at the files inside it.  You
+can also analyze disk images, inject files, or even create disk images
+from scratch.
+
+In this talk I'm going to show you a concrete example of using the
+library from Python.  Then I'm going to talk about some of the latest
+features of libguestfs and how they might be useful in OpenStack.
+
+[ ---- 1: Creating the handle, adding drives, launching. ---- ]
+
+*** Link to guestfs-python
+
+[ ---- 2: Inspect ---- ]
+
+[ ---- 3: Inject files ---- ]
+
+[ ---- 4: Shutdown the handle ---- ]
+
+[ ---- 5: Alternative: mount-local ----- ]
+
+OpenStack uses libguestfs for file injection currently.  With
+RHEL 6.4 + mount-local support, we can do that much better.
+
+[ ---- 6: Demo ---- ]
+
+[ ---- 7: OpenStack: Resizing, partition auditing ---- ]
+
+
+
+[ ---- 8: OpenStack: sVirt ---- ]
+
+Starting with RHEL 7, libguestfs will use sVirt to confine
+the appliance.  This gives us exceptional, unmatched security
+against malicious disk images that random users upload.
+
+[ ---- 9: OpenStack: Sparsify, archiving ---- ]
+
+[ ---- 10: OpenStack: Auditing, CVEs, licensing ---- ]
+
+[ ---- 11: Summary ---- ]
+
+Any questions?
diff --git a/2012-dublin/run b/2012-dublin/run
new file mode 100755 (executable)
index 0000000..c3e4d40
--- /dev/null
@@ -0,0 +1,16 @@
+#!/bin/bash -
+# Run the talk.
+
+# Avoid GNOME keyring stupidity
+export GNOME_KEYRING_CONTROL=
+export GNOME_KEYRING_PID=
+
+# Clean up everything.
+find -name '*~' -delete
+
+# Get everything into the cache.
+guestfish -a /dev/null run > /dev/null 2>&1
+guestfish --ro -a 0600-demo.d/f16x32.img run > /dev/null 2>&1
+
+# Run techtalk.
+techtalk-pse
diff --git a/2012-dublin/style.css b/2012-dublin/style.css
new file mode 100644 (file)
index 0000000..c7be03c
--- /dev/null
@@ -0,0 +1,106 @@
+/* Red Hat red is rgb(204,0,0). */
+
+body {
+    background: url(redhat.jpg) no-repeat;
+    background-position: 98% 0;
+    font-size: 24pt; /* For max */
+    /* font-size: 20pt; */ /* For 1024x768 */
+    font-family: liberation, helvetica;
+}
+
+body td { /* why?? */
+    /*font-size: 28pt;*/
+    font-size: 20pt;
+}
+
+h1 {
+    color: rgb(204,0,0);
+    /*font-size: 48px;*/
+    font-size: 40px;
+    top: 8;
+    left: 0;
+    border-bottom: 2px solid rgb(204,0,0);
+}
+
+b {
+    color: rgb(204,0,0);
+}
+
+div#titlepage {
+    margin-top: 100px;
+    text-align: center;
+}
+
+div#titlepage p.title {
+    color: rgb(204,0,0);
+    font-weight: bold;
+    font-size: 48px;
+}
+
+div#titlepage author {
+    font-size: 36px;
+}
+
+/* Bubble around names of virt-tools. */
+p.bubble {
+    font-weight: bold;
+    color: white;
+    width: 6em;
+    text-align: center;
+    background-color: rgb(204,0,0);
+    -moz-border-radius: 0.2em;
+    border-radius: 0.2em;
+}
+
+p.bubbleinverse {
+    font-weight: bold;
+    color: rgb(204,0,0);
+    text-align: center;
+    background-color: white;
+}
+
+table.tools td {
+    font-size: 18pt;
+    padding-bottom: 0.5em;
+    padding-right: 0.5em;
+}
+
+/* Code */
+pre.code {
+    margin-left: 1em;
+    background: #eee;
+}
+
+/* Steps */
+p#steps {
+    margin-bottom: -16px;
+    text-align: right;
+    font-size: 16pt;
+}
+
+p#steps b {
+    background-color: rgb(204,0,0);
+    color: white;
+    padding-left: 8px;
+    padding-right: 8px;
+    border-radius: 0.2em;
+}
+
+/* sVirt slide */
+span.svirt {
+    color: rgb(204,0,0);
+}
+
+/* Bullet points */
+li {
+    padding-bottom: 16px;
+}
+
+/* Logo */
+img#fish {
+    position: absolute;
+    top: 128px;
+    right: 64px;
+    width: 200px;
+    /*height: 256px;*/
+}
\ No newline at end of file