<?xml version="1.0" encoding="UTF-8"?>
<rdf:RDF xmlns="http://purl.org/rss/1.0/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel rdf:about="https://let.hatelabo.jp/hitode909/rss">
    <link>https://let.hatelabo.jp/hitode909/rss</link>
    <description></description>
    <title>Bookmarklets from hitode909</title>
    <items>
      <rdf:Seq>
        <rdf:li rdf:resource="https://let.hatelabo.jp/hitode909/let/ktGqpLyogMAA"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/hitode909/let/jd22ioGugYAA"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/hitode909/let/jaibrbf2gsAA"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/hitode909/let/jYfoh8D2gqAA"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/hitode909/let/jPCC6armgcAA"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/hitode909/let/hLHWtIHosZ99"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/hitode909/let/hJmc5Jbys6YJ"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/hitode909/let/hJmd2LuH7cM-"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/hitode909/let/hLHV1eS_-K1W"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/hitode909/let/hJmcoI6U0bxv"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/hitode909/let/gYC-y4uM7LKcaQ"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/hitode909/let/gYC-yu-RjrLCJQ"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/hitode909/let/gYC-yuG7p7bWEg"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/hitode909/let/gYC-ycit4Iq-IQ"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/hitode909/let/gYC-yba2mZivbQ"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/hitode909/let/gYC-xYL11uidOQ"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/hitode909/let/gYC-xMem8c_LPw"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/hitode909/let/gYC-yMenvtvgLQ"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/hitode909/let/gYC-yIuan5TgNg"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/hitode909/let/gYC-x-jF_-2zFg"/>
      </rdf:Seq>
    </items>
  </channel>
  <item rdf:about="https://let.hatelabo.jp/hitode909/let/ktGqpLyogMAA">
    <link>https://let.hatelabo.jp/hitode909/let/ktGqpLyogMAA</link>
    <dc:date>2025-02-22T11:37:40Z</dc:date>
    <description>濃さを調整したあと印刷して、塗り絵として使ってください。X.comなど、うまく動かない場合は画像をタブで開いてから実行してください。</description>
    <dc:creator>hitode909</dc:creator>
    <title>[Let] 画像を右クリックすると塗り絵用の線画を表示します。スライダーで濃さを調整できます。</title>
    <content:encoded>&lt;a href="javascript:%22https%3A%2F%2Flet.st-hatelabo.com%2Fhitode909%2Flet%2FktGqpLyogMAA.bookmarklet.js%20%28arg%29%22.replace%28%2F%28%5CS%2B%29%5Cs%2B%28%5CS%2A%29%2F%2Cfunction%28s%2Curl%2Carg%29%7Bs%3Ddocument.createElement%28%22script%22%29%3Bs.charset%3D%22utf-8%22%3Bs.src%3Durl%2B%22%3Fs%3D%22%2BencodeURIComponent%28arg%29%3Bdocument.body.appendChild%28s%29%7D%29%3Bvoid%280%29%3B"&gt;画像を右クリックすると塗り絵用の線画を表示します。スライダーで濃さを調整できます。&lt;/a&gt;&lt;pre&gt;/*
 * @title 画像を右クリックすると塗り絵用の線画を表示します。スライダーで濃さを調整できます。
 * @description 濃さを調整したあと印刷して、塗り絵として使ってください。X.comなど、うまく動かない場合は画像をタブで開いてから実行してください。
 * @include http://*
 * @license MIT License
 * @require 
 */
