19日に更新してた

アフィリエイトはないよ

【Python】東証上場銘柄一覧を利用して効率的にYahoo!ファイナンスVIPクラブ CSVのダウンロードリストを作成する方法

python を使って Yahoo! ファイナンス VIP クラブの csv をダウンロードする方法を検索すると、それに関する記事がいくつかあるのですが、コード番号を range で総当りしているものが散見されます。存在しないコードを入力すると時間の無駄ですし、Yahoo! の方も無駄な資源を遣うことになります。

公表されているコードリストを入れてやれば無駄が少ないのではないか?ということで、日本取引所グループのサイトで東証上場銘柄一覧というものが毎月更新されています。それを、使ってコードのリストを作りましょう。

www.jpx.co.jp

ただ、東証上場銘柄一覧に出ているものが全て Yahoo! ファイナンスで情報公開されているかを python & jupyter-notebook で確認すると

import pandas as pd

data = pd.read_excel("https://www.jpx.co.jp/markets/statistics-equities/misc/tvdivq0000001vg2-att/data_j.xls")
data["市場・商品区分"].unique()

ででてくる

array(['プライム(内国株式)', 'ETF・ETN', 'スタンダード(内国株式)', 'グロース(内国株式)', 'PRO Market', 'プライム(外国株式)', 'REIT・ベンチャーファンド・カントリーファンド・インフラファンド', 'スタンダード(外国株式)', 'グロース(外国株式)', '出資証券'], dtype=object)

を一つづつエクセルでもダウンロードしておいた上記エクセルに検索をかけ、最初に当たった部分のコード番号を Yahoo!ファイナンスで検索すると、上のリストのうち 'PRO Market' だけは検索しても情報が出てきませんので、

import pandas as pd

data = pd.read_excel("https://www.jpx.co.jp/markets/statistics-equities/misc/tvdivq0000001vg2-att/data_j.xls")
code = data[data["市場・商品区分"]!='PRO Market']["コード"].tolist()

くらいでコードを選んで code を for 文で回してやると、エラー率がかなり下がり、ダウンロード時間も短縮できると思います。

令和5年11月下旬~12月中旬の雑記

  • なんとなく、もう一回 rust やってみようかと思って YouTube のこちらの動画を眺めている。

www.youtube.com

  • VScode で設定いじってもフォーマッタが保存時自動で効かないのはなんでや。どこが悪いのかわからないから放置。
  • rust でも golang でも python でもいまいちよくわかってないことを windows copilot に質問するとコード付きで教えてくれるので便利なんだけど、無料だから質問回数制限があるのが仕方がないけれど難だな。でも、これ仕事なら課金させていただくべきモノ感が。
  • ffmpeg でタグ入れを xml からそのまま流し込んでたらエラーが出たので試行錯誤してみたら、全角の "&" が原因だった。全角でもあかんのや…
  • ちょっとしたのを作ろうとポチポチやっていたらいまいち数字が合わないので「なんでだ?」と思っていたら、手書きでの計算式が間違っていた。ここのところそんなのを何回もしている。
  • クルトガダイブ欲しくて色々眺めているけど、一向に手に入る気配がない。色増えるのもいいけれど、定価で手に入るようにはして欲しい。
  • 動画は途中で放置気味だけれど、rust のキビキビした感じ、MT の軽トラみたい。
  • 年賀状やらなきゃ。しかし、今のプリンタはちょっと前の印刷屋に出すようなクオリティでインクジェットはがきに印刷してくれるので枚数少ないから印刷出さなくてもこれで充分。自宅で印刷する予定。年賀状本も安くてクオリティ高いし。
  • お歳暮は出した。
  • 宝くじ、当たるものと考えて買うなら弱者の税金かもしれないけれど、当たらないものとして買うなら寄付、浄財としては悪くないと思っている。当たっても換金しなければいいわけだし、どこでもできるし。でも、売る方はそんなこと言えないから。
  • chrome 拡張機能の rajiko で読み込み設定変えておいて、chromedpでアクセスしても違う都道府県からのアクセスにできるみたい。けど、タイムフリーは無理みたい。

