diff --git "a/12_3\346\234\254\350\254\233\347\276\251\357\274\210CSV\345\275\242\345\274\217\357\274\211 |JDs4 - JD-Chokai.html" "b/12_3\346\234\254\350\254\233\347\276\251\357\274\210CSV\345\275\242\345\274\217\357\274\211 |JDs4 - JD-Chokai.html" new file mode 100644 index 0000000..be8280d --- /dev/null +++ "b/12_3\346\234\254\350\254\233\347\276\251\357\274\210CSV\345\275\242\345\274\217\357\274\211 |JDs4 - JD-Chokai.html" @@ -0,0 +1,153 @@ + + + + + +12/3本講義(CSV形式) +|JDs4 - JD-Chokai + + + + + + +
+ +
+

12/3本講義(CSV形式) +

+

グループ + JD鳥海塾2期生 での話題 + +

+ +

+
+ + + + +
2022-12-03 13:09:47 末尾へ
Rubyファイル2個とCSVファイル3個をダウンロードしてください
+

+

+ + + + + + + + + + +

#5492 +伊藤 理乃(いとうりの) +令和4年12月3日13:46:34 +

csv-use.rbプログラムとプログラムの中で使うcsvファイル

csv-use.csv(91B)[Direct] +csv-use.rb(430B)[Direct] +

#5493 +伊藤 理乃(いとうりの) +令和4年12月3日13:45:10 +

kankou.rbプログラムとプログラムの中で使うcsvファイル

kankou.rb(1675B)[Direct] +shonai.csv(2009B)[Direct] +web.csv(518B)[Direct] +