(function() {
    alert(&amp;quot;画像を右クリックすると塗り絵用の線画を表示します。\nスライダーで濃さを調整できます。&amp;quot;);

    function handleContextMenu(event) {
        let target = event.target;
        if (target.tagName === &amp;quot;IMG&amp;quot;) {
            event.preventDefault(); // 右クリックのデフォルト動作を防ぐ
            processImage(target.src, target.width, target.height);
        }
    }

    document.addEventListener(&amp;quot;contextmenu&amp;quot;, handleContextMenu, false);

    function processImage(imgUrl, width, height) {
        let newTab = window.open(); // ポップアップブロック回避
        if (!newTab) {
            alert(&amp;quot;ポップアップブロックを解除してください！&amp;quot;);
            return;
        }

        let sliderValue = 50;  // 初期値（中間）

        function getFilter() {
            let slope, intercept;
            if (sliderValue &amp;lt;= 50) {
                // 左側: (0.5, -0.25) → (10, -5) の線形変化
                let t = sliderValue / 50;
                slope = 0.5 + (10 - 0.5) * t;
                intercept = -0.25 + (-5 + 0.25) * t;
            } else {
                // 右側: (10, -5) → (10, 0) の線形変化
                let t = (sliderValue - 50) / 50;
                slope = 10;
                intercept = -5 + (0 + 5) * t;
            }

            return `
                &amp;lt;filter id=&amp;quot;edge&amp;quot;&amp;gt;
                    &amp;lt;feColorMatrix type=&amp;quot;saturate&amp;quot; values=&amp;quot;0&amp;quot;&amp;gt;&amp;lt;/feColorMatrix&amp;gt;
                    &amp;lt;feComponentTransfer&amp;gt;
                        &amp;lt;feFuncR type=&amp;quot;linear&amp;quot; slope=&amp;quot;${slope}&amp;quot; intercept=&amp;quot;${intercept}&amp;quot;&amp;gt;&amp;lt;/feFuncR&amp;gt;
                        &amp;lt;feFuncG type=&amp;quot;linear&amp;quot; slope=&amp;quot;${slope}&amp;quot; intercept=&amp;quot;${intercept}&amp;quot;&amp;gt;&amp;lt;/feFuncG&amp;gt;
                        &amp;lt;feFuncB type=&amp;quot;linear&amp;quot; slope=&amp;quot;${slope}&amp;quot; intercept=&amp;quot;${intercept}&amp;quot;&amp;gt;&amp;lt;/feFuncB&amp;gt;
                    &amp;lt;/feComponentTransfer&amp;gt;
                &amp;lt;/filter&amp;gt;`;
        }

        let svgTemplate = `
            &amp;lt;div class=&amp;quot;print-container&amp;quot;&amp;gt;
                &amp;lt;svg xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; id=&amp;quot;mainSVG&amp;quot; width=&amp;quot;100%&amp;quot; height=&amp;quot;100%&amp;quot; viewBox=&amp;quot;0 0 ${width} ${height}&amp;quot; preserveAspectRatio=&amp;quot;xMidYMid meet&amp;quot;&amp;gt;
                    &amp;lt;defs id=&amp;quot;defs&amp;quot;&amp;gt;${getFilter()}&amp;lt;/defs&amp;gt;
                    &amp;lt;image id=&amp;quot;image&amp;quot; href=&amp;quot;${imgUrl}&amp;quot; x=&amp;quot;0&amp;quot; y=&amp;quot;0&amp;quot; width=&amp;quot;${width}&amp;quot; height=&amp;quot;${height}&amp;quot; filter=&amp;quot;url(#edge)&amp;quot;/&amp;gt;
                &amp;lt;/svg&amp;gt;
            &amp;lt;/div&amp;gt;`;

        let style = `
        &amp;lt;style&amp;gt;
            body { display: flex; flex-direction: column; justify-content: center; align-items: center; height: 100vh; background: white; margin: 0; padding: 0; }
            .print-container { width: 100vw; height: 90vh; display: flex; justify-content: center; align-items: center; }
            svg { max-width: 100%; max-height: 100%; }

            .controls { display: flex; flex-direction: column; align-items: center; gap: 10px; width: 80%; max-width: 400px; }
            .slider-label { font-size: 14px; font-weight: bold; }
            input[type=&amp;quot;range&amp;quot;] { width: 100%; }

            @media print {
                .controls { display: none; } /* 印刷時にスライダーを非表示 */
                .print-container { width: 100vw; height: 100vh; display: flex; justify-content: center; align-items: center; }
                svg { width: 100vw; height: 100vh; max-width: 100%; max-height: 100%; }
            }
        &amp;lt;/style&amp;gt;`;

        let controls = `
        &amp;lt;div class=&amp;quot;controls&amp;quot;&amp;gt;
            &amp;lt;label class=&amp;quot;slider-label&amp;quot;&amp;gt;濃さを調整&amp;lt;/label&amp;gt;
            &amp;lt;input type=&amp;quot;range&amp;quot; id=&amp;quot;contrastSlider&amp;quot; min=&amp;quot;0&amp;quot; max=&amp;quot;100&amp;quot; value=&amp;quot;${sliderValue}&amp;quot; step=&amp;quot;1&amp;quot;&amp;gt;
        &amp;lt;/div&amp;gt;`;

        newTab.document.open();
        newTab.document.write(`
            &amp;lt;!DOCTYPE html&amp;gt;
            &amp;lt;html&amp;gt;
            &amp;lt;head&amp;gt;${style}&amp;lt;/head&amp;gt;
            &amp;lt;body&amp;gt;${svgTemplate}${controls}&amp;lt;/body&amp;gt;
            &amp;lt;/html&amp;gt;
        `);
        newTab.document.close();

        // スライダーイベントを追加
        newTab.onload = function() {
            let contrastSlider = newTab.document.getElementById(&amp;quot;contrastSlider&amp;quot;);

            function updateFilter() {
                sliderValue = parseFloat(contrastSlider.value);
                let newFilter = getFilter();
                newTab.document.getElementById(&amp;quot;defs&amp;quot;).innerHTML = newFilter;
            }

            contrastSlider.addEventListener(&amp;quot;input&amp;quot;, updateFilter);
        };
    }
})();
&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/hitode909/let/jd22ioGugYAA">
    <link>https://let.hatelabo.jp/hitode909/let/jd22ioGugYAA</link>
    <dc:date>2022-06-23T01:28:10Z</dc:date>
    <description>予測線と終了日をプロットします。完了ポイントは線形に伸び、総ポイントは変化しない想定。</description>
    <dc:creator>hitode909</dc:creator>
    <title>[Let] Asanaのバーンアップチャートから終了日を予測してプロットする</title>
    <content:encoded>&lt;a href="javascript:%28%28%29%3D%3E%7Bfunction%20intersect%28x1%2Cy1%2Cx2%2Cy2%2Cx3%2Cy3%2Cx4%2Cy4%29%7Bif%28x1%3D%3D%3Dx2%26%26y1%3D%3D%3Dy2%7C%7Cx3%3D%3D%3Dx4%26%26y3%3D%3D%3Dy4%29%7Breturn%20false%7Dlet%20denominator%3D%28y4-y3%29%2A%28x2-x1%29-%28x4-x3%29%2A%28y2-y1%29%3Bif%28denominator%3D%3D%3D0%29%7Breturn%20false%7Dlet%20ua%3D%28%28x4-x3%29%2A%28y1-y3%29-%28y4-y3%29%2A%28x1-x3%29%29%2Fdenominator%3Blet%20ub%3D%28%28x2-x1%29%2A%28y1-y3%29-%28y2-y1%29%2A%28x1-x3%29%29%2Fdenominator%3Bif%28ua%3C0%7C%7Cua%3E1%7C%7Cub%3C0%7C%7Cub%3E1%29%7Breturn%20false%7Dlet%20x%3Dx1%2Bua%2A%28x2-x1%29%3Blet%20y%3Dy1%2Bua%2A%28y2-y1%29%3Breturn%7Bx%3Ax%2Cy%3Ay%7D%7Dconst%20linearReg%3Dcoordinates%3D%3E%7Bconst%20n%3Dcoordinates.length%3Bconst%20sigX%3Dcoordinates.reduce%28%28%28acc%2Cc%29%3D%3Eacc%2Bc%5B0%5D%29%2C0%29%3Bconst%20sigY%3Dcoordinates.reduce%28%28%28acc%2Cc%29%3D%3Eacc%2Bc%5B1%5D%29%2C0%29%3Bconst%20sigXX%3Dcoordinates.reduce%28%28%28acc%2Cc%29%3D%3Eacc%2Bc%5B0%5D%2Ac%5B0%5D%29%2C0%29%3Bconst%20sigXY%3Dcoordinates.reduce%28%28%28acc%2Cc%29%3D%3Eacc%2Bc%5B0%5D%2Ac%5B1%5D%29%2C0%29%3Bconst%20slope%3D%28n%2AsigXY-sigX%2AsigY%29%2F%28n%2AsigXX-Math.pow%28sigX%2C2%29%29%3Bconst%20intercept%3D%28sigXX%2AsigY-sigXY%2AsigX%29%2F%28n%2AsigXX-Math.pow%28sigX%2C2%29%29%3Breturn%7Bslope%3Aslope%2Cintercept%3Aintercept%7D%7D%3Blet%20overlayElementsPool%3D%5B%5D%3Blet%20knownCharts%3D%5B%5D%3Bconst%20predict%3D%28%29%3D%3E%7Bfor%28const%20path%20of%20overlayElementsPool%29path.remove%28%29%3BoverlayElementsPool%3D%5B%5D%3Bconst%20charts%3D%5B...document.querySelectorAll%28%22.BurnupChart%22%29%5D%3Bconst%20renderChart%3Dchart%3D%3E%7Bconst%20svgElement%3Dchart.querySelector%28%22svg.highcharts-root%22%29%3Bconst%20svgWidth%3D%2BsvgElement.getAttribute%28%22width%22%29%3Bconst%20lines%3D%5B...chart.querySelectorAll%28%22.highcharts-series%20.highcharts-tracker-line%22%29%5D%3Bconst%20linePoints%3D%5B%5D%3Blet%20lineNumber%3D0%3Bfor%28const%20line%20of%20lines%29%7BlineNumber%2B%2B%3Bconst%20path%3Ddocument.createElementNS%28%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%2C%22path%22%29%3Bpath.setAttribute%28%22stroke%22%2C%22gray%22%29%3Bpath.setAttribute%28%22stroke-width%22%2C%221%22%29%3Bpath.setAttribute%28%22fill%22%2C%22none%22%29%3Bconst%20points%3Dline.getAttribute%28%22d%22%29.match%28%2F%28%5B%5Cd%5C.%5D%2B%29%20%28%5B%5Cd%5C.%5D%2B%29%2Fg%29.map%28%28pair%3D%3Epair.split%28%22%20%22%29.map%28%28i%3D%3E%2Bi%29%29%29%29%3Bwhile%28points.length%3E1%26%26points%5B0%5D%5B1%5D%3D%3D%3Dpoints%5B1%5D%5B1%5D%29%7Bpoints.shift%28%29%7Dif%28lineNumber%3D%3D%3D1%29%7Bconst%20lastPoint%3Dpoints%5Bpoints.length-1%5D%3Bpath.setAttribute%28%22d%22%2C%60M%200%20%24%7BlastPoint%5B1%5D%7D%20L%20%20%24%7BsvgWidth%2A3%7D%20%24%7BlastPoint%5B1%5D%7D%60%29%3BlinePoints.push%28%5B0%2ClastPoint%5B1%5D%2CsvgWidth%2A3%2ClastPoint%5B1%5D%5D%29%7Delse%7Bconst%20reg%3DlinearReg%28points%29%3Bpath.setAttribute%28%22d%22%2C%60M%200%20%24%7Breg.intercept%7D%20L%20%20%24%7BsvgWidth%2A3%7D%20%24%7Breg.intercept%2Breg.slope%2AsvgWidth%2A3%7D%60%29%3BlinePoints.push%28%5B0%2Creg.intercept%2CsvgWidth%2A3%2Creg.intercept%2Breg.slope%2AsvgWidth%2A3%5D%29%7Dline.parentElement.appendChild%28path%29%3BoverlayElementsPool.push%28path%29%7Dif%28linePoints.length%3D%3D%3D2%29%7Bconst%20intersectPoint%3Dintersect%28...linePoints%5B0%5D%2C...linePoints%5B1%5D%29%3Bif%28%21intersectPoint%29return%3Bconst%20OFFSET%3DsvgWidth%2A.2%3BsvgElement.setAttribute%28%22viewBox%22%2C%600%20%24%7BMath.min%28intersectPoint.y%2C0%29%7D%20%24%7BintersectPoint.x%2BOFFSET%7D%20%24%7BsvgElement.getAttribute%28%22height%22%29-Math.min%28intersectPoint.y%2C0%29%7D%60%29%3Bconst%20goalPoint%3Ddocument.createElementNS%28%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%2C%22circle%22%29%3BgoalPoint.setAttribute%28%22cx%22%2CintersectPoint.x%29%3BgoalPoint.setAttribute%28%22cy%22%2CintersectPoint.y%29%3BgoalPoint.setAttribute%28%22r%22%2C5%29%3BgoalPoint.setAttribute%28%22fill%22%2C%22gray%22%29%3BgoalPoint.setAttribute%28%22stroke%22%2C%22gray%22%29%3B%5B...chart.querySelectorAll%28%22.highcharts-series%20.highcharts-tracker-line%22%29%5D.reverse%28%29%5B0%5D.parentElement.appendChild%28goalPoint%29%3BoverlayElementsPool.push%28goalPoint%29%7D%7D%3Bfor%28const%20chart%20of%20charts%29renderChart%28chart%29%7D%3Bpredict%28%29%3Bwindow.addEventListener%28%22resize%22%2C%28%28%29%3D%3E%7BsetTimeout%28predict%2C100%29%7D%29%29%3BsetInterval%28predict%2C1e3%29%7D%29%28%29%3B"&gt;Asanaのバーンアップチャートから終了日を予測してプロットする&lt;/a&gt;&lt;pre&gt;/*
 * @title Asanaのバーンアップチャートから終了日を予測してプロットする
 * @description 予測線と終了日をプロットします。完了ポイントは線形に伸び、総ポイントは変化しない想定。
 * @include https://app.asana.com/*
 * @javascript_url
 */