chromewebstore.google.com

  • スマホが調子悪くなったので、Amazonで適当なのを買って入れ替えた。USB-C になったり、イヤホン端子がなくなったりした。
  • そういえば、この秋に会った「NTT系の会社でマイナンバーをクラウド化するのが今の仕事」と言ってた後輩に「どこのクラウド?」って聞いたら「言えないんですよ」って言ってたから、その時点では発表されてなかったけれどさくらで決まってたのかも。
  • elixir でも非同期で簡単にプログラム実行できると聞いたので調べてみたけれど、個人的に苦手な Ruby 構文で実行速度が golang に劣るとのことで現時点で手を出す要素がなかった。大規模開発とかする機会があったら考えよう。
  • スマホで AI 英会話教室に興味があったので、会費が一番安そうでセールやっている ELSA speak を試してみた。機能が多すぎて把握できないけれど、毎日続けられているので買う予定。
  • 去年 golang を始めたのも11月くらいだった。学問の秋?

golang の map[struct]interface : JSON Marshal/Unmarshal での取り扱い

golang で map[struct]interface が出てきてどうすりゃいいんだと検索したら、json.Marshal してから、json.Unmarshal と解説してくださっているページありました。

そこでとりあえず、json.Marshal してプリントして出てきた json

mholt.github.io

辺りにコピペ処理して、出てきた struct をコードにコピペして好みの名前に書き換えて json.Unmarshal してやれば、struct としてお手軽に扱えるようになりました。

ただ、 interface 内に []string が入っていて、しかも使うものが全部が全部 length が1の場合だと*1、新しく map[string]string を作って中身を移してから json.Marchal、json.Unmarshal したほうが後でスライスのインデックス指定しなくてもよいので、わずかにストレス減らせるのですが無駄な処理して資源の無駄遣いをしている感じがたまらない。

*1:map[struct][1]string みたいな感じ

令和5年10月下旬~11月中旬の雑記

wsl 使って golang は動くのかなと思って、wsl2 に入っている ubuntu にインストールして、wsl go run してみた。
wsl 側でダウンロードしていなかったライブラリをダウンロードした上で動いてくれた。動いて当然なのだけれど、とりあえず、嬉しかった。けど、当分使う機会はなさそう。

python で作った仕事用のとりあえずのあたりをつける計算をするプログラム*1golang で書き直してみようかなと思って調べてみた。
残念なことに sympy の solver 相当のもの*2と 3D グラフを書けるグラフライブラリをみつけられなくて断念*3

goroutine で exec.Command で ffmpeg 使ってストリーミングをダウンロードするときに、sysnc.waitGroup を使って、バッファ付き channel でバッファ数 = ダウンロード数を runtime.GOMAXPROCS() で 制限したりしていたのですが*4、ダウンロード数が一桁のことが多いのでわりとCPUにも回線にも余裕あることがあるので wg.Add でダウンロード予定ファイル数を突っ込んでやっておまかせしたほうがいっぱいいっぱいまで行くこともありますが速い。

go mobile の話題は最近あまり見ないのでどんなものかと調べたら、その気になったら悪くない感じ。
個人で簡単なボットを運用するなら、メモリーもスレッドも vps のお安いのより豊富だから、長期のつもりなら日本通信の安い SIM でも突っ込んで LAN と通信回線を二重にしておいて動かすのがいいのかも。*5

go run とかしているとノートン360君が「ウイルスみたいやで」と親切にも遮断してくれるので、とてもありがた迷惑。仕方がないので設定いじった。

YouTube で広告を何回も見せていただいたおかげで感化されて、「セールだしせっかくだからお安いのを買ってみようか」と、はじめて動画でプログラミング講座*6を受講してみた。
わかりやすいうえに途中で止めて疑問を試してみることができるし、動画時間が短いと写経の量も少ないし、本で勉強するときの目が滑っていく感じもなくて、最初だけしか見てないけれどとても良かった。
とりあえず、作りたい欲だけで検索しまくって覚えてきたけれどやっぱりあった方がいい知識が抜けていたりする。本にも書いてあるのだろうけれど、目が滑っていっている部分に書いてあるのだろうな。
udemy や YouTube 以外を知らないので、そこらあたりから探して受講していこうかと思う。