#5499 +榊原一心(SAKAKIBARA Isshin) +令和4年12月3日14:14:24 +
webVR→https://www.yatex.org/gitbucket/j2115/VR/pages/VR/Panorama.html +アンケート→https://docs.google.com/forms/d/1p_TQ9t0yruAIdRNmBY5vqkN3Lckw5dj6wUAYlJF_VQ4/edit +
+ +
+ + + +
+
+ + + +
添付ファイル(5MB以下): + + + +
+ + + +
+
+
+ + \ No newline at end of file diff --git "a/12_3\346\234\254\350\254\233\347\276\251\357\274\210CSV\345\275\242\345\274\217\357\274\211 |JDs4 - JD-Chokai_files/S_AC6D7BF3-8E24-453C-B0F5-1ED570925849.jpeg" "b/12_3\346\234\254\350\254\233\347\276\251\357\274\210CSV\345\275\242\345\274\217\357\274\211 |JDs4 - JD-Chokai_files/S_AC6D7BF3-8E24-453C-B0F5-1ED570925849.jpeg" new file mode 100644 index 0000000..18ccfb0 --- /dev/null +++ "b/12_3\346\234\254\350\254\233\347\276\251\357\274\210CSV\345\275\242\345\274\217\357\274\211 |JDs4 - JD-Chokai_files/S_AC6D7BF3-8E24-453C-B0F5-1ED570925849.jpeg" Binary files differ diff --git "a/12_3\346\234\254\350\254\233\347\276\251\357\274\210CSV\345\275\242\345\274\217\357\274\211 |JDs4 - JD-Chokai_files/S_M_houtin2.png" "b/12_3\346\234\254\350\254\233\347\276\251\357\274\210CSV\345\275\242\345\274\217\357\274\211 |JDs4 - JD-Chokai_files/S_M_houtin2.png" new file mode 100644 index 0000000..0d73a2b --- /dev/null +++ "b/12_3\346\234\254\350\254\233\347\276\251\357\274\210CSV\345\275\242\345\274\217\357\274\211 |JDs4 - JD-Chokai_files/S_M_houtin2.png" Binary files differ diff --git "a/12_3\346\234\254\350\254\233\347\276\251\357\274\210CSV\345\275\242\345\274\217\357\274\211 |JDs4 - JD-Chokai_files/default.css" "b/12_3\346\234\254\350\254\233\347\276\251\357\274\210CSV\345\275\242\345\274\217\357\274\211 |JDs4 - JD-Chokai_files/default.css" new file mode 100644 index 0000000..9c71018 --- /dev/null +++ "b/12_3\346\234\254\350\254\233\347\276\251\357\274\210CSV\345\275\242\345\274\217\357\274\211 |JDs4 - JD-Chokai_files/default.css" @@ -0,0 +1,447 @@ +/* + * Default CSS definitions + */ +body {background: #eff; margin: 2px; padding: 6px;} +h2, h3, hr {clear: both;} +*.warn {color: red;} +*.warnbg {background: red;} +*.hidden {visibility: hidden;} +*.border {border: 1px solid #113;} +div.topmenu { + margin: 0; padding: 0; width: 100%; height: 2em; +} +div.topmenu ul {width: 100%; position: fixed; z-index: 5; margin: 0; + margin: 0 auto;} +div.topmenu ul li { + float: left; width: 18%; + background: rgba(68,255,102,0.8); border: #3e5 2px groove; margin: 0; + text-align: center; font-size: 80%; list-style: none; + box-shadow: #242 2px 3px 5px; + text-shadow: #fff 0px 0px 10px; +} +div.topmenu ul li.worldname {background: #eeeeff;} +div.topmenu ul li:hover {background: #8fa;} +div.topmenu ul a {text-decoration: none;} + +ldiv.topmenu + h1 {clear: both; margin-top: 3em;} +pre.list { + overflow: auto; width: 96%; height: 40%; background: white; + border: 2px inset; +} +p.copyright { + border-top: 2px inset #555; text-align: right; clear: both; + font-size: 50%; +} +p.copyright a, a#reload {text-decoration: none;} + +td {padding-left: 0.5ex; padding-right: 0.5ex;} +table.td2r td:nth-child(2) {text-align: right;} +table.td3r td:nth-child(3) {text-align: right;} +table.td3rr td:nth-child(n+3) {text-align: right;} +table.td3evw th:nth-child(2n+4), span.textdigest { + background: white; +} +table.thl th {text-align: left;} +span#reverse {background: white; padding: 0 0 0 0.4ex; border: outset;} + +table.form, table.b, table.b tr, table.b td, table.b th { + border: 1px solid black; border-collapse: collapse; +} +table.b, table.bloghead { + border-radius: 1ex; box-shadow: rgb(250,222,222) 1px 2px 3px; +} +td.warn {background: #fcc;} +input[type="checkbox"][name="rm"]:checked ~ table {background: red;} +input[type="checkbox"][name="rm"] ~ span {display: none;} +input[type="checkbox"][name="rm"]:checked ~ span {display: inline;} + +input[type="radio"][value="replace"] + input.replace[type="file"] { + visibility: hidden;} +input[type="radio"][value="replace"]:checked + input.replace[type="file"] { + visibility: visible; +} +button#morefile {visibility: hidden; background: #fe9;} +label.admin span {border-bottom: 1px solid blue;} +label.admin:after {content: "(ADMIN)"; color: red; text-decoration: none;} + +/* keep/edit/rm action selector */ +input.action ~ input:not(.action), input.action ~ textarea { + display: none; +} +input.action[value="edit"]:checked ~ input[class="edit"], +input.action[value="mv"]:checked ~ input[type="text"] {display: inline;} +input.action[value="edit"]:checked ~ textarea {display: block;} +input.action[value="edit"]:checked ~ span, +input.action[value="mv"]:checked ~ span {display: none;} +input.action[value="rm"]:checked ~ span {background: red;} +label.confirm {display: none;} +*.inline, +input.action[value="rm"]:checked ~ label.confirm { + display: inline; +} + +input.hidesub ~ input[type="submit"] {visibility: hidden;} +input.hidesub:focus ~ input[type="submit"], +p:active input[type="submit"] +{visibility: visible;} +input[type=text]:focus {background: #ffa;} + +form.replyblog {xxx-margin-bottom: 40%;} +div.blogcomment { + position: fixed; bottom: 0; left: 0; + z-index: 2; background-color: rgba(250,222,222,0.6); +} +/* div.blogcomment textarea:focus {background: yellow; + position: fixed; top: 0; bottom: auto; } Need to consider narrow display */ +div.blogcomment * {opacity: 1.0;} +table.bloghead, .bloghead tr, .bloghead td { + border: 1px solid black; border-collapse: collapse; + min-width: 30em; +} +table.bloghead tr.preface { + font-size: 150%; background: yellow; /* text-align: center; */ + white-space: pre-wrap; +} +table.bloghead tr.frozen { + background: #ccf; border: blue thick solid; color: navy; +} + +table.bloghead {margin-bottom: 1em;} + +table.blog_replies, .blog_replies tr, .blog_replies td { + border: 1px solid #999; border-collapse: collapse; + white-space: pre-wrap; +} +table.bloghead tr.preface td ul, +table.bloghead tr.preface td ol, +table.bloghead tr.preface h2, +table.bloghead tr.preface h3, +table.bloghead tr.preface h4, +table.bloghead tr.preface h5, +table.bloghead tr.preface h5, +table.blog_replies video, +table.blog_replies iframe, +table.blog_replies ul, .blog_replies tr ul, .blog_replies td ul, +table.blog_replies ol, .blog_replies tr ol, .blog_replies td ol { + text-align: left; white-space: normal; margin: 1ex 0; +} +table.bloghead tr.preface h2, +table.bloghead tr.preface h3, +table.bloghead tr.preface h4, +table.bloghead tr.preface h5, +table.bloghead tr.preface h5 +{ + display: inline-block; +} +table.blog_replies p.proficon { + float: right; margin: 0 1ex 0 0; +} +table.blog_replies+p.update_link {margin-top: 0; margin-bottom: 14em;} +.blog_replies td.repl { + vertical-align: top; min-width: 30em; height: 3em; + max-width: 50em; +} +.blog_replies td.repl img {max-width: 30%;} +td.repl h2, td.repl h3, td.repl h4 { + display: inline; /* Because td.repl's white space is pre-wrap */ + /* text-shadow: blue 0px 1px; */ +} +td.repl hr {display: inline-block; width: 95%; color: #cde} +td.repl em {color: #a00; text-decoration: underline; padding-right: 0.3ex;} +td.repl strong {color: white; background: #00a; padding: 0 0.5ex;} +td.repl h2:before {content: "■"; color: #a22;} +td.repl h3:before {content: "◆"; color: #a22;} +td.repl h4:before {content: "○";} +td.repl div.atall { + color: white; background: #66f; padding: 0 0.8ex; + display: inline-block; border-radius: 0.8ex; +} +.blog_replies td.repatt {min-width: 12em;} +table.blog_replies iframe { + width: 80%; min-height: 300px; max-width: 50em; max-height: 80vw; + padding: 0; border: 0; +} +table.blog_replies td.new { /* New Article from last visit */ + background: white +} +table.mini, table.mini tr, table.mini th, table.mini td { + margin: 0; border-width: 0; + border-collapse: collapse; + vertical-align: top; width: auto; height: 1em; +} +table.mini th {background: #cee;} +table.mini tr {border-bottom: solid 1px #bcc;} +table.mini th, table.mini td {text-align: justify;} +table.mini td, table.mini th {padding: 1px 0.5ex; min-width: 1em;} +table.mini {margin-left: 1em; border-left: 2px solid #686;} +div.pjaxview, div.pjaxview2 { + position: fixed; top: 1ex; left: 0; width: 9vw; height: 9vh; + background: #ffffee; border: 1px double navy; border-radius: 2em; + z-index: 7; +} +div.pjaxview2 { + width: 100vw; height: 98vh; transition: 0.5s; +} +div.pjaxview iframe { + width: 98%; height: 90%; object-fit: scale-down; +} +div.pjaxview p { + padding: 0.5ex; text-align: left; margin: 0 2em; + white-space: nowrap; overflow: hidden; +} +div.pjaxview p button { font-size: large; padding: 0 1em;} +div.pjaxview p button { background: #eeeee0; } +div.pjaxview p button:focus { background: #fffff8; } + +/* "visibility: collapse" not working on chromium browser */ +div.noprofimg tr.profimg {visibility: collapse; display: none;} +div.noprofimg tr:hover + tr.profimg, div.noprofimg tr:active + tr.profimg, +div.noprofimg tr.profimg:hover, div.noprofimg tr.profimg:active { + visibility: visible; display: table-row;} + +/* Used for overlapping image */ +img.overlap {position: absolute; top: 40px; left: 50px; z-index: 2;} + +/* Used in user's home page */ +p.profimg {float: left; max-width: 50%; max-height: 400px; + overflow: hidden; margin: 0 1em 1ex; + padding: 0; border: white 1px solid; box-shadow: 2px 3px 4px + } +p.profimg img {max-width: 400px;} +div.home+* {clear: both;} +body.grouphome p.groupimg { + float: right; margin: 0 1em 1ex; + overflow: hidden;} +body.grouphome p.groupimg img { + max-width: 380px; max-height: 380px;} + +div.fold {margin-top: 1em; border-top: 1px solid black; padding-top: 1em;} +div.noborder {border: 0px; margin: 0;} +div.fold > div { + xxdisplay: none; max-height: 80%; overflow: auto; + height: 0px; opacity: 0; padding: 0 1ex; +} +div.fold input[type="checkbox"]:checked ~ div, +div.fold input[type="radio"]:checked ~ div { + display: block; background: #fadede; + height: auto; opacity: 1.0; transition: 1s; +} +input.fold + label + *.folded {opacity: 0; display: none; hight: 0;} +input[type="checkbox"].fold:checked + label + *.folded { + opacity: 1.0; transition: 2s; +} +input[type="checkbox"].fold:checked + label + div.folded { + display: block; hight: auto; transition: 2s; +} + +/* fold2!! */ +div.foldtabs { + position: relative; height: 5em; margin-top: 1em; + border-top: 1px solid black; padding-top: 1em; +} +div.foldtabs > div { + position: absolute; top: 2.5em; opacity: 0.0; background: pink; + margin: 2px; overflow: auto; +} +div.foldtabs input[type="radio"] {display: none;} +div.foldtabs input[type="radio"]:checked + label + div { + display: block; opacity: 1.0; transition: 0.2s; width: 100%; + margin: 0; z-index: 2; +} +div.foldtabs > label { + border: 1px outset #ddd; background: #ddd; xbackground: pink; + border-top-left-radius: 0.8em; border-top-right-radius: 0.8em; + margin: 0; + padding: 0.2ex 0.5em; height: 3em; +} +div.foldtabs > input:active + label {background: white;} +div.foldtabs input:checked + label { + background: pink; border: pink 1px solid; border-bottom-width: 6px; +} +div.foldtabs input:checked + label:last-of-type {border-width: 1px;} +input[type="checkbox"] + label + input[type="submit"] {display: none;} +input[type="checkbox"]:checked + label + input[type="submit"] { + display: inline;} +div.foldtabs p {margin: 0;} + +/* ToDo List CheckBox inspired by https://cultureacademia.jp/webcreate/303/ */ +input.s4-checkbox {display: none;} /* Do not show real checkbox */ +input.s4-checkbox + label { + position: relative; padding-left: 0.8em; margin-right: 1em; +} +input.s4-checkbox + label:before, +input.s4-checkbox + label:after { + content: ""; display: block; /* Mimic Checkbox by absolute box */ + position: absolute; top: 0; left: 0; margin: 0; +} +input.s4-checkbox + label:before { /* checkbox frame */ + width: 0.8em; height: 0.8em; border: 1px solid #aaa; border-radius: 20%; + background: #ddd; +} +input.s4-checkbox:checked + label:before { /* checked frame bg */ + background: pink; +} +input.s4-checkbox:checked + label { /* checked text */ + /* text-shadow: red 1px 1px; */ +} +input.s4-checkbox:checked + label:after { /* checked mark */ + width: 0.6em; height: 0.4em; top: 0.05em; left: 0.1em; + border-bottom: 3px solid navy; + border-left: 3px solid navy; + transform: rotate(-40deg); +} +/* ---------------------------------------------------- */ + +div.dumptable {max-height: 70vw; overflow: auto;} +div.dumptable tr:hover {background-color: #fee;} +table.dumpblogs td, +div.lcto td { /* LINK + CTIME + TITLE + OWNER + something... */ + white-space: nowrap; overflow: hidden;} +table.dumpblogs td:nth-child(4), +div.lcto td:nth-child(2) {max-width: 8em;} +table.dumpblogs td:nth-child(5), /* team */ +table.dumpblogs td:nth-child(6), /* title */ +table.dumpblogs td:nth-child(7), /* heading */ +div.lcto td:nth-child(3), /* title */ +div.lcto td:nth-child(4) /* owner */ + {max-width: 14em;} +/* https://curecode.jp/tech/css-table-position-sticky-with-background-border-vanished/ */ +div.dumptable table.dumpblogs th { + position: sticky; top: 0; z-index: 0; background: #fcf0f0; + border: 1px solid black; border-collapse: collapse; + background-clip: padding-box; +} + +table.dumpblogs tr.凍結 td:nth-child(n+2) {opacity: 0.5;} +table.dumpblogs tr.凍結 td:last-child {opacity: 1.0; color: blue;} +*.frozen, *.凍結 {color: blue;} + +/* +table.dumpblogs td:nth-child(4) { + max-width: 7.6em; overflow: hidden;} +table.dumpblogs td:nth-child(5), +table.dumpblogs td:nth-child(6) { + max-width: 12em; overflow: hidden;} +table.dumpblogs td:nth-child(7) { + min-width: 5em; overflow: hidden;} +*/ + +/********************* icon list *********************/ +div.iconlist { + text-align: center; float: left; margin: 1ex 1em; + border: dotted #dfd 2px; padding: 1ex; +} +div.iconlist p {margin: 0; padding: 0;} +div.iconlist p.tag {background: #ffa; border-radius: 4em;} +div.iconlist p._temp {background: cyan;} +div.iconlist p._lecture {background: pink;} +div.iconlist p._admin {background: yellow;} +div.iconlist p._friend {background: fuchsia;} +div.iconlist p._fellows {background: #9f9;} /* light green */ +div.iconlist p._club {background: #4bb;} /* light teal */ +div.iconlist p._event {background: maroon; color: white;} +div.iconlist p._misc {background: purple; color: white;} +div.iconlist p._record {background: red; color: white;} +div.iconlist p._info {background: #eff;} /* light cyan */ +div.iconlist p._support {background: #ffe;} /* light yellow */ +div.iconlist p._test {background: #ffb6c1;} /* light pink */ +input#ismembtn:checked ~ div.iconlist, +input#isadmbtn:checked ~ div.iconlist {display: none;} +input#ismembtn:checked ~ div.iconlist.Member, +input#isadmbtn:checked ~ div.iconlist.ADMIN, +input#ismembtn:checked ~ div.iconlist.ADMIN {display: block;} +div.xy120x120 {min-width: 120px; min-height: 140px;} +div.xy96x96 {min-width: 96px; min-height: 116px;} +div.xy96x96 img {max-width: 96px;} +div.xy50x50 {min-width: 50px; min-height: 70px;} +div.xy50x50 img {max-width: 50px;} +div.moderated {background: rgba(255, 215, 0, 0.3);} /* gold */ +body.moderated {background: #fffec4;} /* #faed8a */ +body.ismember, div.ismember {border-top: 4px red solid; margin-top: 0;} +div.right, div.search {clear: both; float: right;} +*.clear {clear: both;} +div.search input[type="text"] { + border: solid 1px #bbb; border-radius: 0.5ex; min-height: 20px; + margin: 1em; padding: 0 0.5ex; padding-left: 18px; + background: url("../../img/loupe.png") left center no-repeat + rgba(242,240,240,0.7); + position: relative; +} +div.search div.fr, *.relative {position: relative;} +div.search p.help, textarea + p.help {display: none;} +div.search input:focus + p.help, +textarea:focus + p.help { + display: block; background: white; + position: absolute; right: 15em; white-space: pre; + border: 1px solid #888; border-radius: 1em; padding: 1ex; + box-shadow: #555 2px 2px; +} +textarea:focus + p.help { + position: fixed; + top: 0em; left: 0; +} +form.summary input[type=submit], +input[type="submit"].all, button.all { + background: #cfc; padding: 0.4ex 2ex; +} +input[type="reset"] {margin-left: 4em;} + +/* + * World List + */ +li.casmenu div {display: none; position: relative; width: 200%; + min-width: 80%; margin-right: 0;} +li.casmenu div table { + background: white; position: absolute; top: 0em; border: 3px solid navy; + max-width: 100%; +} +li.casmenu div table td {text-align: left; padding: 0.5ex 1em;} +li.casmenu:hover div, li.casmenu:active div, +li.casmenu div:hover, li.casmenu div:active +{display: block;} +span.pre {white-space: pre;} + +/* + * Frozen toggle button + */ +td.稼動状態 {text-align: center;} +button.toggle-frozen { + padding: 0 1emex; + background: #fdb585; + border-radius: 1ex; + border-bottom: solid 2px #d27d88; + box-shadow: inset 0 2px 0 rgba(255,255,255,0.2), 0 2px 2px rgba(0,0,0, 0.19); + background: linear-gradient(#fdeaea, #fdb2b2); // ffc8a8 +} +.凍結 button.toggle-frozen, .凍結 button.toggle-frozen::before { + background: linear-gradient(#d8e2ea, #83bbea); +} +.凍結 button.toggle-frozen::before { + content: attr(frozen-marker); color: blue; +} +.toggle-frozen::before { + content: attr(running-marker); +} +.info-tooltip { + position: absolute; padding: 1ex; + background: ivory; + border-radius: 1em; border: double 5px blue; + min-width: 10em; right: 0; bottom: 0; +} +.dissolving {opacity: 0; transition: 3.0s;} +.emerging {opacity: 1; transition: 3s;} +button#c, button#reload {display: inline-block;} +span.loading, button#c:disabled, button#reload:disabled { + visibility: visible; transform: rotateX(3600deg); transition: 30s; +} +span.loading {padding: 0 1em;} +input.aux {margin-left: 10em; transform: scale(0.7);} + +/* + * PR Web + */ +body.pr {font-size: 200%;} +body.pr h1 { + text-align: center; width: 80%; padding: 3ex 0; margin: 0 auto; + background: #ffefef; border: double 5px navy; +} diff --git "a/12_3\346\234\254\350\254\233\347\276\251\357\274\210CSV\345\275\242\345\274\217\357\274\211 |JDs4 - JD-Chokai_files/file-icon.png" "b/12_3\346\234\254\350\254\233\347\276\251\357\274\210CSV\345\275\242\345\274\217\357\274\211 |JDs4 - JD-Chokai_files/file-icon.png" new file mode 100644 index 0000000..d82f259 --- /dev/null +++ "b/12_3\346\234\254\350\254\233\347\276\251\357\274\210CSV\345\275\242\345\274\217\357\274\211 |JDs4 - JD-Chokai_files/file-icon.png" Binary files differ diff --git "a/12_3\346\234\254\350\254\233\347\276\251\357\274\210CSV\345\275\242\345\274\217\357\274\211 |JDs4 - JD-Chokai_files/jds4.css" "b/12_3\346\234\254\350\254\233\347\276\251\357\274\210CSV\345\275\242\345\274\217\357\274\211 |JDs4 - JD-Chokai_files/jds4.css" new file mode 100644 index 0000000..acec5ff --- /dev/null +++ "b/12_3\346\234\254\350\254\233\347\276\251\357\274\210CSV\345\275\242\345\274\217\357\274\211 |JDs4 - JD-Chokai_files/jds4.css" @@ -0,0 +1,10 @@ +/* + * Default CSS definitions + */ +@import("default.css"); +body {background: #ccc3f3 url("img/jds4_bg_2022.png") no-repeat center fixed; + background-size: cover; margin: 2px; padding: 6px;} +div.topmenu ul li { + background: #afeeeecc; border: #35e 2px groove; margin: 0; +} +div.topmenu ul li:hover {background: #adf;} diff --git "a/12_3\346\234\254\350\254\233\347\276\251\357\274\210CSV\345\275\242\345\274\217\357\274\211 |JDs4 - JD-Chokai_files/s4-main.js" "b/12_3\346\234\254\350\254\233\347\276\251\357\274\210CSV\345\275\242\345\274\217\357\274\211 |JDs4 - JD-Chokai_files/s4-main.js" new file mode 100644 index 0000000..3554794 --- /dev/null +++ "b/12_3\346\234\254\350\254\233\347\276\251\357\274\210CSV\345\275\242\345\274\217\357\274\211 |JDs4 - JD-Chokai_files/s4-main.js" @@ -0,0 +1,1191 @@ +// 愛 +(function (){ + var isOlderJS; // Set in init(); + var hoverTextLines = 10; + var hasTouchPad = + (navigator.maxTouchPoints && navigator.maxTouchPoints >0); + var myurl = document.URL, + mypath = myurl.substring(myurl.lastIndexOf("/")); + var art_m_list = []; + var mathjax = false; + let input_pdfsw = 'input[name="comppdf"]'; + if (mypath.match(/(.*)\/(.*)/)) { + mypath = RegExp.$2; + mypath = mypath.substring(0, mypath.lastIndexOf("?")); + //alert("mypath="+mypath); + } + function escapeChars(old) { + return old.replaceAll('"', '"') + .replaceAll("<", '<') + .replaceAll(">", '>'); + } + function collectElementsByAttr(elm, attr, val) { + var e = document.getElementsByTagName(elm); + if (!e) return null; + var list = []; + for (var i of e) { + if (i.getAttribute(attr) == val) + list.push(i) + } + return list; + } + function nthChildOf(parent, n, elem) { // Return Nth child of type ELEM + // N begins with 1 + var i=0; + var le = elem.toLowerCase(); + for (var c of parent.childNodes) { + if (!c.tagName) continue; + if (c.tagName.toLowerCase() == le) { + if (++i >= n) return c; + } + } + return null; + } + function insertRedirect(e) { + var articleId, textarea = document.getElementById("text"); + var p = e.target, checked = p.checked; + while (p = p.parentNode) + if (p.nodeName.match(/^td$/i)) break; + if (!p) return; + while (p = p.nextSibling) + if (p.nodeName.match(/^td$/i)) break; + if (!p) return; + articleId = p.getAttribute("id"); + if (textarea && articleId) { + var tv = textarea.value, lines; + if (tv) + lines = tv.split("\n"); + else + lines = [""]; + var re = new RegExp("[, ]*#"+articleId+"(?![0-9])"); + checked = (p.nodeName.match(/^input$/) + ? p.checked // checkbox obeys its status + : !lines[0].match(re)) // a-elment toggles redirection + if (checked) { + if (!lines[0].match(re)) { + var re2 = new RegExp(/>#[#0-9, ]+[0-9]/); + if (lines[0].match(re2)) + lines[0] = lines[0].replace( + re2, '$&, '+'#'+articleId); + else { + if (lines[0] > "") lines[0] = " "+lines[0]; + lines[0] = ">#"+articleId+lines[0]; + } + } + } else { // Remove #xxxxx + if (lines[0].match(/^>#[0-9 ,]+#/)) // 2 or more #id's + lines[0] = lines[0].replace( + new RegExp("^>#"+articleId+"[ ,]*"), ">").replace( + new RegExp("[ ,]*#"+articleId), ""); + else { + lines[0] = lines[0].replace( + new RegExp(">#"+articleId+"[ ,]*"), ""); + } + } + lines[0] = lines[0].replace(/^> *$/, ''); + textarea.value = lines.join("\n"); + } + } + function registPjaxViewers(aHrefList) { + let apos=art_m_list.length; + for (let a of aHrefList) { + let href = a.getAttribute("href"); + let localvar = apos; + let td = a.parentNode, + tr = td.parentNode, + id = td.id, + text = td.textContent, + author = tr.getElementsByTagName("a"); + if (author) author = author[0].getAttribute("title"); + if (href.match(/\?showattc\+article_m\+([0-9]+)$/)) { + if (td.innerHTML.match(/読み取り不可/)) { + a.removeAttribute("href"); + continue; + } + let url = RegExp.lastMatch; + // console.log("pjaxView(e, "+href+", "+apos+")"); + a.addEventListener("click", function(e) { + // Shoud use closure local variable: localvar + pjaxView(e, href, localvar); + }, false); + apos++; + art_m_list.push({ + url: href, id: id, author: author, text: text + }); + } + } + } + function registInsertDirect(aHrefList) { + for (i of aHrefList) + if (i.getAttribute("href").match(/^#[0-9]+$/)) + if (RegExp.lastMatch == i.innerHTML) + i.addEventListener("click", insertRedirect, false) + } + function mathjaxUpdate(arg) { + try { + if (MathJax && MathJax.typesetPromise) { + MathJax.texReset(); // Reset Math counters + MathJax.typesetPromise(arg); // MathJax v3 + } + } catch (err) {console.log(err);} + } + var ajaxSubmit; + function replAddNews(newtable) { + let newids = [], idlist=[]; + let getArticleID = function (td) { + return parseInt(td.parentNode.getElementsByTagName("td")[1].id); + } + for (let i of newtable.querySelectorAll("td.repl")) + newids.push(i); + newids = newids.sort((a,b)=> { + return (getArticleID(a) - getArticleID(b)); + }); + for (i of newids) + idlist.push(getArticleID(i)); + console.log("IDList="+idlist.join()); + let cnt=0, ntr; + let current = collectElementsByAttr("td", "class", "repl"), + ncur=0, n, icur=0, o, oid, nid, otr; + current = document.querySelectorAll('td[class="repl"]'); + let last=current[current.length-1], + tbody = last.parentNode.parentNode; + let addEventsToNewTr = function(tr) { + let td = tr.getElementsByTagName("td"), + td0 = td[0], td1 = td[1]; + td0.classList.add("new"); + registInsertDirect(td0.querySelectorAll("a[href]")); + registPjaxViewers(td1.querySelectorAll("a[href]")); + } + // Erase all "new article" flags before merging + for (let i of document.querySelectorAll("td.new")) + i.classList.remove("new"); + // Now reconstruct articles with merge-sort like method + outer: for (; ncur= nid) { + addEventsToNewTr(ntr); + tbody.insertBefore(ntr, otr); + if (oid==nid) otr.remove(); + cnt++; + continue outer; + } + } + // Append absolutely new articles. + ntr = n.parentNode; + addEventsToNewTr(ntr) + tbody.appendChild(atMarkView(ntr)); + ntr.classList.add("dissolving"); + let localntr = ntr; + setTimeout(() => { + localntr.classList.remove("dissolving"); + localntr.classList.add("emerging"); + }, 100); + rewriteReplyHover(ntr); + cnt++; + } + mathjaxUpdate(newids); + console.log("Update "+cnt+"rows"); + if (cnt>0 && ntr.scrollIntoView) { + let option = {behavior: "smooth"}; + if (!isOlderJS) option.block = "center"; + try { // Scroll to last updated row + ntr.scrollIntoView(option); + } catch (e1) {} + } + return cnt; + } + + function warnFileSize(form) { + let szmax = form.querySelector('input[name="filesize_max"]').value; + if (!szmax || szmax=="") return; + szmax = parseInt(szmax); + if (szmax <= 0) return; + // szmax = 10000 + let ng = "", rcval=false, fileexists=false, + pdfsw = form.querySelector(input_pdfsw), + pdfmsg = "Try compressing PDF?\nPDFを圧縮してみますか?\n" + + "(それでも収まらない場合もあります)"; + for (let f of form.querySelectorAll('input[type="file"]')) { + let thiserr = false; + for (let i of f.files) { + fileexists = true; + let fn = i.name, sz = i.size; + console.log("max="+szmax+", fn="+fn+", sz="+sz); + if (sz > szmax) { + if (fn.match(/\.pdf/i) + && sz < szmax*3 // XXX : x3 reasonable? + && (pdfsw || confirm(pdfmsg))) { + if (!pdfsw) { + pdfsw = document.createElement("input"); + pdfsw.name = "comppdf"; + pdfsw.type = "hidden"; + f.parentNode.insertBefore(pdfsw, f); + pdfsw.value = "yes"; + } + } else { + thiserr = true; + ng += ((ng>"" ? ", " : "")+fn) + } + } + } + thiserr ? f.classList.add("warnbg") : f.classList.remove("warnbg"); + } + if (ng>"") { + rcval = "File-size Limit Error: "+ng+"\n"+ + "Should be less than "+szmax+"bytes.\n"+ + szmax+"バイト未満にしてください" + alert(rcval); + } + if (form.text.value == "") { + let w; + if (fileexists) + w = "Fill the text area\n" + + "添付したファイルに関する説明を入れてください。"; + else + w = "Enter your comment!\n何か書き込んでね!"; + alert(w); + rcval = (rcval || w); + form.text.classList.add("warnbg"); + setTimeout(() => {form.text.classList.remove("warnbg");}, 2000) + } + return rcval; + } + function ajaxPost(e) { + e.preventDefault(); + let rowid; + if (!myurl.match(/replyblog\+([0-9]+)/)) return; + rowid = RegExp.$1 + let myform = document.querySelector("form.replyblog"); + let data = new FormData(myform), + fetchtime = data.get("fetchtime"); + if (!fetchtime || fetchtime=="") return; + ///*XX*/fetchtime = "2020-06-14T00:00:00";data.set("fetchtime", fetchtime) + + ajaxSubmit = e.target; + ajaxSubmit.back = ajaxSubmit.textContent; + if (ajaxSubmit.id == "reload") { + ajaxSubmit.textContent = "更新中" + data.set("text", "") + } else { + if (warnFileSize(myform)) return; + ajaxSubmit.textContent = "送信中"; + } + ajaxSubmit.blur(); + ajaxSubmit.disabled = true; + let act = mypath+"?blog_fetch+"+rowid+"+f:"+fetchtime; + + function respUpdate(tbody) { + ajaxSubmit.textContent = ajaxSubmit.back; + ajaxSubmit.disabled = false; + let div = document.createElement("div"), form, newform; + try { + div.innerHTML = tbody; + form = div.querySelector("form"); + } catch (er) { + alert("Cannot parse fetch data"); + return; + } + let update = replAddNews(form); + let dispelem = myform.querySelector("textarea").parentNode; + if (div.querySelector('input[name="user"]')) { // is login form + dispInfoMomentary("Login Again Please", dispelem) + return; + } + newform = new FormData(form); + if (data.get("text") > "") { // Called by submit button + myform.reset(); + let pdfsw = myform.querySelector(input_pdfsw); + if (pdfsw) pdfsw.remove(); + // myform.text.value = ''; + } + myform.fetchtime.value = newform.get("fetchtime"); + myform.id.value = newform.get("id"); + if (update && update > 0) { + let s = update + " new article" + + (update>1 ? "s" : "") + " posted"; + dispInfoMomentary(s, dispelem); + } + } + fetch(act, { + method: "POST", body: data, + credentials: "include" // For older firefox + }).then((resp) => { + return resp.text(); + }).then((tbody) => { + respUpdate(tbody); + }) + } + function pjaxView(ev, url, mynum) { + if (ev.ctrlKey||ev.shiftKey) return; + ev.preventDefault(); + let box = document.createElement("div") + box.setAttribute("class", "pjaxview"); + let p1 = document.createElement("p"), + bt = document.createElement("button"), + sl = document.createElement("button"), + sr = document.createElement("button"), + loading = document.createElement("span"), + info = document.createElement("p"); + info1 = document.createElement("span"); + info2 = document.createElement("span"); + iframe = document.createElement("iframe"); + var curpos = mynum; + var historyBase = history.length; + + function _setPjaxCurposInfo() { + let len = art_m_list.length; + let cur = art_m_list[curpos] + info1.textContent = (1+curpos)+" of "+len+" article #"+cur.id+ + (cur.author ? " by "+cur.author : "") + ":"; + info2.textContent = cur.text.trim(); + info2.setAttribute("class", "border textdigest"); + } + function _resetPjax() { + // All we can do surely is to back 1 page, + // because we cannot move to desirable entry of history list. + history.back(); + } + function setSwipeAct(iframe) { + // We cannot use DOMContentLoaded nor iframe.contentWindow here. + // PDF.js does not construct contentWindow...? + iframe.addEventListener("load", () => { + loading.classList.remove("loading"); + if (!hasTouchPad) return; + let ifm = iframe.contentDocument; + let startX, moveX, thresh = 100; + ifm.addEventListener("touchstart", (e) => { + e.preventDefault(); + startX = e.touches[0].pageX; + }, false); + ifm.addEventListener("touchmove", (e) => { + e.preventDefault(); + moveX = e.touches[0].pageX; + }, false); + ifm.addEventListener("touchend", (e) => { + if (startX < moveX && startX + thresh < moveX) { + switchTo(e, -1); + } else if (startX > moveX && startX - thresh > moveX) { + switchTo(e, +1); + } + }, false); + }, false); + + } + function switchTo(e, direction) { + e.preventDefault(); + let len = art_m_list.length, cur, newpos, url; + newpos = (curpos+len+direction)%len; + if (curpos == newpos) return; // No need to switch to same one + curpos = newpos; + cur = art_m_list[curpos]; + url = cur.url; + // We should remove iframe once to preserve history Object + // https://inthetechpit.com/2019/04/20/update-iframe-without-affecting-browser-history/ + let parent = iframe.parentNode; + // alert("D = "+direction); + iframe.remove(); + parent.appendChild(iframe); + try { + loading.classList.add("loading"); + iframe.src = url; + // iframe.contentDocument.location.replace(url); + // location.replace cannot be used because PDF viewer.js + // does not have iframe.contentDocument + } catch (err) { + alert("Cannot load "+src+" : "+err.name); + } + _setPjaxCurposInfo(); + setSwipeAct(iframe); + } + function switchToByKey(e) { + // alert("KEY="+e.key); + switch (e.key) { + case "ArrowLeft": + switchTo(e, -1); break; + case "ArrowRight": + switchTo(e, +1); break; + case "Escape": + history.back(); + } + } + //

+ // + //

info1 info2

+ // + //
+ // ==> [ << ][Dissmiss][ >> ] + // ==> ## of ## article #xxx by AUTHOR + sl.textContent = " << "; + sr.textContent = " >> "; + sl.addEventListener("click", (e) => {switchTo(e, -1);}); + sr.addEventListener("click", (e) => {switchTo(e, +1);}); + sl.setAttribute("title", "to="+(mynum-1)); + sr.setAttribute("title", "to="+(mynum+1)); + document.body.appendChild(box); + bt.textContent = "Click to dismiss / もどる"+mynum; + + box.appendChild(p1); + p1.appendChild(sl); p1.appendChild(bt); p1.appendChild(sr); + { // TEST: Normal mode + let only = document.createElement("button"), + h = location.href; + only.textContent = ".oO□"; + only.setAttribute("title", "Open in Normal Window"); + only.addEventListener("click", function() { + location.replace(iframe.src); + }); + p1.appendChild(only); + } + p1.appendChild(loading); + info.appendChild(info1); info.appendChild(info2); + loading.textContent=" Loading..."; + loading.classList.add("hidden"); + loading.classList.add("loading"); + box.appendChild(info); + iframe.src = url; + + box.addEventListener("keydown", switchToByKey); + //box.addEventListener("click", (e) => {_resetPjax();}); + bt.addEventListener("click", (e) => {_resetPjax();}); + // dp.addEventListener("click", (e) => {_resetPjax();}); + info.addEventListener("click", (e) => {_resetPjax();}); + box.appendChild(iframe); + + setSwipeAct(iframe); + + _setPjaxCurposInfo(); + bt.focus(); + setTimeout(() => {box.classList.add("pjaxview2");}, 10); + // Finally update history stack + pjaxHistoryPush(box); + } + function pjaxHistoryPush(box) { + if (history.pushState) { + let h = location.href.replace(/#.*/, '')+"#pjaxview"; + history.pushState({url: h}, null, h); + window.addEventListener("popstate", (e) => { + if (box) { + box.remove(); box = null; + } + }, false); + } + } + function reverseChecks() { + var names = collectElementsByAttr("input", "name", "usel"); + for (let u of names) { + u.checked = !u.checked; + } + } + function renumberOL(str, start) { + var stra = str.split("\n"); + for (var i=1; i1 && area.value.charCodeAt(pos)==10) + b = area.value.lastIndexOf("\n", pos-1);; + return b>=0 ? b : 0; + } + function isInBeginEnd(area, pos){ + pos = pos||area.selectionStart; + let bol = beginningOfLine(area, pos); + let thisline = area.value.substr(bol); + console.log("curchar="+area.value.charCodeAt(pos)); + console.log("prechar="+area.value.charCodeAt(pos-1)); + console.log("bol="+bol+", thisline="+thisline); + let match = thisline.search(/\\(begin|end){([A-Za-z]*)/), lm, be; + if (match >= 0) { + lm = RegExp.lastMatch; + be = RegExp.$1; + return RegExp.$2 + } + return null; + } + function helpMarkdownBrace(e) { + if (!mathjax) return; + var area = e.target, pos = area.selectionStart, text = area.value, + begin = "\\begin", end = "\\end"; + if (pos < end.length) return; + if (text.substr(pos-end.length).startsWith(end)) { + let beg = text.lastIndexOf(begin, pos); + if (beg >= 0) { + let env = text.substr(beg).search(/\\begin{(.*?)}/); + if (env >= 0) { + textInsert(area, "{"+RegExp.$1+"}", pos); + e.preventDefault(); + } + } + } + } + function helpMarkdownBraceClose(e) { + if (!mathjax) return; + let area = e.target, pos = area.selectionStart, text = area.value, + begin = "\\begin", end = "\\end"; + if (text.substr(pos).startsWith("}")) { + area.setRangeText("", pos, pos+1); + // e.preventDefault(); + } + let inbegend = isInBeginEnd(area, pos); + if (!inbegend) return; + let nextendpos = text.substr(pos).indexOf("\\end{"); + let nextcurend = text.substr(pos).indexOf("\\end{"+inbegend+"}"); + if (nextcurend<0 || nextendpos!=nextcurend) { + area.setRangeText("}\n\n\\end{"+inbegend+"}", pos, pos); + area.selectionStart = pos+2; + e.preventDefault(); + } + console.log(inbegend); + + } + function helpMarkdownPreview(area) { + if (!mathjax) { + alert("no"+e.target) + dispInfoMomentary("This board has no MathJax mode.\n"+ + "この掲示板は数式モードOFFです。", + e.target.parentNode); + return; + } + let text = area.value; + let preview = document.createElement("div"); + let bp = document.createElement("p"); + let btn = document.createElement("button"); + btn.innerText = "Click or ESC to Dissmiss / クリックかESCで戻る"; + bp.classList.add("c"); + preview.classList.add("pjaxview"); + preview.classList.add("pjaxview2"); + let pre = document.createElement("p"); + bp.appendChild(btn); + preview.appendChild(bp); + preview.appendChild(pre); + pre.innerText = text; + document.body.appendChild(preview); + function dismiss(t) { + history.back(); + preview.remove(); + area.focus(); + } + preview.addEventListener("click", dismiss, false); + preview.addEventListener("keydown", dismiss, false); + MathJax.typesetPromise([pre]); + pjaxHistoryPush(preview); + btn.focus(); + } + function helpMarkdownAt(e) { + var area = e.target, pos = area.selectionStart; + if (pos == 0) { + area.value = "@all" + area.value; + area.selectionStart = area.selectionEnd = 4; + dispInfoMomentary("@all で全員に通知します", area.parentNode); + e.preventDefault(); + } + } + function helpMarkdown(e) { + switch (e.key) { + case "Backspace": helpMarkdownBS(e); break; + case "Enter": helpMarkdownEnter(e); break; + case "(": helpMarkdownParen(e); break; + case "p": if (e.metaKey) helpMarkdownPreview(e.target); break; + case "{": helpMarkdownBrace(e); break; + case "}": helpMarkdownBraceClose(e); break; + case "@": helpMarkdownAt(e); break; + } + } + /* Init event listeners */ + function addFileInput() { + var inpfile = collectElementsByAttr("input", "name", "image"); + if (!inpfile) return; + var filled = true; + var i, ih; + for (i of inpfile) { + if (! i.value) filled=false; + } + if (filled) { + ih = i.parentNode.innerHTML; + if (ih) { + var inpf = ih.substring(ih.indexOf("")+1); + i.insertAdjacentHTML("afterend", newi) + i.nextSibling.nextSibling.addEventListener('change', () => { + // next==br next.next==input[type=file] + warnFileSize(document.forms[0]); + }); + } + } + } + function initFileInput() { // Multiplies "input type=file" + var el, morefile = document.getElementById("morefile"); + if (morefile) { + for (el of collectElementsByAttr("input", "name", "image")) { + el.addEventListener("change", function(ev) { + if (ev.target.value > "" && ev.target.files.length == 1) + morefile.style.visibility = "visible"; + // No need to hide again, sure? + }); + } + morefile.addEventListener("click", addFileInput, null); + } + // When renaming, select basename part + for (el of collectElementsByAttr("input", "class", "mv")) { + el.addEventListener("focus", function(ev) { + var i = ev.target; + if (i) { + i.setSelectionRange(0, i.value.lastIndexOf(".")); + } + }); + } + } + function initTextarea() { + var te = collectElementsByAttr("textarea", "name", "text"); + if (!te || !te[0]) return; + te[0].addEventListener("keydown", helpMarkdown, false); + } + function atMarkView(elem) { + // Enclose "@all" with span + for (i of elem.querySelectorAll("td.repl")) { + let ii = i.innerHTML; + if (ii.startsWith("@all")) { + ii = ii.replace(/^@all/,'
@all
'); + i.innerHTML = ii; + } + } + return elem; + } + var quizwarnVisible = false; + function toggleAuthorVisibility(e) { + // In QUIZ mode, click to quizwarn line toggles visibility of author + e.stopPropagation(); + if (quizwarnVisible) { + for (let i of document.querySelectorAll("td.repatt")) { + i.classList.remove("hideauthor"); + } + quizwarnVisible = false; + } else { + for (let i of document.querySelectorAll("td.repatt")) { + i.classList.add("hideauthor"); + } + quizwarnVisible = true; + } + } + function downloadFile(filename, content, BOM) { + let bom = new Uint8Array([0xEF, 0xBB, 0xBF]); + let str = new Blob(BOM ? [bom, content] : [content], + {type: "text/csv"}); + var uri = URL.createObjectURL(str); + let a = document.createElement("a"); + a.download = (BOM ? "BOM-" : "")+filename; + a.href = uri; + document.body.appendChild(a); + a.click(); + document.body.removeChild(a); + } + function getTextContentCSV_1(e) { + let blogtbl = document.querySelector("table.blog_replies"); + let needBOM = e.ctrlKey; + if (!blogtbl) return; + let trw = blogtbl.querySelector("tr.warn"), a; + if (trw && (a=trw.querySelector("th>a"))) { + if (a.title == "Show All") { + if (window.confirm(`50件以下に表示制限されています。 +取得し直しますか? +Cancelを押すとこのまま取得します。 +Seen articles limited to 50 items. +Push OK to get all articles, Cancel to get only seen articles.`)) { + a.click(); + return; + } + } + } + if (navigator.userAgent.match(/Windows/)) { + if (!e.ctrlKey && !e.shiftKey && !window.confirm(`Excelで読ませるCSVの場合はBOMが必要です。 +その場合は一度キャンセルして Ctrl キーを押しながらボタンクリックして下さい。 +逆にExcel以外(GoogleスプレッドシートやLibreOfficeや他のツール)で読む場合はBOMをつけるとファイルの1行目の先頭にゴミのようなものが見える場合あるのでそのときは除去する必要があります。 +今後もBOM不要の場合はShiftキーを押しながらクリックして下さい。 +If you feed this CSV into Microsoft Excel, consider adding BOM sequence that can be prepended by pressing Control key with click. +In this case, click CSVget with ctrl key after Cancel this dialog. +If you never need BOM, press Shift key with click.`)) + return; + } + outcsv = [] + for (let row of blogtbl.querySelectorAll("tr[id]")) { + let tds = row.querySelectorAll("td"), + a = tds[0].querySelector("a.author"), + author = a.title, + name = a.innerText, + time = tds[0].querySelector("span").title, + id = tds[1].id, + body = tds[1].textContent; + //console.log(`${author},${name},${time},#${id},${body}`); + outcsv.push({ + "author": author, "name": name, "time": time, + "id": "#"+id, "body": body}); + } + let line = new CSV(outcsv, {header:true}).encode(), + fn = myurl.replace(/.*\?/, "").replaceAll("+", "-") + .replace(/#.*/, "").replace("-n:all", ""); + downloadFile(fn+".csv", line, needBOM); + } + function getTextContentCSV(e) { + if (!document.getElementById("csvminjs")) { + let csvmin = document.createElement("script"); + csvmin.src="https://www.yatex.org/libcache/csv.min.js"; + csvmin.id = "csvminjs"; + // https://stackoverflow.com/questions/14521108/dynamically-load-js-inside-js + csvmin.addEventListener("load", ()=>{ + getTextContentCSV_1(e)}, 10); + document.querySelector("head").appendChild(csvmin); + } else { + getTextContentCSV_1(e); + } + } + function initBlogs() { + // Auto-complete #xxxx + let i, check = collectElementsByAttr("input", "name", "notifyto"); + if (check) + for (i of check) { + i.addEventListener("click", insertRedirect, false); + } + registInsertDirect(document.querySelectorAll("a[href]")); + if (myurl.match(/replyblog\+[0-9]/) + && document.querySelector("td.repl")) { + // There's no need to provide ajax posting when + // no replies written to the blog. Therefore we + // assign ajax post when td.repl exists. + for (i of document.querySelectorAll('input#c[value="送信"]')) { + let b = document.createElement("button"); + b.textContent = "送信!"; + console.log("b="+b+", tc="+b.textContent); + b.addEventListener("click", ajaxPost, false); + // i.insertAdjacentElement('afterend', b); + b.setAttribute("class", i.getAttribute("class")) + b.setAttribute("title", i.getAttribute("title")) + i.parentNode.replaceChild(b, i); + b.id = i.id; + // i.remove(); + i.classList.add("aux"); + i.value = "送信(予備)" + b.parentNode.appendChild(i); + } + i = document.getElementById("reload"); + if (i) i.addEventListener("click", ajaxPost, false); + // Add CSV download button + let td = document.querySelector("table.bloghead tr td"); + if (td) { + let btn = document.createElement("button"); + btn.innerText = "CSVget"; + btn.type = "button"; + btn.title = `見えている書き込みをCSVで取得します +全件表示されていることを確認してから利用して下さい。 +Excelで利用する場合は Ctrl を押しながらクリックして下さい。 +Get seen TEXT content as CSV.`; + btn.addEventListener("click", getTextContentCSV, false); + let artlink = td.querySelector('a[accesskey="f"]'); + let spacer = document.createElement("span"); + if (artlink) { + spacer.innerText = "|"; + artlink.insertAdjacentElement('beforebegin', btn); + artlink.insertAdjacentElement('beforebegin', spacer); + } else { + spacer.innerText = " "; + td.appendChild(spacer); + td.appendChild(btn); + } + } + } + for (i of document.querySelectorAll('input[type="file"]')) { + i.addEventListener('change', (e) => { + warnFileSize(document.forms[0]); + }, false) + } + if (i=document.getElementById("quizwarn")) { + i.addEventListener('click', toggleAuthorVisibility, false); + } + // Hack article_m links + registPjaxViewers(document.querySelectorAll("a[href]")); + atMarkView(document); + } + function initGrpAction() { + var rev = document.getElementById("reverse"); + if (!rev) return; // Is not grpAction page + if (rev.tagName.match(/span/i)) { + rev.textContent = " 反転 "; + rev.addEventListener("click", reverseChecks, null); + } + var emailbtn = document.getElementById("email"); + emailbtn.addEventListener("click", function(ev){ + // Enlarge box and Select user's checkbox + if (!ev.target.checked) return; + var x = collectElementsByAttr("div", "class", "foldtabs"); + if (x && x[0] && x[0].style) { + x[0].style.height = "10em"; + } + let myuid = document.getElementById("myuid"); + if (myuid) { + let usel = collectElementsByAttr("input", "name", "usel"); + if (usel) { + for (u of usel) { + if (u.value == myuid.value) + u.checked = true; + } + } + } + }, null); + var teamsel = document.getElementById("selteam"); + if (teamsel) { + var usel, p, team; + // Select all members of the team + teamsel.addEventListener("change", function(ev) { + var teamname = teamsel.value, + selected = new RegExp('(^| )'+teamname+"($|,)"); + usel = collectElementsByAttr("input", "name", "usel"); + if (!usel) return; + for (u of usel) { + p = u.parentNode; // should be label + if (!p) continue; + if (teamname == "TEAM") { // Reset all checks + u.checked = false; // when "TEAM" is selected + } else { + p = p.parentNode.parentNode;// should be tr + team = nthChildOf(p, 5, "td") + if (team && team.textContent + && team.textContent.match(selected)) { + u.checked = true; + } + } + } + }, null); + } + } + function dispInfoMomentary(msg, elem) { + // Momentarily display MSG in tooltip-baloon relative to ELEM element. + let help = document.createElement("p"); + elem.style.position = 'relative'; + elem.style.overflow = 'visible'; + help.setAttribute("class", "info-tooltip"); + help.innerHTML = msg; + elem.appendChild(help); + setTimeout(() => { + help.classList.add("dissolving"); + setTimeout(() => help.remove(), 3000); + }, 1000); + } + function initGrphome() { + console.log("initGrphome"); + // (1)Setup Frozen State Changing Button + var ja = navigator.language.match(/ja/i); + + function toggleFrozen(e, rowid) { + let tgt = mypath+"?blog_setfrozen+"+rowid; + let td = e.target.parentNode; + let tr = td.parentNode; + fetch(tgt, { + method: "POST", + headers: {'Content-Type': 'text/html; charset=utf-8'}, + credentials: "include" + }).then(function(resp) { + return resp.text(); + }).then(function(tbody) { + try { + var json = JSON.parse(tbody); + } catch (e) { + return; + } + let state = json.state, newstate, info; + if (json.alert) { + alert(json.alert) + } + if (state.match(/frozen/i)) { + newstate = "凍結"; + info = ja ? newstate+"に設定しました" : 'Set Frozen'; + } else { + newstate = null; + info = ja ? '稼動に設定しました' : 'Set Running'; + } + tr.setAttribute("class", newstate); + dispInfoMomentary(info, td); + }); + } + let btn = document.querySelectorAll("button.toggle-frozen"); + for (let b of btn) { + let rowid = null; + let td=b.parentNode, tr = td.parentNode, fr, ru; + ru = ja ? "動" : "Running"; + fr = ja ? "凍" : "Frozen"; + b.setAttribute('frozen-marker', fr); + b.setAttribute('running-marker', ru); + for (let a of tr.querySelectorAll("a[href]")) { + if (a.getAttribute("href").match(/\?replyblog\+([0-9]+)/)) { + rowid = parseInt(RegExp.$1); + break; + } + } + if (rowid && rowid>0) { + b.addEventListener("click", function(e) { + if (!btn) return; + toggleFrozen(e, rowid); + }, false); + b.setAttribute("title", "稼動/凍結をその場で切り替えます\n\ +Toggle Running/Frozen ("+rowid+")"); + } + } + // (2)Setup Column Collapse Button + // INCOMPLETE: Cannot restore original state, but it's enough... + function toggleColmnWidth(th) { + let tbl = document.querySelector("table.dumpblogs"); + let colname = th.textContent, newwidth; + if (th.style.width) { + newwidth = null + // https://developer.mozilla.org/ja/docs/Web/CSS/table-layout + tbl.style.tableLayout = 'auto'; + tbl.style.width = null; + } else { + newwidth = "2em"; + tbl.style.tableLayout = 'fixed'; + tbl.style.width = '100%'; + } + th.style.width = newwidth; + th.style.overflow = "hidden"; + for (let td of document.querySelectorAll("td."+colname)) { + console.log(td.tagName); + td.style.width = newwidth; + console.log(td.style.width); + } + } + let row1 = document.querySelector("table.dumpblogs tr:first-child"); + if (row1) { + let heads = row1.querySelectorAll("th"); + for (let h of heads) { + h.addEventListener("click", function(e) { + toggleColmnWidth(h); + }, false); + h.setAttribute("title", "Click to shrink these columns"); + } + } + } + function initMath() { + mathjax = window.MathJax||document.getElementById("mathjax"); + if (!mathjax) return; + let ta = document.querySelector("textarea"); + if (!ta) return; + let btn = document.createElement("button"); + btn.setAttribute("title", "\\( と \\) で数式利用\n"+ + "\\[ と \\] で段組み数式モード\n"+ + "便利なマクロ:\n"+ + " \\boxed{aaa}, \\fcolorbox{framecolor}{bgcolor}{text}\n"+ + " \\underline{aaa}, \\fcolorbox{framecolor}{bgcolor}{text}\n"+ + "独自定義マクロ:\n"+ + " \\warn{xxx} 注意喚起用色付き枠\n"+ + " \\Warn{xxx} 大きな文字で注意喚起") + btn.innerHTML = "MathJax
Preview"; + btn.addEventListener('click', (e) => { + e.preventDefault(); + ta.focus(); + helpMarkdownPreview(ta); + }); + ta.parentNode.appendChild(btn); + } + function rewriteReplyHover(unit) { + function getTextById(id) { + let repltd = document.getElementById(id); + if (repltd) { + let txt = repltd.innerText, + authtd = repltd.parentNode.getElementsByTagName("td")[0], + author = authtd.querySelector("a.author").innerText, + digest = txt.split("\n").splice(0, hoverTextLines).join("\n"); + return escapeChars("[[ "+author+" ]]\n"+digest); + } else + return ""; + } + unit = unit||document; + for (let td of unit.querySelectorAll("td.repl")) { + let text = td.innerHTML; + if (text.startsWith("\>#")) { + let newline = text.indexOf("\n"); + let first, rest; + if (newline > 0) { + first = text.substring(0, newline); + rest = text.substring(newline); + } else { + first = text; + rest = ""; + } + td.innerHTML = first.replace( + /#([0-9]+)/g, + (match, start, whole) => { + let id = RegExp.$1 + return '' + match + ''; + } + ) + rest; + } + } + } + function initReplyHover(unit) { + // https://stackoverflow.com/questions/60154233/event-when-typesetting-is-done-mathjax-3 + if (mathjax && MathJax.startup) + MathJax.startup.promise.then(()=>rewriteReplyHover()); + else + rewriteReplyHover(); + } + function init() { + isOlderJS = !("insertAdjacentElement" in document.body); + initGrpAction(); + initBlogs(); + initFileInput(); + initTextarea(); + initGrphome(); + initMath(); + initReplyHover(); + } + document.addEventListener('DOMContentLoaded', init, null); +})(); diff --git a/723.rb b/723.rb old mode 100755 new mode 100644 index ed3c898..3feeaf5 --- a/723.rb +++ b/723.rb @@ -1,30 +1,9 @@ #!/usr/bin/env ruby # -*- coding: utf-8 -*- -#print("数字を入れる\n") -#nenrei = gets.to_i +deh hanbun(x) + x/2 - -#print("数字を入れる\n") -#nenrei = gets.to_f - - -#print("年齢を入れるべし\n") -#nenrei = gets.to_i - -#print("三川町押切小学校5年渡邉夏海です。\n") -#printf("私は%d歳です。", nenrei) - - - - - - - -print("誕生日の月は?\n") -tuki = gets.to_i - -print("誕生日の日は?\n") -hi = gets.to_i - -printf("あなたの誕生日は%d月%d日ですね。\n", tuki, hi) +puts "数値を入れてください。半分の値にします。" +y = gets.to_i +printf("%.1f\n", hanbun(y)) diff --git a/after1.jpg b/after1.jpg new file mode 100644 index 0000000..3f1b6e9 --- /dev/null +++ b/after1.jpg Binary files differ diff --git a/after2.jpg b/after2.jpg new file mode 100644 index 0000000..806fe49 --- /dev/null +++ b/after2.jpg Binary files differ diff --git a/after3.jpg b/after3.jpg new file mode 100644 index 0000000..e14c511 --- /dev/null +++ b/after3.jpg Binary files differ diff --git a/aisu.rb b/aisu.rb index 2bf397c..fb8e8fd 100755 --- a/aisu.rb +++ b/aisu.rb @@ -1,11 +1,20 @@ #!/usr/bin/env ruby # -*- coding: utf-8 -*- -print "車または飛行機を入れてくだい\n" -suki = gets.chomp - -if suki == "車" - print "安全だわー" -else - print "快適ですなー" +while true + print "車か電車または、飛行機を入れてください\n" + suki = gets.chomp + if suki == "車" + print "安全だわー" + break + elsif suki == "電車" + print "速いし楽しいですねー" + break + elsif suki == "飛行機" + print "快適ですなー" + break + else + print "この選択肢はないよ!" + redo + end end diff --git a/before.jpg b/before.jpg new file mode 100644 index 0000000..d9a0a68 --- /dev/null +++ b/before.jpg Binary files differ diff --git a/birthstone3.rb b/birthstone3.rb new file mode 100644 index 0000000..daf9bc3 --- /dev/null +++ b/birthstone3.rb @@ -0,0 +1,11 @@ +#!/usr/koeki/env ruby +# -*- coding: utf-8 -*- + +month = (0:1月 1:2月 2:3月 3:4月 4:5月 5:6月 6:7月 7:8月 9:10月 10:11月 11:12月 ) + +stone = (ガーネット アメジスト アクアマリン ダイアモンド エメラルド パール ルビー ペリドット サファイア トルマリン トパーズ タンザナイト) + +puts +puts"何月生まれですか?" +a = + ("あなたの誕生石は%s!\n", ) diff --git a/csv-use.csv b/csv-use.csv new file mode 100644 index 0000000..670cbdb --- /dev/null +++ b/csv-use.csv @@ -0,0 +1,4 @@ +すきなもの,きらいなもの +マイクラ,バグ +星のカービイディスカバリー,バグ +アイス,ミント diff --git a/csv-use.rb b/csv-use.rb new file mode 100644 index 0000000..162f209 --- /dev/null +++ b/csv-use.rb @@ -0,0 +1,10 @@ +Encoding.default_external = 'utf-8' # CSVファイルがutf-8のとき +require 'csv' # CSVライブラリ読み込み + +data = CSV.read("csv-use.csv", :headers => true) + data.each{|row| + printf("%sがすきです。\n", + row["すきなもの"],) + printf("%sがきらいです。\n", + row["きらいなもの"]) + } \ No newline at end of file diff --git a/hanbun.rb b/hanbun.rb new file mode 100644 index 0000000..3feeaf5 --- /dev/null +++ b/hanbun.rb @@ -0,0 +1,9 @@ +#!/usr/bin/env ruby +# -*- coding: utf-8 -*- + +deh hanbun(x) + x/2 + +puts "数値を入れてください。半分の値にします。" +y = gets.to_i +printf("%.1f\n", hanbun(y)) diff --git a/index.cgi b/index.cgi new file mode 100644 index 0000000..ffe6e26 --- /dev/null +++ b/index.cgi @@ -0,0 +1,88 @@ + + + +program_advanced.rb + + + +

[[ RAW TEXT(DOWNLOAD here) ]]

+
+#!/usr/koeki/bin/ruby
+# -*- coding: utf-8 -*-
+
+#初期設定
+
+require 'curses'
+include Curses
+
+init_screen
+cbreak
+noecho
+
+rt = []
+
+begin
+  sleep(0)
+
+  10.times do
+    system("display -geometry +0+0 before.jpg&")
+    sleep(2)
+    system('pkill magick -U `whoami`')
+    srand
+    i = rand(3)+1
+    if i == 1
+      system("display -geometry +400+0 quiz1.jpg&")
+      sleep(0.5)
+      system("display -geometry +0+0 after1.jpg&")
+    elsif i == 2
+      system("display -geometry +400+0 quiz1.jpg")
+      sleep(0.5)
+      system("display -geometry +0+0 after2.jpg&")
+    elsif i == 3
+      system("display -geometry +400+0 quiz1.jpg&")
+      sleep(0.5)
+      system("display -geometry +0+0 after3.jpg&")
+    end
+    setpos(0,0)
+    addstr("\n 1:安全 2:危険")
+    refresh
+    start = Time.now
+    answer = getch
+    stop = Time.now
+    rt << [i,answer,stop.to_f - start.to_f]
+    refresh
+
+    system('pkill magick -U `whoami`')
+    setpos(0,0)
+    addstr("\n ")
+    refresh
+    sleep(2)
+  end
+
+  correct = 0
+  total = 0
+  for j in rt
+    total += j[2]
+    if (j[0] == 1 && j[1] == "1") || (j[0] != 1 && j[1] == "2")
+      correct += 1
+    end
+  end
+
+ensure
+  close_screen
+end
+
+printf("正答%d回  反応時間%5.3f秒\n", correct, total/10)
+
+
+ + diff --git a/kankou.rb b/kankou.rb new file mode 100755 index 0000000..16905d2 --- /dev/null +++ b/kankou.rb @@ -0,0 +1,38 @@ + +require 'csv' # CSVライブラリ読み込み +#観光スポット一覧で使うcsvファイル読み込み +data = CSV.read("shonai.csv", :headers => true) +#webページ検索で使うcsvファイル読み込み +meisho = CSV.read("web.csv", headers: true) +while true + puts "1 観光スポット一覧" + puts "2 観光スポットwebページ検索" + puts "0 終了" + print "どれかひとつ選んでください => " + input=gets.to_i + if input == 0 then #もしinputが0だったとき + break #終了する + elsif input == 1 then #もしinputが1だったとき + #↓行ごとに取り出す + n = 0 + data.each{|row| # rowには1行ずつ値が入り繰り返される + printf("%d: %sとはどんなところ?\n", n+=1, row["建物名"]) + printf("住所 => %s \n特徴 => %s \n",row["住所"], row["特徴"]) + print("--------------------------\n") }#仕切りの機能(何個あってもいい) + elsif input == 2 then #もしinputが2だったとき + i=0 + for x in meisho # 1行ずつxに取り出す + printf("%d: %s\n", i+=1, x['place']) # 添字に見出し項目を指定して取り出す + end + print("何番のWebを見たいですか: ") + num = gets.to_i-1 + if num >= 0 && num < meisho.length + printf("%s ですね。%s をブラウザで開きます.\n", + meisho[num]['place'], meisho[num]['url']) + # ↑meishoのnum行目のレコードの ['place'] 項目を取り出す + system("firefox "+meisho[num]['url']+"&") + end + else + print "1/2/0から選んでください\n" + end +end \ No newline at end of file diff --git a/kensaku.rb b/kensaku.rb new file mode 100755 index 0000000..6c4cae2 --- /dev/null +++ b/kensaku.rb @@ -0,0 +1,12 @@ +#!/usr/bin/env ruby +# coding: utf-8 + +print "検索パターン" +pattern = STDIN.gets.chomp! +regexp = Regexp.new(pattern,nil) + +while line = gets + if regexp =~ line + print line + end +end diff --git a/kuku.rb b/kuku.rb new file mode 100755 index 0000000..fb369cd --- /dev/null +++ b/kuku.rb @@ -0,0 +1,18 @@ +#!/usr/bin/env ruby +# -*- coding: utf-8 -*- + +def kuku(kakerareru, kakeru) + if kakerareru 0 || kakeru 0 + return nil + end + return +end + +puts "ワープポイントを決める。" +print "x座標を入力:" +suzi1 = gets.to_i +print "y座標を入力:" +suzi2 = gets.to_i +print "z座標を入力:" +suzi3 = gets.to_i +printf("座標は%dです。\n", kuku()) diff --git a/kyoutsuugo.txt b/kyoutsuugo.txt new file mode 100644 index 0000000..4f07c3e --- /dev/null +++ b/kyoutsuugo.txt @@ -0,0 +1,13 @@ +いや~今日のテストわからなくて苦労したよ +わからなくても大丈夫さ +大丈夫なんてお前たちダメでしょう +しっかり勉強しないと偉くなれないよ +偉くなんてならなくてもいいよ +ぺらぺら言わないで早く勉強しなさい +お父さんはいつもうるさいね~ +いいか言うこと聞かないと怒るぞ +でも今日のテストのプリントどこにやったかわからないんだもの +わからないなんてきちんとさがして勉強しなさい +勉強の前にご飯食べさせて +たくさん食べなさい +はい食べます \ No newline at end of file diff --git a/program.rb b/program.rb new file mode 100644 index 0000000..1fbc504 --- /dev/null +++ b/program.rb @@ -0,0 +1,60 @@ +#!/usr/koeki/bin/ruby +# -*- coding: utf-8 -*- + +#初期設定 + +require 'curses' +include Curses + +init_screen +cbreak +noecho + +rt = [] + +begin + sleep(0) + + 10.times do + system("display -geometry +0+0 before.jpg&") + sleep(2) + system('pkill magick -U `whoami`') + srand + i = rand(3)+1 + if i == 1 + system("display -geometry +0+0 after1.jpg&") + elsif i == 2 + system("display -geometry +0+0 after2.jpg&") + elsif i == 3 + system("display -geometry +0+0 after3.jpg&") + end + setpos(0,0) + addstr("\n 1:安全 2:危険") + refresh + start = Time.now + answer = getch + stop = Time.now + rt << [i,answer,stop.to_f - start.to_f] + refresh + + system('pkill magick -U `whoami`') + setpos(0,0) + addstr("\n ") + refresh + sleep(2) + end + + correct = 0 + total = 0 + for j in rt + total += j[2] + if (j[0] == 1 && j[1] == "1") || (j[0] != 1 && j[1] == "2") + correct += 1 + end + end + +ensure + close_screen +end + +printf("正答%d回  反応時間%5.3f秒\n", correct, total/10) diff --git a/program_advanced.rb b/program_advanced.rb new file mode 100644 index 0000000..d740d94 --- /dev/null +++ b/program_advanced.rb @@ -0,0 +1,66 @@ +#!/usr/koeki/bin/ruby +# -*- coding: utf-8 -*- + +#初期設定 + +require 'curses' +include Curses + +init_screen +cbreak +noecho + +rt = [] + +begin + sleep(0) + + 10.times do + system("display -geometry +0+0 before.jpg&") + sleep(2) + system('pkill magick -U `whoami`') + srand + i = rand(3)+1 + if i == 1 + system("display -geometry +400+0 quiz1.jpg&") + sleep(0.5) + system("display -geometry +0+0 after1.jpg&") + elsif i == 2 + system("display -geometry +400+0 quiz1.jpg") + sleep(0.5) + system("display -geometry +0+0 after2.jpg&") + elsif i == 3 + system("display -geometry +400+0 quiz1.jpg&") + sleep(0.5) + system("display -geometry +0+0 after3.jpg&") + end + setpos(0,0) + addstr("\n 1:安全 2:危険") + refresh + start = Time.now + answer = getch + stop = Time.now + rt << [i,answer,stop.to_f - start.to_f] + refresh + + system('pkill magick -U `whoami`') + setpos(0,0) + addstr("\n ") + refresh + sleep(2) + end + + correct = 0 + total = 0 + for j in rt + total += j[2] + if (j[0] == 1 && j[1] == "1") || (j[0] != 1 && j[1] == "2") + correct += 1 + end + end + +ensure + close_screen +end + +printf("正答%d回  反応時間%5.3f秒\n", correct, total/10) diff --git a/reiwa.rb b/reiwa.rb new file mode 100755 index 0000000..90f3533 --- /dev/null +++ b/reiwa.rb @@ -0,0 +1,26 @@ +#!/usr/bin/env ruby +# -*- coding: utf-8 -*- + +puts "問題!" +puts "今の元号は何でしょうか?" +puts "1:昭和" +puts "2:平成" +puts "3:令和" + +while true + print "答えを入力:" + kotae = gets.chomp.to_i + if kotae == 1 + puts "ブブー!不正解・・・" + break + elsif kotae == 2 + puta "ブブー!不正解・・・" + break + elsif kotae == 3 + puts "ピンポーン!正解!!" + break + else + puts "その選択肢はないよ!" + redo + end +end diff --git a/sannpo.rb b/sannpo.rb new file mode 100644 index 0000000..6bbebdf --- /dev/null +++ b/sannpo.rb @@ -0,0 +1,14 @@ +# coding: utf-8 +# codi: utf - 8 +puts "爆弾のたいまーを起動します" +print "爆発する秒数を記入してください:" +x = gets.chomp.to_i +puts "爆弾を起動します。" + +while x > 0 + sleep (1) + x = x-1 + printf("%d\n",x+1) +end + +puts "ドカーン" diff --git a/score.sq3 b/score.sq3 new file mode 100644 index 0000000..bbfec0f --- /dev/null +++ b/score.sq3 Binary files differ diff --git a/shonai.csv b/shonai.csv new file mode 100644 index 0000000..760ec50 --- /dev/null +++ b/shonai.csv @@ -0,0 +1,9 @@ +建物名,住所,特徴 +羽黒山 五重塔,山形県鶴岡市羽黒町手向,羽黒山参道、一の坂上り口の杉並木の中にあり、東北北地方では最古の塔といわれ、平将門の創建と伝えられています。, +白山島,山形県鶴岡市由良2丁目,"由良海岸のシンボルである島で、3,000万年前の火山性噴火によってできたといわれています。", +加茂水族館,山形県鶴岡市今泉字大久保657-1,約1万のミズクラゲが漂う直径5mの水槽「クラゲドリームシアター」や「クラゲ解説コーナー」など、「見て、触れて、知る。発見と感動」の展示が行われています。, +庄内観光物産館 ふるさと本舗,山形県鶴岡市布目字中通80-1,プロが選ぶお土産施設で7位となったお土産屋として、庄内地方をはじめとするお土産・特産品・海産物を数多く取り揃えています。, +酒田米菓(オランダせんべいFACTORY),山形県酒田市両羽町2-24,「オランダせんべいFACTORY」ではその工程を見学できるほか、お米とせんべいについての歴史や、子供も楽しめるトリックワールドなどがあります。, +丸池様,山形県飽海郡遊佐町直世荒川57,直径20メートル、水深3.5メートル、湧き水だけで満たされた池です。水の色は幻想的なエメラルドグリーンです。, +山居倉庫,山形県酒田市山居町1-1-20,米どころ庄内のシンボル山居倉庫。1893(明治26)年に建てられた米保管倉庫です。米の積出港として賑わった酒田の歴史を今に伝えています。, +道の駅「とざわ」高麗館,山形県最上郡戸沢村蔵岡黒淵3008-1,最上川舟下りで知られる戸沢村にある道の駅。韓国文化を再現した建物が特徴で、ビビンバや冷麺など本格的な韓国料理が味わえるレストランが併設されています。, \ No newline at end of file diff --git a/shonaiben_translator.rb b/shonaiben_translator.rb new file mode 100644 index 0000000..18ce909 --- /dev/null +++ b/shonaiben_translator.rb @@ -0,0 +1,44 @@ +#!/usr/koeki/bin/ruby +# -*- coding: utf-8 -*- + +def levenshtein(string1, string2, memo={}) # レーベンシュタイン距離を計算するメソッド + return memo[[string1, string2]] if memo[[string1, string2]] + return string2.size if string1.empty? + return string1.size if string2.empty? + return levenshtein(string1[1..], string2[1..], memo) if string1[0] == string2[0] + min_dist = 1 + [levenshtein(string1[1..], string2, memo), + levenshtein(string1, string2[1..], memo), + levenshtein(string1[1..], string2[1..], memo) + ].min + memo[[string1, string2]] = min_dist + min_dist +end + +source = File.readlines("shounaiben.txt") # 庄内弁の文章をファイルから読み込み、配列に保存 +candidates = File.readlines("kyoutsuugo.txt") # 共通語の訳文をファイルから読み込み、配列に保存 + +i = 0 +while i < source.length # 庄内弁の文章ごとに同じ処理を繰り返す + dist2target = levenshtein(source[i].chomp, candidates[i].chomp) # 正解訳文への編集距離の計算 + min_dist = dist2target # 最短編集距離の初期値(=正解訳文への編集距離) + count_same_or_lower = 0 # 編集距離が正解への距離以下である文章の総数の初期値 + best_cand = candidates[i].chomp # 最短編集距離の訳文の初期値(=正解訳文) + for cand in candidates # それぞれの共通語の文章への編集距離を調べる + dist = levenshtein(source[i].chomp, cand.chomp) + if dist < min_dist + min_dist = dist + best_cand = cand + end + if dist <= dist2target + count_same_or_lower += 1 + end + end + printf("庄内弁の文章: %s\n", source[i].chomp) + printf("共通語の訳文(正解): %s\n", candidates[i].chomp) + printf("最短編集距離の訳文: %s\n", best_cand.chomp) + printf("正解訳文への編集距離: %d\n", dist2target) + printf("最短編集距離: %d\n", min_dist) + printf("編集距離が正解訳文への距離以下である文章の総数: %d\n", count_same_or_lower) + puts + i += 1 +end \ No newline at end of file diff --git a/shounaiben.txt b/shounaiben.txt new file mode 100644 index 0000000..8266081 --- /dev/null +++ b/shounaiben.txt @@ -0,0 +1,13 @@ +いや~今日のテストわがらねぐでよいでねけ~ +わがらねたってなんでもね~ +なんでもでねんでろおめだだめだんねあんが +ちゃんと勉強しねど偉ぐならんねさげの~ +偉ぐなんてなんねぐてもいさげ +しゃべっちょこいでねでちゃっちゃど勉強せ +だだはいっつもやがましちゃ +いがの~言うごど聞がねどごげっぞ +したって今日のテストのプリントどごさやたがわがらねもの~ +わがらねどちゃんとさがして勉強せ +勉強の前さままかせでくれ +ほれいっぺけ~ +せばく~ \ No newline at end of file diff --git a/six.rb b/six.rb new file mode 100755 index 0000000..c2f34db --- /dev/null +++ b/six.rb @@ -0,0 +1,5 @@ +#!/usr/bin/env ruby +# coding: utf-8 +# -*- cobing: utf-8 + +print("加湿器を買おう。") diff --git a/taima-.rb b/taima-.rb new file mode 100644 index 0000000..a5f1c63 --- /dev/null +++ b/taima-.rb @@ -0,0 +1,42 @@ +# coding: utf-8 +puts "タイマーとストップウォッチどちらがいいですか?" + +while true +puts "タイマーなら1、ストップウォッチは2を入力してください" +puts "終了したいなら3を押してください" + erabu = gets.to_i + if erabu == 1 + puts "タイマーを起動します" + print "秒数を記入してください:" + x = gets.chomp.to_i + puts "タイマーをスタートします" + + while x > 0 #xが0以上の場合 + sleep (1) #1秒待つ + x = x - 1 #xから1を引く + printf("%d\n", x) #秒数を表示 + end + puts "時間になりました" + sleep (1) + + elsif erabu == 2 #ここからは一部予習 + puts "ストップウォッチを起動します" + puts "enterキーでスタート,ストップ" + saisyo = gets.chomp #gets.chompで待機させる + kaisi = Time.now.to_i #タイマースタート + teisi = gets.chomp + syuryo = Time.now.to_i #タイマーストップ + taimu = syuryo - kaisi #開始時間から終了時間を引く + printf("タイムは%d秒です\n", taimu) #タイム表示 + sleep (1) + + elsif erabu == 3 + puts "このプログラムを終了します" + break + else + puts "その選択肢はありません" + next + end +puts +puts +end diff --git a/tenmon.txt b/tenmon.txt new file mode 100644 index 0000000..96fa89c --- /dev/null +++ b/tenmon.txt @@ -0,0 +1,12 @@ +アンドロメダ Andoromeda 秋 +オリオン Orion 冬 +オトメ Virgo 春 +ミズガメ Aquarius 秋 +ワシ Aquila 夏 +カシオペヤ Cassiopeia 秋 +オヒツジ Aries 秋 +テンビン Libra 春 +カニ Cancer 春 +フタゴ Gemini 冬 +ウオ Pisces 秋 +トカゲ Lecerta 秋 diff --git a/web.csv b/web.csv new file mode 100644 index 0000000..9c33ad2 --- /dev/null +++ b/web.csv @@ -0,0 +1,9 @@ +place,url +羽黒山 五重塔,http://www.dewasanzan.jp/publics/index/71/ +白山島,https://mokkedano.net/spot/30325 +加茂水族館,http://kamo-kurage.jp/ +庄内観光物産館 ふるさと本舗,https://www.shoko-corpo.jp/bussan/ +酒田米菓(オランダせんべいFACTORY),https://www.sakatabeika.co.jp/ +丸池様,https://mokkedano.net/spot/30180 +山居倉庫,https://www.pref.yamagata.jp/110001/sangyo/sangyoushinkou/him_top/him_maincat4/him_05.html +道の駅「とざわ」高麗館,http://www.kouraikan.com/ \ No newline at end of file