(() =&amp;gt; {
// http://paulbourke.net/geometry/pointlineplane/javascript.txt
// line intercept math by Paul Bourke http://paulbourke.net/geometry/pointlineplane/
// Determine the intersection point of two line segments
// Return FALSE if the lines don't intersect
function intersect(x1, y1, x2, y2, x3, y3, x4, y4) {
  // Check if none of the lines are of length 0
  if ((x1 === x2 &amp;amp;&amp;amp; y1 === y2) || (x3 === x4 &amp;amp;&amp;amp; y3 === y4)) {
    return false;
  }

  let denominator = (y4 - y3) * (x2 - x1) - (x4 - x3) * (y2 - y1);

  // Lines are parallel
  if (denominator === 0) {
    return false;
  }

  let ua = ((x4 - x3) * (y1 - y3) - (y4 - y3) * (x1 - x3)) / denominator;
  let ub = ((x2 - x1) * (y1 - y3) - (y2 - y1) * (x1 - x3)) / denominator;

  // is the intersection along the segments
  if (ua &amp;lt; 0 || ua &amp;gt; 1 || ub &amp;lt; 0 || ub &amp;gt; 1) {
    return false;
  }

  // Return a object with the x and y coordinates of the intersection
  let x = x1 + ua * (x2 - x1);
  let y = y1 + ua * (y2 - y1);

  return { x, y };
}

// based on https://qiita.com/quzq/items/c1a4929f47d986b0f77f, https://www.w3schools.com/ai/ai_regressions.asp
const linearReg = (coordinates) =&amp;gt; {
  const n = coordinates.length;
  const sigX = coordinates.reduce((acc, c) =&amp;gt; acc + c[0], 0.0);
  const sigY = coordinates.reduce((acc, c) =&amp;gt; acc + c[1], 0.0);
  const sigXX = coordinates.reduce((acc, c) =&amp;gt; acc + c[0] * c[0], 0.0);
  const sigXY = coordinates.reduce((acc, c) =&amp;gt; acc + c[0] * c[1], 0.0);
  const slope = (n * sigXY - sigX * sigY) / (n * sigXX - Math.pow(sigX, 2));
  const intercept =
    (sigXX * sigY - sigXY * sigX) / (n * sigXX - Math.pow(sigX, 2));
  return { slope, intercept };
};

let overlayElementsPool = [];
let knownCharts = [];

const predict = () =&amp;gt; {
  for (const path of overlayElementsPool) path.remove();
  overlayElementsPool = [];

  const charts = [...document.querySelectorAll(&amp;quot;.BurnupChart&amp;quot;)];
  const renderChart = (chart) =&amp;gt; {
    const svgElement = chart.querySelector(&amp;quot;svg.highcharts-root&amp;quot;);
    const svgWidth = +svgElement.getAttribute(&amp;quot;width&amp;quot;);
    const lines = [
      ...chart.querySelectorAll(&amp;quot;.highcharts-series .highcharts-tracker-line&amp;quot;),
    ];
    const linePoints = [];
    let lineNumber = 0;
    for (const line of lines) {
      lineNumber++;
      const path = document.createElementNS(
        &amp;quot;http://www.w3.org/2000/svg&amp;quot;,
        &amp;quot;path&amp;quot;
      );
      path.setAttribute(&amp;quot;stroke&amp;quot;, &amp;quot;gray&amp;quot;);
      path.setAttribute(&amp;quot;stroke-width&amp;quot;, &amp;quot;1&amp;quot;);
      path.setAttribute(&amp;quot;fill&amp;quot;, &amp;quot;none&amp;quot;);
      const points = line
        .getAttribute(&amp;quot;d&amp;quot;)
        .match(/([\d\.]+) ([\d\.]+)/g)
        .map((pair) =&amp;gt; pair.split(&amp;quot; &amp;quot;).map((i) =&amp;gt; +i));
      // drop while there are no points
      while (points.length &amp;gt; 1 &amp;amp;&amp;amp; points[0][1] === points[1][1]) {
        points.shift();
      }
      if (lineNumber === 1) {
        // total line
        const lastPoint = points[points.length - 1];
        path.setAttribute(
          &amp;quot;d&amp;quot;,
          `M 0 ${lastPoint[1]} L  ${svgWidth * 3} ${lastPoint[1]}`
        );
        linePoints.push([0, lastPoint[1], svgWidth * 3, lastPoint[1]]);
      } else {
        // done line
        const reg = linearReg(points);
        path.setAttribute(
          &amp;quot;d&amp;quot;,
          `M 0 ${reg.intercept} L  ${svgWidth * 3} ${
            reg.intercept + reg.slope * svgWidth * 3
          }`
        );
        linePoints.push([
          0,
          reg.intercept,
          svgWidth * 3,
          reg.intercept + reg.slope * svgWidth * 3,
        ]);
      }
      line.parentElement.appendChild(path);
      overlayElementsPool.push(path);
    }
    if (linePoints.length === 2) {
      const intersectPoint = intersect(...linePoints[0], ...linePoints[1]);
      if (!intersectPoint) return;
      const OFFSET = svgWidth * 0.2;
      svgElement.setAttribute(
        &amp;quot;viewBox&amp;quot;,
        `0 ${Math.min(intersectPoint.y, 0)} ${intersectPoint.x + OFFSET} ${
          svgElement.getAttribute(&amp;quot;height&amp;quot;) - Math.min(intersectPoint.y, 0)
        }`
      );

      const goalPoint = document.createElementNS(
        &amp;quot;http://www.w3.org/2000/svg&amp;quot;,
        &amp;quot;circle&amp;quot;
      );
      goalPoint.setAttribute(&amp;quot;cx&amp;quot;, intersectPoint.x);
      goalPoint.setAttribute(&amp;quot;cy&amp;quot;, intersectPoint.y);
      goalPoint.setAttribute(&amp;quot;r&amp;quot;, 5);
      goalPoint.setAttribute(&amp;quot;fill&amp;quot;, &amp;quot;gray&amp;quot;);
      goalPoint.setAttribute(&amp;quot;stroke&amp;quot;, &amp;quot;gray&amp;quot;);
      [...chart.querySelectorAll(&amp;quot;.highcharts-series .highcharts-tracker-line&amp;quot;)]
        .reverse()[0]
        .parentElement.appendChild(goalPoint);
      overlayElementsPool.push(goalPoint);
    }
  };

  for (const chart of charts) renderChart(chart);
};
predict();
window.addEventListener(&amp;quot;resize&amp;quot;, () =&amp;gt; {
  setTimeout(predict, 100);
});
// XXX!!!
setInterval(predict, 1000);
})();&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/hitode909/let/jaibrbf2gsAA">
    <link>https://let.hatelabo.jp/hitode909/let/jaibrbf2gsAA</link>
    <dc:date>2022-04-28T01:14:06Z</dc:date>
    <description>https://blog.sushi.money/entry/2022/04/02/221344</description>
    <dc:creator>hitode909</dc:creator>
    <title>[Let] ゾンビをトンビに置換</title>
    <content:encoded>&lt;a href="javascript:%22https%3A%2F%2Flet.st-hatelabo.com%2Fhitode909%2Flet%2Fjaibrbf2gsAA.bookmarklet.js%20%28arg%29%22.replace%28%2F%28%5CS%2B%29%5Cs%2B%28%5CS%2A%29%2F%2Cfunction%28s%2Curl%2Carg%29%7Bs%3Ddocument.createElement%28%22script%22%29%3Bs.charset%3D%22utf-8%22%3Bs.src%3Durl%2B%22%3Fs%3D%22%2BencodeURIComponent%28arg%29%3Bdocument.body.appendChild%28s%29%7D%29%3Bvoid%280%29%3B"&gt;ゾンビをトンビに置換&lt;/a&gt;&lt;pre&gt;/*
 * @title ゾンビをトンビに置換
 * @description https://blog.sushi.money/entry/2022/04/02/221344
 * @include http://*
 * @license MIT License
 * @require 
 */