はてなの AI タイトルアシストをこのページで使ってみたけれど、段落毎に内容が変わっているようだとどこかの段落のタイトルになってしまって、トータルではつけてくれないのでまた何かのときに使わせてもらおうと思って、自分でつけたセンスのないタイトルのまま。

ところてん氏の情報1の本を読んで、家人所有の今年版の IT パスポートの本の存在を思い出したので使用許可を願い出たら、「使ってないからいいよ」と快諾されたので、受験を決意。

IT パスポートの申込みをクレジットカードでしたら上手く行かないので、こちらのサイトを参考にした。最後にもう一度"Internet Explorer モード (IE モード) でサイトの再読み込みを許可"をしたらうまくいった。
shiken-kouryaku-joho.com

Edge の IE モードの存在を初めて知ったけれど、期間制限とサイト、ディレクトリ指定が付くものの IE の振る舞いで Edge を動かせるということは chromedp でユーザー設定読み込んだら自動運転でもそのモードで動かせる?
IE モードが必要な機会がないので試しようがないけれど、chromedp から設定できればサイトを作るお仕事で IE 使っていた方々には色々と捗りそうな機能。

webHID を使いたい案が浮かんできたので、Javascript

rust で ffmpeg が動かないので放り出した記憶があるけれど、golang と同じで " *7の有無だったのでは?と試してみたくなったが環境消してた。*8

スマホの Bing Chat だと GPT-4 にしますかと出てくるのに PC だと出てこない。仕方がないので PC の方の履歴からスマホで検索した内容を継続して質問してみたら、うまくいった。なんか紫。

IT パスポートの勉強でこちらのサイトを使わせていただいている。
www.itpassportsiken.com

プロトラブズ日本撤退してたのね、最近加工関係と縁遠かったから知らなかった。個人対応で特殊ネジを切ってくれる頼みやすいところが欲しいけれどなかなかないのよね。*9

javascript でクラス使えることを知らずに組んでた。面倒なので直したくない。

windows copilot や bing chat で高校レベルの空間座標の交点や交線の求め方のプログラムを聞くと割といい感じのが戻ってくる。でも、python の内包表記で Fibonacci 数列とかはまだあかんみたい。

*1:仕事用の本チャンソフトをぶん回すのは時間がかかりすぎるので作ったもので、計算結果をそのまま使うわけではないもの

*2:無しでもできなくはない→保留

*3:python の plotly の go が検索でザクザク出てきてよくわからん

*4:semaphore 使えってな?channel を使いたかったから…

*5:僕のプログラムだと回線は生きててもメモリーリークでアプリは落ちそうだけど

*6:udemy

*7:クォーテーションマーク

*8:golang で並行ダウンロードできるようになったら、すごく興奮して忘れてた

*9:以前頼んだところが悪すぎた & カメラフィルター用の径で0.5mmネジとか、11mm径で0.5mmネジとか規格にないからしかたがないのだけれど

"golang excel " を検索すると excelize と出てくるけれど、拡張子に注意が必要な話

タイトルでお話は終わりの話。

注意力散漫な当方としては「ウインドウズのデスクトップに緑のエクセルのアイコンが出ていたら何でも一緒やろ」位の感覚ですが、どうも世の中はそうではないようで XLAM / XLSM / XLSX / XLTM / XLTX だと excelize でいけるのですが、XLS だとダメです。*1

github.com

XLS だと extrame/xls あたりになるのかな、セルの中の日本語の文字数が多いとなんともならない感じではありますが。

github.com

python では pandas を特になんとも思わずに使っておりましたが、ネットから引っ張ってきて拡張子関係なく開いてくれて、dataFrame にしてくれて、一行で実行してくれるとても有難いものだと今更ながら感謝しております。

*1:正直、ここに挙げられている拡張子の違いの意味を全くわかっていない

拡張子 txt の csv ファイルデータ内のスペースを除去した csv ファイルを作る