document.body.innerHTML=document.body.innerHTML.replace(/ゾンビ/gi, 'トンビ');&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/hitode909/let/jYfoh8D2gqAA">
    <link>https://let.hatelabo.jp/hitode909/let/jYfoh8D2gqAA</link>
    <dc:date>2022-02-10T01:42:16Z</dc:date>
    <description>技術評論社の連載ページをscrapbox記法のリストに変換する</description>
    <dc:creator>hitode909</dc:creator>
    <title>[Let] 技術評論社の連載ページをscrapbox記法のリストに変換</title>
    <content:encoded>&lt;a href="javascript:%22https%3A%2F%2Flet.st-hatelabo.com%2Fhitode909%2Flet%2FjYfoh8D2gqAA.bookmarklet.js%20%28arg%29%22.replace%28%2F%28%5CS%2B%29%5Cs%2B%28%5CS%2A%29%2F%2Cfunction%28s%2Curl%2Carg%29%7Bs%3Ddocument.createElement%28%22script%22%29%3Bs.charset%3D%22utf-8%22%3Bs.src%3Durl%2B%22%3Fs%3D%22%2BencodeURIComponent%28arg%29%3Bdocument.body.appendChild%28s%29%7D%29%3Bvoid%280%29%3B"&gt;技術評論社の連載ページをscrapbox記法のリストに変換&lt;/a&gt;&lt;pre&gt;/*
 * @title 技術評論社の連載ページをscrapbox記法のリストに変換
 * @description 技術評論社の連載ページをscrapbox記法のリストに変換する
 * @include https://gihyo.jp/dev/serial/01/perl-hackers-hub
 * @license MIT License
 * @require 
 */

// TODO: 著者や日時も抜き出したい
(() =&amp;gt; {
const source = Array.from(document.querySelectorAll('.toc.article a')).map(a =&amp;gt; ` [${a.href} ${a.textContent}]`).reverse().join(&amp;quot;\n&amp;quot;);
const textarea = document.createElement('textarea');
textarea.value = source;
textarea.readonly = true;
textarea.style = 'position: fixed; left: 20vw; top: 20vh; width: 60vw; height: 60vh; z-index: 99999';
document.body.appendChild(textarea);
})();&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/hitode909/let/jPCC6armgcAA">
    <link>https://let.hatelabo.jp/hitode909/let/jPCC6armgcAA</link>
    <dc:date>2022-01-04T02:42:55Z</dc:date>
    <description>多く時間を使った順にタスクを並べて保持してから実行することで、まんべんなく工数入力する</description>
    <dc:creator>hitode909</dc:creator>
    <title>[Let] 工数入力</title>
    <content:encoded>&lt;a href="javascript:%22https%3A%2F%2Flet.st-hatelabo.com%2Fhitode909%2Flet%2FjPCC6armgcAA.bookmarklet.js%20%28arg%29%22.replace%28%2F%28%5CS%2B%29%5Cs%2B%28%5CS%2A%29%2F%2Cfunction%28s%2Curl%2Carg%29%7Bs%3Ddocument.createElement%28%22script%22%29%3Bs.charset%3D%22utf-8%22%3Bs.src%3Durl%2B%22%3Fs%3D%22%2BencodeURIComponent%28arg%29%3Bdocument.body.appendChild%28s%29%7D%29%3Bvoid%280%29%3B"&gt;工数入力&lt;/a&gt;&lt;pre&gt;/*
 * @title 工数入力
 * @description 多く時間を使った順にタスクを並べて保持してから実行することで、まんべんなく工数入力する
 * @include https://atnd.ak4.jp/
 * @license MIT License
 * @require 
 */

var inputs=document.querySelectorAll('input[placeholder=&amp;quot;0:00&amp;quot;]');
var total=document.querySelector('#total_working_hours').textContent;
var totalMin=Number(total.split(':')[0])*60+Number(total.split(':')[1]);
var current=1.0;
var rates=Array.from(inputs).map(i =&amp;gt; {
  let factor=1.0+Math.random()+Math.random();
  return current*=factor;
}).reverse();
var rateTotal=rates.reduce((a, b) =&amp;gt; a+b);
eachMins=rates.map(rate =&amp;gt; Math.floor(rate/rateTotal*totalMin));
var diffMin=totalMin-(eachMins.reduce((a,b)=&amp;gt;a+b));
inputs.forEach(i =&amp;gt; {
  var min=eachMins.shift()+diffMin;
  i.value=`${Math.floor(min/60)}:${min%60}`;diffMin=0;
});

var change = document.createEvent(&amp;quot;HTMLEvents&amp;quot;);
change.initEvent('change', true, true );
inputs[0].dispatchEvent(change);&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/hitode909/let/hLHWtIHosZ99">
    <link>https://let.hatelabo.jp/hitode909/let/hLHWtIHosZ99</link>
    <dc:date>2017-01-15T03:14:49Z</dc:date>
    <description>Amazonの本のページからamakanに移動します。</description>
    <dc:creator>hitode909</dc:creator>
    <title>[Let] Amazonの本のページからamakanに移動</title>
    <content:encoded>&lt;a href="javascript:javascript%3Alocation.href%3D%22https%3A%2F%2Famakan.net%2Fsearch%3Fquery%3D%22%2Blocation.href%3B"&gt;Amazonの本のページからamakanに移動&lt;/a&gt;&lt;pre&gt;/*
 * @title Amazonの本のページからamakanに移動
 * @description Amazonの本のページからamakanに移動します。
 * @include https://*
 * @license MIT License
 * @require 
 * @javascript_url
 */


javascript:location.href=&amp;quot;https://amakan.net/search?query=&amp;quot;+location.href&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/hitode909/let/hJmc5Jbys6YJ">
    <link>https://let.hatelabo.jp/hitode909/let/hJmc5Jbys6YJ</link>
    <dc:date>2016-02-27T06:33:56Z</dc:date>
    <description>所要時間(宿題は除く)をalertします</description>
    <dc:creator>hitode909</dc:creator>
    <title>[Let] Courseraの所要時間</title>
    <content:encoded>&lt;a href="javascript:%22https%3A%2F%2Flet.st-hatelabo.com%2Fhitode909%2Flet%2FhJmc5Jbys6YJ.bookmarklet.js%20%28arg%29%22.replace%28%2F%28%5CS%2B%29%5Cs%2B%28%5CS%2A%29%2F%2Cfunction%28s%2Curl%2Carg%29%7Bs%3Ddocument.createElement%28%22script%22%29%3Bs.charset%3D%22utf-8%22%3Bs.src%3Durl%2B%22%3Fs%3D%22%2BencodeURIComponent%28arg%29%3Bdocument.body.appendChild%28s%29%7D%29%3Bvoid%280%29%3B"&gt;Courseraの所要時間&lt;/a&gt;&lt;pre&gt;/*
 * @title Courseraの所要時間
 * @description 所要時間(宿題は除く)をalertします
 * @include https://www.coursera.org/learn/machine-learning/home/week/*
 * @license MIT License
 * @require 
 */


// CourseraはHTTPSなので動かなかった!
alert('total ' + Array.prototype.slice.apply(document.querySelectorAll('.text-hint')).map(function(node) { return +(node.textContent.match(/(\d+) min/)||[null, 0])[1]}).reduce(function(a,b){ return a+b}) + ' min');


&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/hitode909/let/hJmd2LuH7cM-">
    <link>https://let.hatelabo.jp/hitode909/let/hJmd2LuH7cM-</link>
    <dc:date>2014-06-22T13:29:31Z</dc:date>
    <description>はてなアルバムからはてなブログにインポート可能なMT形式を生成します．アルバムページで実行してください．</description>
    <dc:creator>hitode909</dc:creator>
    <title>[Let] はてなアルバムからはてなブログに引っ越す</title>
    <content:encoded>&lt;a href="javascript:%22https%3A%2F%2Flet.st-hatelabo.com%2Fhitode909%2Flet%2FhJmd2LuH7cM-.bookmarklet.js%20%28arg%29%22.replace%28%2F%28%5CS%2B%29%5Cs%2B%28%5CS%2A%29%2F%2Cfunction%28s%2Curl%2Carg%29%7Bs%3Ddocument.createElement%28%22script%22%29%3Bs.charset%3D%22utf-8%22%3Bs.src%3Durl%2B%22%3Fs%3D%22%2BencodeURIComponent%28arg%29%3Bdocument.body.appendChild%28s%29%7D%29%3Bvoid%280%29%3B"&gt;はてなアルバムからはてなブログに引っ越す&lt;/a&gt;&lt;pre&gt;/*
 * @title はてなアルバムからはてなブログに引っ越す
 * @description はてなアルバムからはてなブログにインポート可能なMT形式を生成します．アルバムページで実行してください．
 * @include http://album.hatena.ne.jp/album/*
 * @license MIT License
 * @require http://higashi-dance-network.appspot.com/bon/js/base64.js
 */

var template = function(text) {
    return function(values) {
        return text.replace(/{([^}]+)}/g, function(_, key) {
            return values[key];
        });
    }
};

var item_template = template([
    &amp;quot;AUTHOR: {author_name}&amp;quot;,
    &amp;quot;DATE: {date}&amp;quot;,
    &amp;quot;PRIMARY_CATEGORY: {category}&amp;quot;,
    &amp;quot;-----&amp;quot;,
    &amp;quot;BODY:&amp;quot;,
    &amp;quot;{body}&amp;quot;,
    &amp;quot;--------&amp;quot;
].join(&amp;quot;\n&amp;quot;));

var item_to_mt_syntax = function($img, category) {
    var fotolife_url = $img.attr('data-image-url');
    var image_url = $img.attr('data-image-image');
    var $a = $('&amp;lt;a&amp;gt;');
    $a.attr('href', fotolife_url);
    var pathname = $a[0].pathname;
    var author_name = pathname.split('/')[1];
    var date = pathname.split('/')[2];
    var year = date.substr(0, 4);
    var month = date.substr(4, 2);
    var day = date.substr(6, 2);
    var hour = date.substr(8, 2);
    var minute = date.substr(10, 2);
    var second = date.substr(12, 2);

    var body_template = template('&amp;lt;p&amp;gt;&amp;lt;img class=&amp;quot;http-image&amp;quot; src=&amp;quot;{url}&amp;quot;&amp;gt;&amp;lt;/p&amp;gt;\n&amp;lt;p&amp;gt;Photo by id:{author_name}:detail&amp;lt;/p&amp;gt;');
    var date_template = template('{month}/{day}/{year} {hour}:{minute}:{second}');

    return item_template({
        body: body_template({url: image_url, author_name: author_name}),
        date: date_template({year: year, month:month, day:day, hour:hour, minute:minute, second:second}),
        author_name: author_name,
        basename: date,
        category: category
    });
};

var main = function() {
    var mt_syntax = $('.photo-image').map(function() {
        var $img = $(this);
        return item_to_mt_syntax($img, Hatena.Album.title);
    }).get().join(&amp;quot;\n&amp;quot;) + &amp;quot;\n&amp;quot;;

    var $message = $('&amp;lt;p&amp;gt;');
    $message.css('background', 'white', 'padding', '5px');
    $message.append('ファイルの準備ができました．');
    $message.append('&amp;lt;br&amp;gt;');
    $message.append('右クリックで保存してください：');
    var $download = $('&amp;lt;a&amp;gt;');
    $download.css('text-decoration', 'underline');
    $download.text(Hatena.Album.title + '.txt');
    $download.attr({
        href: 'data:text/plain;charset=utf-8;base64,' + Base64.encode(mt_syntax)
    });
    $message.append($download);

    $message.append('&amp;lt;br&amp;gt;');
    $message.append('ダウンロードしたファイルはMovableTye形式ではてなブログにインポートできます：');
    var $import_link = $('&amp;lt;a&amp;gt;');
    $import_link.css('text-decoration', 'underline');
    $import_link.attr('target', '_blank');
    $import_link.attr('href', 'http://blog.hatena.ne.jp/my/import/movable_type');
    $import_link.text('はてなブログにインポートする');
    $message.append($import_link);

    $message.hide();
    $('#container').prepend($message);
    $message.slideDown();
};

if (!$('body.album')[0]) {
    alert('アルバムページで実行してください');
    return;
}

main();

&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/hitode909/let/hLHV1eS_-K1W">
    <link>https://let.hatelabo.jp/hitode909/let/hLHV1eS_-K1W</link>
    <dc:date>2014-06-18T09:23:03Z</dc:date>
    <description>my bookmarklet</description>
    <dc:creator>hitode909</dc:creator>
    <title>[Let] 元気でる</title>
    <content:encoded>&lt;a href="javascript:%22https%3A%2F%2Flet.st-hatelabo.com%2Fhitode909%2Flet%2FhLHV1eS_-K1W.bookmarklet.js%20%28arg%29%22.replace%28%2F%28%5CS%2B%29%5Cs%2B%28%5CS%2A%29%2F%2Cfunction%28s%2Curl%2Carg%29%7Bs%3Ddocument.createElement%28%22script%22%29%3Bs.charset%3D%22utf-8%22%3Bs.src%3Durl%2B%22%3Fs%3D%22%2BencodeURIComponent%28arg%29%3Bdocument.body.appendChild%28s%29%7D%29%3Bvoid%280%29%3B"&gt;元気でる&lt;/a&gt;&lt;pre&gt;/*
 * @title 元気でる
 * @description my bookmarklet
 * @include http://*
 * @license MIT License
 * @require jquery
 */