何かよくわからないタイトルですが、拡張子 txt の csv ファイルの住所データを使って郵便を出したい。けれど、変なところでスペースが入っていたり、姓と名前の間に半角スペースと全角スペースが混じっているのを修正するのが手間、年賀状とかの宛名ソフトを併用したいが拡張子が csv じゃないと読み込まない、しかし、ファイル名を修正するのはやっぱり手間だから、なんとかしたいなということで golang で適当に作ってみました。

package main

import (
	"encoding/csv"
	"io"
	"log"
	"os"
	"os/user"
	"path/filepath"
	"strings"

	"golang.org/x/text/encoding/japanese"
	"golang.org/x/text/transform"
)

func main() {
	path := os.Args[1]

	user, err := user.Current()
	if err != nil {
		log.Fatalf(err.Error())
	}

	userdir := user.HomeDir

	fileNameSplit := strings.Split(filepath.Base(path), ".")
	newFilepath := filepath.Join(userdir, "Desktop", fileNameSplit[0]+"m.csv")

	f, err := os.Open(path)
	if err != nil {
		log.Fatal(err)
	}
	defer f.Close()

	fw, err := os.Create(newFilepath)
	if err != nil {
		log.Fatal(err)
	}
	defer fw.Close()

	r := csv.NewReader(transform.NewReader(f, japanese.ShiftJIS.NewDecoder()))
	w := csv.NewWriter(transform.NewWriter(fw, japanese.ShiftJIS.NewEncoder()))

	for {
		records, err := r.Read()
		if err == io.EOF {
			break
		}
		if err != nil {
			log.Fatal(err)
		}
		records[1] = strings.ReplaceAll(records[1], " ", " ")    //全角スペースを半角スペースに
		records[3] = strings.ReplaceAll(records[3], " ", "")    //全角スペースを除去
		records[3] = strings.ReplaceAll(records[3], " ", "")    //半角スペースを除去

		w.UseCRLF = true
		w.Write(records)
		w.Flush()
	}

}

IDが1列目、氏名が2列目、郵便番号が3列目、住所が4列目だったので氏名と住所に修正をかけて、どなたのWindowsでもファイルをアプリのアイコンにドラッグ・アンド・ドロップしたら、デスクトップに csv ファイルとして出てくるようにしてみました。*1

python でも簡単に書けるのですが、golang だと exe ファイル化してドラッグ・アンド・ドロップで使えるように出来るので、マウスで使えるのがとても良い感じ。*2

*1:IDはいらないし、郵便番号は全部半角でしたのでノータッチ

*2:Args を使って flag にしなかった理由でもあります

易占を javascript で組んでみた

以前、python で書いた易占を javascript で書き直してみました。

かなり適当 & 力技になっている感じですが、javascript でまともにプログラム組むのが初めてなのでこんなもんかなという感じです。

ke_list4 はソートしましたので、table 周りをネストしたかったのですが、取りあえず動くのでいいかなと。

jupyter-notebookを立ち上げなくて良くなったので楽になりました。*1

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>易占</title>
</head>

<body>
<center>
    <h1>コイン3枚法で占う易占</h1>
<p>
    <input type="button" value="占う" onclick='main()'>
    <input type="button" value="reload" onclick='window.location.reload()'>
</p>

    <div id="edit_area"></div>
    
</center>
<script>

function array_equal(a, b) {
  if (!Array.isArray(a))    return false;
  if (!Array.isArray(b))    return false;
  if (a.length != b.length) return false;
  for (var i = 0, n = a.length; i < n; ++i) {
    if (a[i] !== b[i]) return false;
  }
  return true;
}

function sum(arr) {
    let sum = 0;
    arr.forEach(function(elm) {
        sum += elm;
    });
    return sum;
};

function hatike_decision(arr){
let ue
let sita
let hatike=[[1, 1, 1],
         [1, 1, 0],
         [1, 0, 1],
         [1, 0, 0],
         [0, 1, 1],
         [0, 1, 0],
         [0, 0, 1],
         [0, 0, 0]];
for (let i=0;i<hatike.length;i++){
    if (array_equal(hatike[i],arr.slice(0,3))){sita=i}
    if (array_equal(hatike[i],arr.slice(3,6))){ue=i}
}
return [ue,sita]
}