document.body.setAttribute(&amp;quot;style&amp;quot;,&amp;quot;background: url(https://dl.dropboxusercontent.com/u/8270034/g/sozai.png)&amp;quot;)
$('img').attr('src','https://dl.dropboxusercontent.com/u/8270034/g/sozai.png');&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/hitode909/let/hJmcoI6U0bxv">
    <link>https://let.hatelabo.jp/hitode909/let/hJmcoI6U0bxv</link>
    <dc:date>2013-09-09T04:03:01Z</dc:date>
    <description>http://qiita.com/tadsan/items/99d816e78ca429093b75 の旧仮名遣いを新しくするやつ</description>
    <dc:creator>hitode909</dc:creator>
    <title>[Let] 「ライセンスの選択を恐れる必要はありません」の旧仮名遣いを新しくするやつ</title>
    <content:encoded>&lt;a href="javascript:%22https%3A%2F%2Flet.st-hatelabo.com%2Fhitode909%2Flet%2FhJmcoI6U0bxv.bookmarklet.js%20%28arg%29%22.replace%28%2F%28%5CS%2B%29%5Cs%2B%28%5CS%2A%29%2F%2Cfunction%28s%2Curl%2Carg%29%7Bs%3Ddocument.createElement%28%22script%22%29%3Bs.charset%3D%22utf-8%22%3Bs.src%3Durl%2B%22%3Fs%3D%22%2BencodeURIComponent%28arg%29%3Bdocument.body.appendChild%28s%29%7D%29%3Bvoid%280%29%3B"&gt;「ライセンスの選択を恐れる必要はありません」の旧仮名遣いを新しくするやつ&lt;/a&gt;&lt;pre&gt;/*
 * @title 「ライセンスの選択を恐れる必要はありません」の旧仮名遣いを新しくするやつ
 * @description http://qiita.com/tadsan/items/99d816e78ca429093b75 の旧仮名遣いを新しくするやつ
 * @include http://qiita.com/tadsan/items/99d816e78ca429093b75
 * @license MIT License
 * @require jQuery
 */

var rules=[
  [/ひ|ゐ/g, 'い'],
  [/ふ/g, 'う'],
  [/智/g, '知'],
  [/萃/g, '粋'],
  [/註/g, '注'],
  [/函/g, '関'],
  [/抛/g, '放'],
  [/へ([^の誘])/g, function(_, c) { return 'え' + c; } ]
];

var $body=$('section[itemprop=&amp;quot;articleBody&amp;quot;]');

var html = $body.html();

$.each(rules, function(_, rule) {
  html = html.replace(rule[0], rule[1]);
});

$body.html(html);&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/hitode909/let/gYC-y4uM7LKcaQ">
    <link>https://let.hatelabo.jp/hitode909/let/gYC-y4uM7LKcaQ</link>
    <dc:date>2013-01-20T16:32:11Z</dc:date>
    <description>$('img:last').prependTo(document.body);</description>
    <dc:creator>hitode909</dc:creator>
    <title>[Let] rotate images</title>
    <content:encoded>&lt;a href="javascript:%22https%3A%2F%2Flet.st-hatelabo.com%2Fhitode909%2Flet%2FgYC-y4uM7LKcaQ.bookmarklet.js%20%28arg%29%22.replace%28%2F%28%5CS%2B%29%5Cs%2B%28%5CS%2A%29%2F%2Cfunction%28s%2Curl%2Carg%29%7Bs%3Ddocument.createElement%28%22script%22%29%3Bs.charset%3D%22utf-8%22%3Bs.src%3Durl%2B%22%3Fs%3D%22%2BencodeURIComponent%28arg%29%3Bdocument.body.appendChild%28s%29%7D%29%3Bvoid%280%29%3B"&gt;rotate images&lt;/a&gt;&lt;pre&gt;/*
 * @title rotate images
 * @description $('img:last').prependTo(document.body);
 * @include http://*
 * @license MIT License
 * @require jQuery
 */

setInterval(function() {
  $('img:last').prependTo(document.body);
}, 20);
&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/hitode909/let/gYC-yu-RjrLCJQ">
    <link>https://let.hatelabo.jp/hitode909/let/gYC-yu-RjrLCJQ</link>
    <dc:date>2012-12-08T05:57:53Z</dc:date>
    <description>reblog advent calend*e*r 7889 hitode909-nize</description>
    <dc:creator>hitode909</dc:creator>
    <title>[Let] RacHitodenize #RAC7889</title>
    <content:encoded>&lt;a href="javascript:%22https%3A%2F%2Flet.st-hatelabo.com%2Fhitode909%2Flet%2FgYC-yu-RjrLCJQ.bookmarklet.js%20%28arg%29%22.replace%28%2F%28%5CS%2B%29%5Cs%2B%28%5CS%2A%29%2F%2Cfunction%28s%2Curl%2Carg%29%7Bs%3Ddocument.createElement%28%22script%22%29%3Bs.charset%3D%22utf-8%22%3Bs.src%3Durl%2B%22%3Fs%3D%22%2BencodeURIComponent%28arg%29%3Bdocument.body.appendChild%28s%29%7D%29%3Bvoid%280%29%3B"&gt;RacHitodenize #RAC7889&lt;/a&gt;&lt;pre&gt;/*
 * @title RacHitodenize #RAC7889
 * @description reblog advent calend*e*r 7889 hitode909-nize
 * @include http://*.tumblr.com/*
 * @license reblog commons license ( cc by 3.0 )
 * @require jquery
 */

// bookmark:
// http://atnd.org/events/34738
// http://reblogadventcalender7889.tumblr.com/

// http://reblogadventcalender7889.tumblr.com/post/37393584199
// http://hitode909.hatenablog.com/entry/2012/11/17/110000
// http://let.hatelabo.jp/hitode909/let/gYC-yuG7p7bWEg
// made by @hitode909 https://twitter.com/hitode909

window.requestAnimationFrame = (function () {
  return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || function (callback, element) {
    return window.setTimeout(function () {
      return callback();
    }, 1000 / 60);
  };
})();

$(function () {
  var choise = (function (list) {
    var i = 0;
    return function (list) {
      if (list.length == 0) return null;
      return list[++i % list.length];
    };
  })();
  var $body = $(document.body);
  var $container = $('#container');

  var $images_top = [];
  $.get('/', function (res) {
    $images_top = $(res).find('.photo img');
  });
  var opacity = 0;

  var step = function () {
    var $images = $('.photo img');

    var img = choise($images.length &amp;gt; 1 ? $images : $images_top);
    opacity = opacity &amp;gt; 0 ? 0 : 100;

    $body.css({
      background: img ? 'url(' + img.src + ')' : '',
      'background-position': 'center',
      'background-repeat': 'no-repeat',
      'background-attachment': 'fixed',
      'background-size': 'cover'
    });
    $container.css({
      opacity: opacity
    });
  };

  var loop = function () {
    step();
    window.requestAnimationFrame(loop);
  };
  loop();
});&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/hitode909/let/gYC-yuG7p7bWEg">
    <link>https://let.hatelabo.jp/hitode909/let/gYC-yuG7p7bWEg</link>
    <dc:date>2012-11-17T00:11:44Z</dc:date>
    <description>チカチカします</description>
    <dc:creator>hitode909</dc:creator>
    <title>[Let] ページをチカチカさせるやつ</title>
    <content:encoded>&lt;a href="javascript:%22https%3A%2F%2Flet.st-hatelabo.com%2Fhitode909%2Flet%2FgYC-yuG7p7bWEg.bookmarklet.js%20%28arg%29%22.replace%28%2F%28%5CS%2B%29%5Cs%2B%28%5CS%2A%29%2F%2Cfunction%28s%2Curl%2Carg%29%7Bs%3Ddocument.createElement%28%22script%22%29%3Bs.charset%3D%22utf-8%22%3Bs.src%3Durl%2B%22%3Fs%3D%22%2BencodeURIComponent%28arg%29%3Bdocument.body.appendChild%28s%29%7D%29%3Bvoid%280%29%3B"&gt;ページをチカチカさせるやつ&lt;/a&gt;&lt;pre&gt;/*
 * @title ページをチカチカさせるやつ
 * @description チカチカします
 * @include http://*
 * @license MIT License
 * @require 
 */

window.requestAnimationFrame = (function() {
  return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || function(callback, element) {
    return window.setTimeout(function() {
      return callback();
    }, 1000 / 60);
  };
})();


var randomColor = function() { return 'rgb(' + (Math.random() &amp;gt; 0.5 ? 255 : 0) + ', ' + (Math.random() &amp;gt; 0.5 ? 255 : 0) + ', ' + (Math.random() &amp;gt; 0.5 ? 255 : 0) + ')' };

var style = document.createElement('style');
document.body.appendChild(style);

var selectors = Array.prototype.slice.call(document.querySelectorAll('*[id]')).map(function(element) {
    var id = element.id
    if (!id) return '';
    return element.tagName + '#' + id;
}).concat(Array.prototype.slice.call(document.querySelectorAll('*[class]')).map(function(element) {
    var className = element.className;
    if (!className) return '';
    return element.tagName + '.' + className;
}));

var apply = function() {
    style.textContent = ['*', 'body'].concat(selectors).map(function(selector) {
        if (!selector) return '';
        return selector + ' {color: ' + randomColor() + '; background: ' + randomColor() + ' }';
    }).join(&amp;quot;\n&amp;quot;);
    window.requestAnimationFrame(apply);
};

apply();&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/hitode909/let/gYC-ycit4Iq-IQ">
    <link>https://let.hatelabo.jp/hitode909/let/gYC-ycit4Iq-IQ</link>
    <dc:date>2012-03-24T04:23:50Z</dc:date>
    <description>文字を汚ない画像にするやつ 例 → http://dl.dropbox.com/u/8270034/g/e333618264368ada4432c70ffe376447.png</description>
    <dc:creator>hitode909</dc:creator>
    <title>[Let] 文字を汚ない画像にする</title>
    <content:encoded>&lt;a href="javascript:%22https%3A%2F%2Flet.st-hatelabo.com%2Fhitode909%2Flet%2FgYC-ycit4Iq-IQ.bookmarklet.js%20%28arg%29%22.replace%28%2F%28%5CS%2B%29%5Cs%2B%28%5CS%2A%29%2F%2Cfunction%28s%2Curl%2Carg%29%7Bs%3Ddocument.createElement%28%22script%22%29%3Bs.charset%3D%22utf-8%22%3Bs.src%3Durl%2B%22%3Fs%3D%22%2BencodeURIComponent%28arg%29%3Bdocument.body.appendChild%28s%29%7D%29%3Bvoid%280%29%3B"&gt;文字を汚ない画像にする&lt;/a&gt;&lt;pre&gt;/*
 * @title 文字を汚ない画像にする
 * @description 文字を汚ない画像にするやつ 例 → http://dl.dropbox.com/u/8270034/g/e333618264368ada4432c70ffe376447.png
 * @include http://*
 * @license MIT License
 * @require http://hitode909.appspot.com/text_to_image/text_to_image.js
 */

var walkTextNode = function(node, callback) {
    var children = node.childNodes;
    for (var i = 0, len = children.length; i &amp;lt; len; i++) {
        var child = children[i];
        if (child.nodeType == 3) {
            callback(child);
        } else if (child.childNodes.length &amp;gt; 0 &amp;amp;&amp;amp; child.offsetWidth &amp;gt; 0 &amp;amp;&amp;amp; ! node.tagName.match(/script/)) {
            walkTextNode(child, callback);
        }
    }
}

walkTextNode(document.body, function(node) {
    if (node.textContent.match(/^\s+$/)) return;
    var style = document.defaultView.getComputedStyle(node.parentNode, '');
    var tti = new TextToImage;
    tti.text = node.textContent;
    tti.width = node.parentNode.offsetWidth;
    tti.font = style.font;
    tti.color = style.color;
    tti.background = style.backgroundColor;
    if (tti.background == 'rgba(0, 0, 0, 0)') {
        if (tti.color == 'rgb(255, 255, 255)') {
            tti.background = 'rgb(0, 0, 0)';
        } else {
            tti.background = 'rgb(255, 255, 255)';
        }
    }
    node.parentNode.replaceChild(tti.createImage('image/jpeg', 0.01), node);
});&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/hitode909/let/gYC-yba2mZivbQ">
    <link>https://let.hatelabo.jp/hitode909/let/gYC-yba2mZivbQ</link>
    <dc:date>2012-02-25T07:22:15Z</dc:date>
    <description>http://mohayonao.herokuapp.com/d</description>
    <dc:creator>hitode909</dc:creator>
    <title>[Let] ドリランドッドリランドッドッドッドリランド</title>
    <content:encoded>&lt;a href="javascript:%22https%3A%2F%2Flet.st-hatelabo.com%2Fhitode909%2Flet%2FgYC-yba2mZivbQ.bookmarklet.js%20%28arg%29%22.replace%28%2F%28%5CS%2B%29%5Cs%2B%28%5CS%2A%29%2F%2Cfunction%28s%2Curl%2Carg%29%7Bs%3Ddocument.createElement%28%22script%22%29%3Bs.charset%3D%22utf-8%22%3Bs.src%3Durl%2B%22%3Fs%3D%22%2BencodeURIComponent%28arg%29%3Bdocument.body.appendChild%28s%29%7D%29%3Bvoid%280%29%3B"&gt;ドリランドッドリランドッドッドッドリランド&lt;/a&gt;&lt;pre&gt;/*
 * @title ドリランドッドリランドッドッドッドリランド
 * @description http://mohayonao.herokuapp.com/d
 * @include http://mohayonao.herokuapp.com/d
 * @license MIT License
 * @require 
 */

$('&amp;lt;script&amp;gt;').attr('src', 'http://hitode909.appspot.com/text-generator/text-generator.js').appendTo($('body'));
$('&amp;lt;script&amp;gt;').attr('src', 'http://hitode909.appspot.com/text-generator/underscore-min.js').appendTo($('body'));

var main=function() {
  var g=new TextGenerator('ドッドッドリランド', 1);
  var txt='';
  for(var i=0; i &amp;lt; 100000; i++) {
     txt += g.get();
  }
  $('#text').text(txt);
  $('#play').click()
};

setTimeout(main, 1000);&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/hitode909/let/gYC-xYL11uidOQ">
    <link>https://let.hatelabo.jp/hitode909/let/gYC-xYL11uidOQ</link>
    <dc:date>2011-12-07T07:28:38Z</dc:date>
    <description>Wikipediaの記事をカットアップします</description>
    <dc:creator>hitode909</dc:creator>
    <title>[Let] wikipedia-cutup</title>
    <content:encoded>&lt;a href="javascript:%22https%3A%2F%2Flet.st-hatelabo.com%2Fhitode909%2Flet%2FgYC-xYL11uidOQ.bookmarklet.js%20%28arg%29%22.replace%28%2F%28%5CS%2B%29%5Cs%2B%28%5CS%2A%29%2F%2Cfunction%28s%2Curl%2Carg%29%7Bs%3Ddocument.createElement%28%22script%22%29%3Bs.charset%3D%22utf-8%22%3Bs.src%3Durl%2B%22%3Fs%3D%22%2BencodeURIComponent%28arg%29%3Bdocument.body.appendChild%28s%29%7D%29%3Bvoid%280%29%3B"&gt;wikipedia-cutup&lt;/a&gt;&lt;pre&gt;/*
 * @title wikipedia-cutup
 * @description Wikipediaの記事をカットアップします
 * @include http://ja.wikipedia.org/wiki/
 * @license MIT License
 */

function selectRandom(list) {
    return list[Math.floor(Math.random() * list.length)];
};

function Page(url) {
    var self = this;
    $.ajax({
        url: url || '/wiki/Special:Randompage',
        dataType: 'html'
    }).success(function(res) {
        self.nodes = $(res).find('.mw-content-ltr&amp;gt;*');
        self.title = $(res).find('h1').text();
        self.success = true;
    });
}

Page.prototype = {
    getNode: function() {
        if (!this.nodes) return null;
        return $(selectRandom(this.nodes)).clone()[0];
    }
};

var i = 0;
var pages = [];
pages.push(new Page(location.href));

for (i = 0; i &amp;lt; 5; i++) {
    pages.push(new Page);
}

var h1 = $('h1');

h1.text('...');

var timer = setInterval(function() {
    var i;
    for (i = 0; i &amp;lt; pages.length; i++) {
        if (!pages[i].success) {
            return;
        }
    }

    $('#bodyContent').empty();

    var titles = [];
    h1.text('');
    for (i = 0; i &amp;lt; pages.length; i++) {
        h1.append($('&amp;lt;a&amp;gt;').attr('href', '/wiki/' + encodeURIComponent(pages[i].title)).text(pages[i].title));
    }

    clearInterval(timer);

    var fragment = document.createDocumentFragment();
    console.log(pages[0].getNode());
    for (i = 0; i &amp;lt; 100; i++) {
        var page = selectRandom(pages);
        fragment.appendChild(page.getNode());
    }
    $('#bodyContent').append(fragment);
}, 100);
&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/hitode909/let/gYC-xMem8c_LPw">
    <link>https://let.hatelabo.jp/hitode909/let/gYC-xMem8c_LPw</link>
    <dc:date>2011-09-06T11:33:43Z</dc:date>
    <description>ダイヤルでスクロールできます</description>
    <dc:creator>hitode909</dc:creator>
    <title>[Let] dial_scroll</title>
    <content:encoded>&lt;a href="javascript:%22https%3A%2F%2Flet.st-hatelabo.com%2Fhitode909%2Flet%2FgYC-xMem8c_LPw.bookmarklet.js%20%28arg%29%22.replace%28%2F%28%5CS%2B%29%5Cs%2B%28%5CS%2A%29%2F%2Cfunction%28s%2Curl%2Carg%29%7Bs%3Ddocument.createElement%28%22script%22%29%3Bs.charset%3D%22utf-8%22%3Bs.src%3Durl%2B%22%3Fs%3D%22%2BencodeURIComponent%28arg%29%3Bdocument.body.appendChild%28s%29%7D%29%3Bvoid%280%29%3B"&gt;dial_scroll&lt;/a&gt;&lt;pre&gt;/*
 * @title dial_scroll
 * @description ダイヤルでスクロールできます
 * @include http://*
 * @license MIT License
 * @require jQuery
 */

(function($) {
  var throttle;
  throttle = function(fn, delay) {
    var timer;
    timer = null;
    return function() {
      var args, context;
      if (timer) {
        return;
      }
      context = this;
      args = arguments;
      return timer = setTimeout(function() {
        timer = null;
        return fn.apply(context, args);
      }, delay);
    };
  };
  var debounce;
  debounce = function(fn, delay) {
    var timer;
    timer = null;
    return function() {
      var args, context;
      if (timer) {
        clearTimeout(timer);
      }
      context = this;
      args = arguments;
      return timer = setTimeout(function() {
        timer = null;
        return fn.apply(context, args);
      }, delay);
    };
  };
  $.fn.dial = function(callback) {
    var container, last;
    last = null;
    container = this;
    return $(container).mousemove(throttle(function(event) {
      var center, diff, distance, rad, x, y;
      center = {
        left: $(container).position().left + $(container).width() / 2,
        top: $(container).position().top + $(container).height() / 2
      };
      x = event.pageX - center.left;
      y = event.pageY - center.top;
      distance = Math.sqrt(x * x + y * y);
      rad = Math.atan(y / x);
      if (x &amp;lt; 0) {
        rad += Math.PI;
      }
      if (last == null) {
        last = rad;
      }
      diff = rad - last;
      if (diff &amp;lt; -Math.PI) {
        diff += Math.PI * 2;
      }
      if (diff &amp;gt; Math.PI) {
        diff -= Math.PI * 2;
      }
      callback.apply(container, [diff, distance]);
      return last = rad;
    }, 100));
  };

  var $wrapper = $(&amp;quot;&amp;lt;div&amp;gt;&amp;quot;).css({
        width: &amp;quot;100%&amp;quot;,
        height: &amp;quot;100%&amp;quot;,
        position: &amp;quot;fixed&amp;quot;,
        top: 0,
        left: 0,
  });
  $(&amp;quot;body&amp;quot;).append($wrapper);
  var accel = 0;
  $wrapper.dial(function(diff) {
      accel += diff * 20;
  });
  setInterval(function() {
      window.scrollBy(0, accel);
      accel *= 0.92;
  }, 30);
  $(&amp;quot;body&amp;quot;).mousemove(throttle(function() {
      console.log(&amp;quot;show&amp;quot;);
      $wrapper.show();
  }, 50));
  $(&amp;quot;body&amp;quot;).mousemove(debounce(function() {
      console.log(&amp;quot;hide&amp;quot;);
      $wrapper.hide();
  }, 100));
})(jQuery);
&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/hitode909/let/gYC-yMenvtvgLQ">
    <link>https://let.hatelabo.jp/hitode909/let/gYC-yMenvtvgLQ</link>
    <dc:date>2011-09-05T16:47:12Z</dc:date>
    <description>ダイヤルで回せます</description>
    <dc:creator>hitode909</dc:creator>
    <title>[Let] dial_rotate</title>
    <content:encoded>&lt;a href="javascript:%22https%3A%2F%2Flet.st-hatelabo.com%2Fhitode909%2Flet%2FgYC-yMenvtvgLQ.bookmarklet.js%20%28arg%29%22.replace%28%2F%28%5CS%2B%29%5Cs%2B%28%5CS%2A%29%2F%2Cfunction%28s%2Curl%2Carg%29%7Bs%3Ddocument.createElement%28%22script%22%29%3Bs.charset%3D%22utf-8%22%3Bs.src%3Durl%2B%22%3Fs%3D%22%2BencodeURIComponent%28arg%29%3Bdocument.body.appendChild%28s%29%7D%29%3Bvoid%280%29%3B"&gt;dial_rotate&lt;/a&gt;&lt;pre&gt;/*
 * @title dial_rotate
 * @description ダイヤルで回せます
 * @include http://*
 * @license MIT License
 * @require jQuery
 */

(function($) {
  var throttle;
  throttle = function(fn, delay) {
    var timer;
    timer = null;
    return function() {
      var args, context;
      if (timer) {
        return;
      }
      context = this;
      args = arguments;
      return timer = setTimeout(function() {
        timer = null;
        return fn.apply(context, args);
      }, delay);
    };
  };
  var debounce;
  debounce = function(fn, delay) {
    var timer;
    timer = null;
    return function() {
      var args, context;
      if (timer) {
        clearTimeout(timer);
      }
      context = this;
      args = arguments;
      return timer = setTimeout(function() {
        timer = null;
        return fn.apply(context, args);
      }, delay);
    };
  };
  $.fn.dial = function(callback) {
    var container, last;
    last = null;
    container = this;
    return $(container).mousemove(throttle(function(event) {
      var center, diff, distance, rad, x, y;
      center = {
        left: $(container).position().left + $(container).width() / 2,
        top: $(container).position().top + $(container).height() / 2
      };
      x = event.pageX - center.left;
      y = event.pageY - center.top;
      distance = Math.sqrt(x * x + y * y);
      rad = Math.atan(y / x);
      if (x &amp;lt; 0) {
        rad += Math.PI;
      }
      if (last == null) {
        last = rad;
      }
      diff = rad - last;
      if (diff &amp;lt; -Math.PI) {
        diff += Math.PI * 2;
      }
      if (diff &amp;gt; Math.PI) {
        diff -= Math.PI * 2;
      }
      callback.apply(container, [diff, distance]);
      return last = rad;
    }, 100));
  };

  $(&amp;quot;img&amp;quot;).each(function() {
      $(this).dial(function(diff) {
          var deg = $(this).data(&amp;quot;degree&amp;quot;) || 0;
          deg += diff / Math.PI * 360.0;
          $(this).data(&amp;quot;degree&amp;quot;, deg);
          $(this).css({
              &amp;quot;-webkit-transform&amp;quot;: &amp;quot;rotate(&amp;quot; + deg + &amp;quot;deg)&amp;quot;,
              &amp;quot;-moz-transform&amp;quot;: &amp;quot;rotate(&amp;quot; + deg + &amp;quot;deg)&amp;quot;
          });
      });
  });
})(jQuery);
&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/hitode909/let/gYC-yIuan5TgNg">
    <link>https://let.hatelabo.jp/hitode909/let/gYC-yIuan5TgNg</link>
    <dc:date>2011-06-04T07:52:51Z</dc:date>
    <description>my bookmarklet</description>
    <dc:creator>hitode909</dc:creator>
    <title>[Let] DM @hitode909 こんにちは</title>
    <content:encoded>&lt;a href="javascript:%22https%3A%2F%2Flet.st-hatelabo.com%2Fhitode909%2Flet%2FgYC-yIuan5TgNg.bookmarklet.js%20%28arg%29%22.replace%28%2F%28%5CS%2B%29%5Cs%2B%28%5CS%2A%29%2F%2Cfunction%28s%2Curl%2Carg%29%7Bs%3Ddocument.createElement%28%22script%22%29%3Bs.charset%3D%22utf-8%22%3Bs.src%3Durl%2B%22%3Fs%3D%22%2BencodeURIComponent%28arg%29%3Bdocument.body.appendChild%28s%29%7D%29%3Bvoid%280%29%3B"&gt;DM @hitode909 こんにちは&lt;/a&gt;&lt;pre&gt;/*
 * @title DM @hitode909 こんにちは
 * @description my bookmarklet
 * @include http://*
 * @license MIT License
 * @require 
 */
alert(1);

&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/hitode909/let/gYC-x-jF_-2zFg">
    <link>https://let.hatelabo.jp/hitode909/let/gYC-x-jF_-2zFg</link>
    <dc:date>2011-04-11T11:43:51Z</dc:date>
    <description>my bookmarklet</description>
    <dc:creator>hitode909</dc:creator>
    <title>[Let] super_mind_free</title>
    <content:encoded>&lt;a href="javascript:%22https%3A%2F%2Flet.st-hatelabo.com%2Fhitode909%2Flet%2FgYC-x-jF_-2zFg.bookmarklet.js%20%28arg%29%22.replace%28%2F%28%5CS%2B%29%5Cs%2B%28%5CS%2A%29%2F%2Cfunction%28s%2Curl%2Carg%29%7Bs%3Ddocument.createElement%28%22script%22%29%3Bs.charset%3D%22utf-8%22%3Bs.src%3Durl%2B%22%3Fs%3D%22%2BencodeURIComponent%28arg%29%3Bdocument.body.appendChild%28s%29%7D%29%3Bvoid%280%29%3B"&gt;super_mind_free&lt;/a&gt;&lt;pre&gt;/*
 * @title super_mind_free
 * @description my bookmarklet
 * @include http://mindfree.jp/#/mindfree
 * @license MIT License
 * @require 
 */


window.MouseUtil = { };
['mousemove', 'mousedown', 'mouseup', 'click'].forEach(function (method) {
    window.MouseUtil[method] = function(x, y) {
        if (!x) x = 0;
        if (!y) y = 0;
        var event = document.createEvent(&amp;quot;MouseEvents&amp;quot;);
        event.initMouseEvent(method, true, false, window,
                             0, x, y, x, y, false, false, true, false, 0, null );
        return event;
    }
});


setInterval(function(){
  document.querySelector(&amp;quot;canvas&amp;quot;).dispatchEvent(window.MouseUtil.mousemove(960 + Math.floor(Math.random() * 400), 180));
  document.querySelector(&amp;quot;canvas&amp;quot;).dispatchEvent(window.MouseUtil.click(0, 0));
}, 0)
&lt;/pre&gt;</content:encoded>
  </item>
</rdf:RDF>