function main(){
let list=[];

for (let j=0;j<6;j++){
    let list_i=[];
for  (let i = 0; i < 3; i++) {
let random = Math.floor( Math.random() * 2);
list_i.push(random);
}
    list.push(list_i);
}

let kou=[];
let honka=[];
for (let i=0;i<list.length;i++){
if(sum(list[i])==3){
    kou.push(i);
    honka.push(1);
}else if (sum(list[i])==0){
    kou.push(i);
    honka.push(0);
}else if (sum(list[i])==1){
    honka.push(0);
}else if (sum(list[i])==2){
    honka.push(1);
}
    
}

let sika=[];
if(kou.length>0){
    for(let i=0;i<list.length;i++){
        if (kou.includes(i)){
            sika.push(Math.abs(honka[i]-1))
        }else{
            sika.push(honka[i])
        }
    }
}

let goka = honka.slice(1,4).concat(honka.slice(2,5));

let hinka = [];
for (let i=honka.length-1;i>=0;i--){
    hinka.push(honka[i]);
}

let rika=[];
for (let i=0;i<honka.length;i++){
    rika.push(Math.abs(honka[i]-1))
}

let str=""

document.getElementById('edit_area').innerHTML = str ;

let ke_list = [['01', '43', '14', '34', '09', '05', '26', '11'],
          ['10', '58', '38', '54', '61', '60', '41', '19'],
          ['13', '49', '30', '55', '37', '63', '22', '36'],
          ['25', '17', '21', '51', '42', '03', '27', '24'],
          ['44', '28', '50', '32', '57', '48', '18', '46'],
          ['06', '47', '64', '40', '59', '29', '04', '07'],
          ['33', '31', '56', '62', '53', '39', '52', '15'],
          ['12', '45', '35', '16', '20', '08', '23', '02']];
let ke_list2 = [['乾為天', '沢天夬', '火天大有', '雷天大壮', '風天小畜', '水天需', '山天大畜', '地天泰'],
          ['天沢履', '兌為沢', '火沢睽', '雷沢帰妹', '風沢中孚', '水沢節', '山沢損', '地沢臨'],
          ['天火同人', '沢火革', '離為火', '雷火豊', '風火家人', '水火既済', '山火賁', '地火明夷'],
          ['天雷无妄', '沢雷随', '火雷噬嗑', '震為雷', '風雷益', '水雷屯', '山雷頤', '地雷復'],
          ['天風姤', '沢風大過', '火風鼎', '雷風恒', '巽為風', '水風井', '山風蠱', '地風升'],
          ['天水訟', '沢水困', '火水未済', '雷水解', '風水渙', '坎為水', '山水蒙', '地水師'],
          ['天山遯', '沢山咸', '火山旅', '雷山小過', '風山漸', '水山蹇', '艮為山', '地山謙'],
          ['天地否', '沢地萃', '火地晋', '雷地豫', '風地観', '水地比', '山地剥', '坤為地']];
let ke_list3 = ['keniten',
 'koniti',
 'suiraityun',
 'sansuimou',
 'suitenzyu',
 'tensuisyou',
 'tisuisi',
 'suitihi',
 'fuutensyoutiku',
 'tentakuri',
 'titentai',
 'tentihi',
 'tenkadouzin',
 'katentaiyuu',
 'tizanken',
 'raitiyo',
 'takuraizui',
 'sanpuuko',
 'titakurin',
 'fuutikan',
 'karaizeigou',
 'sankahi',
 'santihaku',
 'tiraifuku',
 'tenraimumou',
 'santentaitiku',
 'sanraii',
 'takufuutaika',
 'kanisui',
 'riika',
 'takuzankan',
 'raifuukou',
 'tenzanton',
 'raitentaisou',
 'katisin',
 'tikameii',
 'fuukakazin',
 'katakukei',
 'suizanken',
 'raisuikai',
 'santakuson',
 'fuuraieki',
 'takutenkai',
 'tenpuukou',
 'takutisui',
 'tifuusyou',
 'takusuikon',
 'suifuusei',
 'takkakaku',
 'kafuutei',
 'sinirai',
 'gonisan',
 'fuuzanzen',
 'raitakukimai',
 'raikahou',
 'kazanryo',
 'sonifuu',
 'daitaku',
 'fuusuikan',
 'suitakusetu',
 'fuutakutyuufu',
 'raizansyouka',
 'suikakisei',
 'kasuibisei'];
let ke_list4 = ['1_ken',
 '2_kon',
 '3_chun',
 '4_mou',
 '5_ju',
 '6_shou',
 '7_shi',
 '8_hi',
 '9_shouchiku',
 '10_ri',
 '11_tai',
 '12_hi',
 '13_doujin',
 '14_taiyu',
 '15_ken',
 '16_yo',
 '17_zui',
 '18_ko',
 '19_rin',
 '20_kan',
 '21_zeigou',
 '22_hi',
 '23_haku',
 '24_fuku',
 '25_mubo',
 '26_taichiku',
 '27_i',
 '28_taika',
 '29_kan',
 '30_ri',
 '31_kan',
 '32_kou',
 '33_ton',
 '34_taiso',
 '35_shin',
 '36_meii',
 '37_kajin',
 '38_kei',
 '39_ken',
 '40_kai',
 '41_son',
 '42_eki',
 '43_kai',
 '44_kou',
 '45_sui',
 '46_shou',
 '47_kon',
 '48_sei',
 '49_kaku',
 '50_tei',
 '51_shin',
 '52_gon',
 '53_zen',
 '54_kimai',
 '55_hou',
 '56_ryo',
 '57_son',
 '58_da',
 '59_kan',
 '60_setsu',
 '61_chufu',
 '62_shoka',
 '63_kisei',
 '64_bisei'];
let kou_dic=["初","二","三","四","五","上"];

let kou_text=""
if (kou.length>0){
for (let i=0;i<kou.length;i++){
    kou_text=kou_text+" "+kou_dic[kou[i]]
}
kou_text=kou_text+ " 爻変"
}else{kou_text="爻変 無 "}

let table = document.createElement('table');
let thead = document.createElement('thead');
let tbody = document.createElement('tbody');

table.appendChild(thead);
table.appendChild(tbody);

document.getElementById('edit_area').appendChild(table);

let row_1 = document.createElement('tr');
let heading_1 = document.createElement('th');
heading_1.innerHTML = kou_text ;
let heading_2 = document.createElement('th');
heading_2.innerHTML = "易占探究";
let heading_3 = document.createElement('th');
heading_3.innerHTML = "四大都好";
let heading_4 = document.createElement('th');
heading_4.innerHTML = "易経ネット";
let heading_5 = document.createElement('th');
heading_5.innerHTML = "易経独学";

row_1.appendChild(heading_1);
row_1.appendChild(heading_2);
row_1.appendChild(heading_3);
row_1.appendChild(heading_4);
row_1.appendChild(heading_5);
thead.appendChild(row_1);

let h_ue=hatike_decision(honka)[0]
let h_sita=hatike_decision(honka)[1]


let row_2 = document.createElement('tr');
let row_2_data_1 = document.createElement('td');
row_2_data_1.innerHTML = "本卦";
let row_2_data_2 = document.createElement('td');
row_2_data_2.innerHTML = '<a href="https://tankyuu.net/eki/iching'+parseInt(ke_list[h_sita][h_ue])+'.html"target="_blank">'+ke_list2[h_sita][h_ue]+'</a>';
let row_2_data_3 = document.createElement('td');
row_2_data_3.innerHTML = '<a href="https://1percent-better.com/oriental_wisdom/iching/hexagram/'+ke_list4[ke_list[h_sita][h_ue]-1]+'/"target="_blank">'+ke_list2[h_sita][h_ue]+'</a>';
let row_2_data_4 = document.createElement('td');
row_2_data_4.innerHTML = '<a href="https://ekikyo.net/64ka/'+ke_list[h_sita][h_ue]+'.html"target="_blank">'+ke_list2[h_sita][h_ue]+'</a>';
let row_2_data_5 = document.createElement('td');
if (kou.length==1){
row_2_data_5.innerHTML = '<a href="https://ekikyou-dokugaku.com/'+ke_list3[parseInt(ke_list[h_sita][h_ue])-1]+(kou[0]+1)+'.html"target="_blank">'+ke_list2[h_sita][h_ue]+kou_text+'</a>' 
}else{
row_2_data_5.innerHTML = '<a href="https://ekikyou-dokugaku.com/'+ke_list3[parseInt(ke_list[h_sita][h_ue])-1]+'.html"target="_blank">'+ke_list2[h_sita][h_ue]+'</a>';
}

row_2.appendChild(row_2_data_1);
row_2.appendChild(row_2_data_2);
row_2.appendChild(row_2_data_3);
row_2.appendChild(row_2_data_4);
row_2.appendChild(row_2_data_5);
tbody.appendChild(row_2);

let s_ue=hatike_decision(sika)[0]
let s_sita=hatike_decision(sika)[1]

let row_3 = document.createElement('tr');

let row_3_data_1 = document.createElement('td');
row_3_data_1.innerHTML = "之卦";

let row_3_data_2 = document.createElement('td');
let row_3_data_3 = document.createElement('td');
let row_3_data_4 = document.createElement('td');
let row_3_data_5 = document.createElement('td');
if (kou.length>0){
row_3_data_2.innerHTML = '<a href="https://tankyuu.net/eki/iching'+parseInt(ke_list[s_sita][s_ue])+'.html"target="_blank">'+ke_list2[s_sita][s_ue]+'</a>';
row_3_data_3.innerHTML = '<a href="https://1percent-better.com/oriental_wisdom/iching/hexagram/'+ke_list4[ke_list[s_sita][s_ue]-1]+'/"target="_blank">'+ke_list2[s_sita][s_ue]+'</a>';
row_3_data_4.innerHTML = '<a href="https://ekikyo.net/64ka/'+ke_list[s_sita][s_ue]+'.html"target="_blank">'+ke_list2[s_sita][s_ue]+'</a>';
row_3_data_5.innerHTML = '<a href="https://ekikyou-dokugaku.com/'+ke_list3[parseInt(ke_list[s_sita][s_ue])-1]+'.html"target="_blank">'+ke_list2[s_sita][s_ue]+'</a>';
}else{
row_3_data_2.innerHTML = "";
row_3_data_3.innerHTML = "";
row_3_data_4.innerHTML = "";
row_3_data_5.innerHTML = "";
}

row_3.appendChild(row_3_data_1);
row_3.appendChild(row_3_data_2);
row_3.appendChild(row_3_data_3);
row_3.appendChild(row_3_data_4);
row_3.appendChild(row_3_data_5);
tbody.appendChild(row_3);

let g_ue=hatike_decision(goka)[0]
let g_sita=hatike_decision(goka)[1]

let row_4 = document.createElement('tr');
let row_4_data_1 = document.createElement('td');
row_4_data_1.innerHTML = "互卦";
let row_4_data_2 = document.createElement('td');
row_4_data_2.innerHTML = '<a href="https://tankyuu.net/eki/iching'+parseInt(ke_list[g_sita][g_ue])+'.html"target="_blank">'+ke_list2[g_sita][g_ue]+'</a>';
let row_4_data_3 = document.createElement('td');
row_4_data_3.innerHTML = '<a href="https://1percent-better.com/oriental_wisdom/iching/hexagram/'+ke_list4[ke_list[g_sita][g_ue]-1]+'/"target="_blank">'+ke_list2[g_sita][g_ue]+'</a>';
let row_4_data_4 = document.createElement('td');
row_4_data_4.innerHTML = '<a href="https://ekikyo.net/64ka/'+ke_list[g_sita][g_ue]+'.html"target="_blank">'+ke_list2[g_sita][g_ue]+'</a>';
let row_4_data_5 = document.createElement('td');
row_4_data_5.innerHTML = '<a href="https://ekikyou-dokugaku.com/'+ke_list3[parseInt(ke_list[g_sita][g_ue])-1]+'.html"target="_blank">'+ke_list2[g_sita][g_ue]+'</a>';

row_4.appendChild(row_4_data_1);
row_4.appendChild(row_4_data_2);
row_4.appendChild(row_4_data_3);
row_4.appendChild(row_4_data_4);
row_4.appendChild(row_4_data_5);
tbody.appendChild(row_4);

let hi_ue=hatike_decision(hinka)[0]
let hi_sita=hatike_decision(hinka)[1]

let row_5 = document.createElement('tr');
let row_5_data_1 = document.createElement('td');
row_5_data_1.innerHTML = "賓卦";
let row_5_data_2 = document.createElement('td');
row_5_data_2.innerHTML = '<a href="https://tankyuu.net/eki/iching'+parseInt(ke_list[hi_sita][hi_ue])+'.html"target="_blank">'+ke_list2[hi_sita][hi_ue]+'</a>';
let row_5_data_3 = document.createElement('td');
row_5_data_3.innerHTML = '<a href="https://1percent-better.com/oriental_wisdom/iching/hexagram/'+ke_list4[ke_list[hi_sita][hi_ue]-1]+'/"target="_blank">'+ke_list2[hi_sita][hi_ue]+'</a>';
let row_5_data_4 = document.createElement('td');
row_5_data_4.innerHTML = '<a href="https://ekikyo.net/64ka/'+ke_list[hi_sita][hi_ue]+'.html"target="_blank">'+ke_list2[hi_sita][hi_ue]+'</a>';
let row_5_data_5 = document.createElement('td');
row_5_data_5.innerHTML = '<a href="https://ekikyou-dokugaku.com/'+ke_list3[parseInt(ke_list[hi_sita][hi_ue])-1]+'.html"target="_blank">'+ke_list2[hi_sita][hi_ue]+'</a>';

row_5.appendChild(row_5_data_1);
row_5.appendChild(row_5_data_2);
row_5.appendChild(row_5_data_3);
row_5.appendChild(row_5_data_4);
row_5.appendChild(row_5_data_5);
tbody.appendChild(row_5);


let r_ue=hatike_decision(rika)[0]
let r_sita=hatike_decision(rika)[1]

let row_6 = document.createElement('tr');
let row_6_data_1 = document.createElement('td');
row_6_data_1.innerHTML = "裏卦";
let row_6_data_2 = document.createElement('td');
row_6_data_2.innerHTML = '<a href="https://tankyuu.net/eki/iching'+parseInt(ke_list[r_sita][r_ue])+'.html"target="_blank">'+ke_list2[r_sita][r_ue]+'</a>';
let row_6_data_3 = document.createElement('td');
row_6_data_3.innerHTML = '<a href="https://1percent-better.com/oriental_wisdom/iching/hexagram/'+ke_list4[ke_list[r_sita][r_ue]-1]+'/"target="_blank">'+ke_list2[r_sita][r_ue]+'</a>';
let row_6_data_4 = document.createElement('td');
row_6_data_4.innerHTML = '<a href="https://ekikyo.net/64ka/'+ke_list[r_sita][r_ue]+'.html"target="_blank">'+ke_list2[r_sita][r_ue]+'</a>';
let row_6_data_5 = document.createElement('td');
row_6_data_5.innerHTML = '<a href="https://ekikyou-dokugaku.com/'+ke_list3[parseInt(ke_list[r_sita][r_ue])-1]+'.html"target="_blank">'+ke_list2[r_sita][r_ue]+'</a>';

row_6.appendChild(row_6_data_1);
row_6.appendChild(row_6_data_2);
row_6.appendChild(row_6_data_3);
row_6.appendChild(row_6_data_4);
row_6.appendChild(row_6_data_5);
tbody.appendChild(row_6);

// main
}
</script>

</body>
</html>

*1:こういうのは本来どこかで動くように公開するべきなのだろうけれど、スマホ対応とか面倒だからローカル使用