はてなキーワード: javascriptとは
職業訓練校でhtml、CSS、Javascriptを3か月勉強して、自分でサイト作ってポートフォリオにして今の会社に入社した。
Web制作会社じゃなくて、レンタル業を営む家族経営の会社に就職した。
ここに就職したのは、面接した社長の息子とフィーリングが合ったからというのと、
小さい会社ゆえに仕事内容が広報とか企画とか多岐に渡っていて、色々な経験ができて楽しそうだと思ったから。
最初は良かった。
高卒、専門卒中心の社員の中で、そこそこ文書作成が得意な私は重宝された。
名目上Web担当ではあったものの、同業他社の調査報告書まとめてそこから新しいプランを作ったり、
お客様減ったけどなんとかやってた。
コロナ融資の返済も始まったらしい。社長はイライラするようになった。
お客様が来ないのはHPがいけないんだ、とHPがやり玉にあげられるようになった。
それと、あんなに渋っていたWeb広告を出すという事で、こちらもやらなくてはいけない。
暇な店舗の販売員が、こうした方が良い、ああした方が良いと言ってくる。
待ってくれ、他にやる事あるから。
最近はもうクタクタだし、色々言われて自分の発信にも自信がなくなってきた。
それに、今お客様が来ないのは私の力不足ももちろんあるだろうけど、
現場の流れ作業感というか、店舗にときめかない感じとか、Webだけのせいじゃなくね??という思いも沸々とわき上がる。
社長に文章のセンスがないと言われて、成果も出せなくって、もう私なんか会社にいらない人なのかなって気持ちになる。
やめたら社長は人件費が浮いたって喜ぶのかなと思うと切なくなる。
でも冷静に考えて、私がやめたらWeb担当いなくなってSNSもWebサイトも放置状態になるのでは??
「増田さんが辞めてもみんな困らない状態ように、あなたの仕事はこの会社のみんなが出来るようにしなさい」、
なんて言う社長には私の仕事の事なんて全然分かんないのだろうけど。
もうさっさと潰れちゃえば明日仕事に行かなくて済むのになって考える自分がいる。
未経験からやってきたけど、ちゃんと仕事教えてくれる上司がいたらまた違ったのかな、なんて思ったり。
ある日「あなたには無理」って社長に言われたように、もう私には無理なんだろう。
どんな感じでした???
https://shannon-lab.co.jp/?p=9737
昨今ではFacebookが開発したJavaScriptフレームワーク「React」が注目を集めています。Facebook、Instagram、Airbnb等の大規模なサービスから、プロトタイプまで幅広い現場で採用されています。
また、GoogleのBaaS(Backend as a Service)「Firebase」が登場し、バックエンドの開発が不要となり、大幅な開発工数の削減が可能となりました。
Reactにフロントエンド、Firebaseをバックエンドとして採用することで、効率的に質の高いWebアプリケーションを開発することが可能になりました。
しかし、ReactやFirebaseは日本語の情報も少なく、学ぶ機会も限られています。本講座では、React、Firebaseの基礎からアプリケーションの開発までマンツーマンで指導を行います。
ReactとFirebaseの基礎を習得し、演習としてSNSの開発を行うことで理解を深めます。
Authentication基礎と会員機能
Firestore基礎とRDBとの違い
Cloud Storage基礎
Cloud Functions基礎
SNS開発演習1
SNS開発演習2
SNS開発演習3
本講座のメリット
開発からデプロイまで、テストツールを使い実際の開発に限りなく近い環境で学ぶことにより、実践で生きるスキルが身につきます。一人でもアプリの開発ができるようにスキルアップしていけます。
受講費 月7万x6ヶ月=42万円+税
'''
スペックはアラサーのIT系人材。Web系はだいたい一通り触れてきてフロントエンドもバックエンドもある程度できるけどインフラは最低限くらいにしかできない程度に苦手。言語はPerlとJavaScriptから始まってPHP、Ruby、Python、Go、TypeScriptあたりは言語レファレンスを見なくてもある程度は書ける。非WebだとC++とかも一応書けるには書ける。フレームワークで言うとRailsとかDjangoみたいな全部込み込みのものからFlaskとかpeeweeとか選定して作るみたいなレベルまで色々経験してきたし、フロントエンドもnodeとio.jsが喧嘩してた頃からAngularとかBackboneを経由してReactやVueなんかに触れてきた。某転職サイトでは得意な言語は一通り偏差値65-70で某ポートフォリオサイトの技術力スコアは3.6くらい。運良く趣味やらバイトやらでWeb系をやってきたから外向きに見せられる実績もある程度あるしエンジニア人材マーケット内でもそこそこ需要があるといった感じ。ずば抜けた才能があるわけではないけどどんな現場でもそれなりにスキルを発揮できる器用貧乏タイプだと思う。
そんなこんなで博士に至るまでIT系のスキルを活かしつつだいぶウェット寄りの分野でプログラミングを駆使して色々なことに取り組んでた。民間のエンジニア人材としては平々凡々でも周りがプログラミングできない連中だらけのアカデミアの世界では神扱いされてちやほやされた。そんでもてはやされて勘違いして工学じゃなくて科学の博士課程に進んだのが間違いの始まりだった。
身バレするのが嫌だから詳細は伏せるけど、まあパワハラアカハラなんて日常茶飯だった。指導教員はまともに指導なんてしないし周りの教員たちも工学的なことばっかやってるのを見て好き勝手言ってきた。正直進む道を間違えたのは自業自得だけど、そのくせ「せっかく進学したのにやめちゃうの?」みたいなこと言って引き留めてくるからタチが悪かった。今からして思えばプログラミングができるレアな便利人材を手放したくなかったんだろうなって感じがする。
そんなこんなで博士の終わりが迫ってくる頃にはアカデミアに対してこれでもかというくらい嫌気が差していたけど、それでもやりたいことがあるから一応就活はアカデミア系と民間系で両方やってた。どちらもオファーが来たけど結論から言うとお話にならないくらい民間の方が条件が良かった。
まず給料は民間が1.5倍以上、アカデミアの技術職との比較だと2倍以上の開きがある。しかもこれは「民間の一番下」と「アカデミアの一番上」を比較した数字でそれぞれ逆をとったら正直目も当てられない。その上福利厚生もさまざまな手当も民間の方が条件がいい。給与の伸び代も民間の方がいいし就労条件も民間の方がいい。そもそもアカデミアでフルリモート可なんて存在しないんだから勝てるわけがないんだけど。その上で民間は原則として終身雇用に対してアカデミアは任期付きのポストばかり。就活を始める前からわかってたけどいざ現実として待遇の違いを突きつけられるともはや笑うことしかできなかった。
「それでもアカデミアは自分の研究ができるんだからいいじゃないか」と言う意見を目にするけど、結局はPIとして独立するまでは他の先生のラボで雇われになる。その間にうまくやらなきゃ一生そのまま下請け仕事をし続けることになる。そしてたとえ独立できたとして、選択と集中の名の下に文科省にとって都合のいい研究テーマを立案しなければまともに研究費を取ることすらできない。大口の予算を取ろうと思ったらいかにビッグマウスで役人を丸め込んでそれっぽいことをやれるかで全てが決まる。
自分が外れ値であることは否定しない。プログラミングが楽しくてWeb系の技術が好きで、可処分時間を使って夢中になって勉強したり色んなものを作って遊んだらして過ごしてきたからこそ今がある。でも正直少しでもプログラミングができるならアカデミアに残るより民間に就職した方が待遇もワークライフバランスもいい。きちんとリサーチすればカルチャーだってすごくいい会社はたくさんある。
それを承知の上でアカデミアに残る人は正直すごいと思う。自分がその立場にいることを想像したら気が狂いそうになる。もし似た立場で迷ってる人がいたら心から伝えたい。アカデミアやめて本当によかった。
割りとマジだよねと思う出来事をふと思い出したので書いてみる。
といっても後輩が俺の思ってもいないところでつまづいて、それに俺がカルチャーショックを受けたというだけの話。
問題の話なんだけど、とある有名サービスのJSON APIを叩いて呼び出し結果を手元のオブジェクトにマッピングするというただそれだけのコードを書くというもの。
普通に考えて一日もしないで出来ると思うような代物だけど、三日以上悩んで彼はそれでも出来なかった。
{ ..., "count": 10000000000000000000000000000000000000, ...}
という感じで多倍長整数がリテラルとして書かれているのを前提として受け取る仕様だった。
JavaScriptの通常の整数と違って、JSONの整数リテラルは仕様上大きさの制限の記載がないので、上のようなのも合法。
で、彼の使ってたプログラミング言語のオブジェクト から JSONの変換ライブラリが、多倍長整数を文字列("")としてシリアライズするような仕様なことがわかって、彼は行き詰まった。
そこで何をやり始めたかというと、JSONの整数がそのまま1000000000000000みたいにシリアライズされるライブラリ探し始めたんだけど、それは見つからないまま。
というわけで「増田さん、詰まってるんですけど……」と言われて助け舟出すことになったはいいものの、彼のコード見るとJSONの抽象構文木クラスがそのまま使えるようだった。
なので、
String serialiaze(Ast.JsValue value) { return switch(value) { case Ast.JsNull nullValue-> "null"; case Ast.JsInt bigIntValue -> bigIntValue.toString(); case Ast.JsArray arrayValue -> arrayValue.stream().map(v -> serialize(v)).collect(Collectors.joining(", ", "[", "]")); // 他のJSONの木についても同様に処理 default -> throw new RuntimeException("cannot reach") }; }
1時間しない内にこんな感じのコード(言語はJavaじゃなかったけど、だいたいこういう感じ)を書いて無事問題解決。細かいタイポとかあるかもだけど、日記では確認してないのでそれはおいといて)。
結局、JSONの形が期待と違って、しかも既存のAPIじゃいいのがなかったのに延々API探すことしか出来なかったのが問題解決できなかった原因だけど、このくらいのは割りとちょこちょこある。
きっと、それから一週間放置しても問題解決できなかっただろうし、どうも同じチームの同僚も問題を解決できなかったようだった。
最近、APIは叩けるけど、そこでトラブルとどうにもならなくエンジニアにちょくちょく遭遇するんだけど、やっぱりもうちょっと基礎出来てないと駄目だなと思った出来事だった。
言わんとすることは察するが、おとなしく Python をやれ。挫折しにくいから。個人的には Ruby > JavaScript > Python > PHP > Perl だけど。
node.jsやってるけどjavascriptと同じように書いて動くのでどのあたりが難しいかもわからんし素のjavascriptと何が違うのかもわからんやで
なんで、PythonやらJavaScriptやらRubyが初心者向けと勧められちゃうんだろう。
a = 100
puts a
とか打ち込んでぱっと実行結果が見れるから、その瞬間は簡単に思えるけど、20行やら30行やら100行とかちょっと行数が増えるだけでこれらの言語ってJavaやらC#に比べたら格段にコード書くのが難しくなるよね。
初心者が数行程度のコードを書いて「Python簡単じゃん!」と騙されるのはわかるけど、人にどの言語がいいとか勧めてる人ってそこそこコードを書いてる人らだよね。
書かざるを得ないからコードは書くんだけど、プログラミング自体は何も面白いと思わない。
最新のなんとかフレームワークがイケてる!とかそういう話にも全く興味がわかない。
どうにか興味を持てないかと思って、CPUを作ろうみたいな話からSICPなんかのコンピュータサイエンスの基礎理論みたいなものまで勉強してみたりもしたけど、結局どれも興味ねーなってことが分かっただけだった。
しかし現代はとにかく猫も杓子もプログラミングとコンピュータサイエンスだ。コンピュータの需要が強烈過ぎて何もかもがそれに飲み込まれ、コンピュータとプログラミングが楽しい人間が非常に生きやすい時代だ。
初心者が勉強すべき言語はPythonだとかいやCだとかJavascriptだとか、あるいは開発環境はどうするべきだとかなんとか楽しそうに議論してる人たちが羨ましいわ。
ブラウザでF12キーを押して「コンソール」を開けばJavascriptコンソールが開いてその場でHELLO WORLDできるんだから楽じゃん?
初心者はPythonから始めましょう。やりたいことはPythonでだいたいできます。世界で一番人気の言語で資産も豊富にあります。低学歴の素人がなんと言おうとPythonです。Pythonを覚えるのです。簡単なので1日あれば覚えられるでしょう。
次にSQLを勉強しましょう。SQLは3日くらいあれば中級者になれるでしょう。現代のデータベースはだいたいSQLかそれのパチモンが備わっています。SQLができると仕事の幅が広がるでしょう。
そしてJavaScriptは勉強しておきましょう。Webブラウザは全部JavaScriptが動きます。JavaScriptを勉強することでWebページで遊ぶことができるようになります。スクレイピングなどの理解も深まります。JavaScriptは便利です。
さて、ここまで来たら仕事に必要なプログラミングは身についているので次に進む必要は無いです。コンピュータの気持ちを理解するためにはC言語をかじってみるのもいいでしょう。大企業で働きたいならJavaは必須です。型に興味を持ったらOCamlやHaskellに手を出してみても良いでしょう。システムプログラミングをしたいならGoやRustも良いです。Goはバカみたいに簡単ですがRustは初心者向きではないです。
本気でバカだな。Pythonが一番初心者にとって簡単な言語なのに。次点でJavaScript。この2つさえやればほぼ全てのアプリができる。
JavaScript界隈は頭が悪い人が多い。
まずはこの人だ。
https://twitter.com/Rich_Harris/status/1541761871585464323
Svelteの作者として知られる氏であるがスペースでのインデントは視覚障害者に良くないと噴き上がっている。インデントをタブにするかスペースにするか、実にどうでも良い昔からある戦争であるが今後スペースを使っていると差別であると氏のようなポリコレ野郎に刺されるかもしれない。
次はこの人だ。
https://twitter.com/andrestaltz/status/1030200563802230786
氏はCycle.js開発者として知られるがblacklistが人種差別であると言い出した最初期の人物である。
両氏以外にもJavaScript界隈には頭の悪い人が集まっている。JavaScriptコミュニティは他に比べて圧倒的に#BlackLivesMatterバナーをドキュメントに付けるのが大好きだ。他の差別は気にしないのに意識の高い偽善者パフォーマンスには精を出す。そして自分達は正義だと思い込み強い言葉で主張する。害悪のような人が本当にたくさんいる。これは本当に悲しいことで、日本勢のプレゼンス向上が望まれる。
自動で安価をつけて返信するプログラムでもこんなに長く複雑になる(一部抜粋)
/**************************************
以下のCSV_DIR, FILE_PATHS, SETTINGSを書き換えてね。 <h3>o- *************************************/</h3>
//CSVファイルが置かれてるディレクトリのパス。投稿前にエラー出たら大体ここの設定ミス。 例:"C:\\Users\\sakuraimasahiro\\Documents\\iMacros\\Macros\\rentou\\";
'C:\\Users\\USER\\Desktop\\iMacros\\Macros\\rentou\\';
//ファイルのパス。CSVは絶対パスで、拡張子も必要。iimは相対パスでよく、拡張子不要。
const FILE_PATHS = {
textCsv: CSV_DIR + 'textNoAnker.csv',
//レス用投稿文が書かれたCSV。通常とレス用で分けないなら同じファイルを使えばいい。
replyTextCsv: CSV_DIR + 'textReply.csv',
};
baseWaitTime: 5,
//baseWaitTime+0~waitTimeRange(ランダム)だけ待つ
waitTimeRange: 5,
//連投しすぎだと忠告された場合に処理を一時停止させる時間(秒)
waitTimeForAvoidingPunishment: 60 * 30,
//メール
mail: 'sage',
//名前設定
name: '',
//以下、偽装ワッチョイ設定。浪人でワッチョイを非表示にしてるときだけtrueにしてね。
//妙なニックネーム(ワッチョイ、アウアウウーなど)をランダムで決めて付加するかどうか。true=付加する。false=付加しない。
//妙なニックネームの後に付く8桁の文字列をランダムで決めて付加するかどうか。
},
//アンカー無し投稿をするならtrue。しないならfalse。noAnkerPostかreplyPostのどちらかはtrueにすること(両方trueでもOK)。
//アンカー付き投稿(返信)をするならtrue。しないならfalse。もしnoAnkerPostとreplyPostの両方がtrueの場合、投稿は返信が優先され、返信対象が見つからなくなったらアンカー無し投稿をする。
//最初に取得するアンカー無し投稿文CSVファイルの行番号。もし返信用と同じCSVファイルを使うなら-1と入力。
noAnkerPostTextCsvStartRow: 1,
//最初に取得する返信用投稿文CSVファイルの行番号。もしアンカー無しと同じCSVファイルを使うなら-1と入力。
//テキストCSV/返信用テキストCSVの取得行が最終行に達したら最初の行まで戻るかどうか。true=戻る。false=マクロ終了。
//返信する場合、これより小さなレス番には返信しない。返信を投稿すると、この数値は前回の返信先のレス番に更新される。
minAnker: 895,
//返信する場合、名前に以下の文字列を含む投稿にアンカーをつけて返信する(ワッチョイやIPなど名前フィールドにあるものならなんでも可)。配列で複数指定可能。指定無しなら空配列([])。filterNamesとfilterNamesNotIncluded共に無指定ならレス番1から順に返信していく(minAnkerが設定されてればそこから順に)。以下のfilter系は全て併用可能。
//↑とは逆に、名前に以下の文字列を含まない投稿にアンカーをつけて返信する。↑と併用も可能。
//返信する場合、本文に以下の文字列を含む投稿にアンカーをつけて返信する。
filterText: ['自演かな', '自演わらわら', 'スクリプト使うの', '安価ガバ', '>>660', '自演で擁護', '最後' ,'あいうえお', 'かきくけこ', 'さしすせそ', 'なにぬねの', 'はひふへほ', 'まみむめも', 'やいゆえよ', 'やゆよ', 'らりるれろ', 'わいうえを', 'わをん', 'わいうえをん'],
},
//自分のIPアドレスの確認。VPNとかでIPを変更してマクロを動かしてるとき、突然VPNが作動しなくなってIPが元に戻ったときにマクロを止めるためのもの。
//以下の文字列が自分の現在のIPアドレスに含まれている場合、マクロを一時停止する。基本的に自分の本当のIPアドレスを入力。
},
//浪人設定。最後に動作を確認したのは5年くらい前で、今も同じように動作するかは、浪人を持ってないから確認できずわからない。
//浪人にログインしてるかどうかをチェックするかどうか。trueならする。falseならしない。trueにしていてもし浪人にログインしていないことを確認したらログインしにいく。
password: '1234',
},
};
/**************************************
設定箇所終わり。
https://info.5ch.net/index.php/%E6%9B%B8%E3%81%8D%E8%BE%BC%E3%82%81%E3%81%AA%E3%81%84%E6%99%82%E3%81%AE%E6%97%A9%E8%A6%8B%E8%A1%A8 <h3>o- *************************************/</h3>
/**************************************
・NULL演算子(??)は使えない。論理積(&&)は使える。
・オブジェクトの分割代入はできない。
・importはできない。 <h3>o- *************************************/</h3>
/**************************************
関数 <h3>o- *************************************/</h3>
/**
* ここから始まる。
*/
checkSettings();
var _TextCsvCursors = new TextCsvCursors(
SETTINGS.postSettings.noAnkerPostTextCsvStartRow > 0
? SETTINGS.postSettings.noAnkerPostTextCsvStartRow - 1
: SETTINGS.postSettings.noAnkerPostTextCsvStartRow,
SETTINGS.postSettings.textCsvLoop,
),
SETTINGS.postSettings.replyPostTextCsvStartRow > 0
? SETTINGS.postSettings.replyPostTextCsvStartRow - 1
: SETTINGS.postSettings.replyPostTextCsvStartRow,
SETTINGS.postSettings.textCsvLoop,
),
);
var _LoopStatuses = new LoopStatuses(0, SETTINGS.postSettings.minAnker);
const _MyPosterName = new MyPosterName({
name: SETTINGS.nameSettings.name,
});
const _ThreadUrl = openPromptThreadUrl();
//ループ
while (true) {
SETTINGS.ipSettings.checkIp && checkCurrentIpNotTheIp();
//スレを開く
openUrl(_ThreadUrl.fullUrlHttps());
//浪人にログインする設定なら、浪人にログインしているかどうかを確認し、していなければログインしにいく。
if (SETTINGS.roninSettings.checkLogin) {
}
}
if (SETTINGS.postSettings.replyPost) {
const targetAnkerNumber = createPostDOMList()
.filterPostnumberHigher(_LoopStatuses.currentMinAnker())
.filterByPostername(SETTINGS.postSettings.filterNames)
.filterByPosternameNotIncluded(
SETTINGS.postSettings.filterNamesNotIncluded,
)
.filterByText(SETTINGS.postSettings.filterText)
if (targetAnkerNumber !== null) {
const r = _TextCsvCursors.takeNextRowTextAsReply(targetAnkerNumber);
messageDisplay(`返信対象有り。アンカー先: ${targetAnkerNumber}`);
return {
...r,
updatedLoopStatuses:
_LoopStatuses.updateMinAnker(targetAnkerNumber),
};
}
}
if (SETTINGS.postSettings.noAnkerPost) {
//返信対象無し、或いは返信しない設定の場合。アンカー無し投稿文を作る。
const r = _TextCsvCursors.takeNextRowTextAsNoAnker();
messageDisplay('返信対象無し。アンカー無し投稿。');
return {
...r,
updatedLoopStatuses: _LoopStatuses,
};
}
return null;
})();
if (p) {
//投稿。
nickname: SETTINGS.nameSettings.nickname,
korokoro: SETTINGS.nameSettings.korokoro,
area: SETTINGS.nameSettings.area,
}),
SETTINGS.mail,
p.text,
);
//_TextCsvCursorsと_LoopStatusesを更新。
_TextCsvCursors = p.updatedTextCsvCursors;
_LoopStatuses = p.updatedLoopStatuses.incrementPostCount();
`投稿回数: ${_LoopStatuses.currentPostCount()}`,
`minAnker: ${_LoopStatuses.currentMinAnker()}`,
`今回アンカー無し投稿取得行: ${_TextCsvCursors.currentRows().noAnker}`,
`今回アンカー有り投稿取得行: ${_TextCsvCursors.currentRows().reply}`,
]);
} else {
`返信対象が現われるのを待機中...。`,
`投稿回数: ${_LoopStatuses.currentPostCount()}`,
`minAnker: ${_LoopStatuses.currentMinAnker()}`,
`今回アンカー無し投稿取得行: ${_TextCsvCursors.currentRows().noAnker}`,
`今回アンカー有り投稿取得行: ${_TextCsvCursors.currentRows().reply}`,
]);
}
wait(SETTINGS.baseWaitTime + randomRange(0, SETTINGS.waitTimeRange));
}
}
/**
* 投稿処理と投稿結果を見てリトライしたりマクロ終了したり。
* @param {string} serverName サーバー名
* @param {MyPosterName} _MyPosterName
* @param {string} postMail メール
*/
serverName,
postMail,
_MyText,
retryTimes = 0,
) {
const r =
retryTimes === 0
? new ValuesOfPost(serverName, _MyPosterName, postMail, _MyText).post(
postTo5chTread,
)
serverName,
postMail,
_MyText,
).postSubstring(retryTimes, postTo5chTread, postConfirm);
if (r) {
back();
return;
}
wait(7);
const error = createPostErrorMessage().analyze();
messageDisplay(error.message);
if (error.order === 'KILL') {
kill();
} else if (error.order === 'SKIP') {
return;
} else if (error.order === 'TRUNCATE') {
back();
serverName,
postMail,
_MyText,
retryTimes + 1,
);
} else if (error.order === 'WAIT') {
wait(SETTINGS.waitTimeForAvoidingPunishment);
serverName,
postMail,
_MyText,
retryTimes,
);
} else if (error.order === 'LOGIN') {
serverName,
postMail,
_MyText,
retryTimes,
);
}
return;
}
/**
* 現在のIPアドレスに、SETTINGS.ipSettings.avoidTheIpの値が含まれていないことを確認する。含まれていたらマクロを一時停止。
* @returns
*/
function checkCurrentIpNotTheIp() {
openUrl('https://www.cman.jp/network/support/go_access.cgi');
const _IpAdress = createIpAdressFromCMan();
if (_IpAdress.includes(SETTINGS.ipSettings.avoidTheIp)) {
pause('現在のIPに指定した値が含まれていることを確認。');
}
return;
}
/**
* @returns
*/
if (
SETTINGS.postSettings.noAnkerPost === false &&
SETTINGS.postSettings.replyPost === false
) {
return kill('設定エラー。noAnkerPostとreplyPost両方ともfalseになってる。');
}
if (
SETTINGS.postSettings.noAnkerPostTextCsvStartRow < 0 &&
SETTINGS.postSettings.replyPostTextCsvStartRow < 0
) {
return kill(
'設定エラー。noAnkerPostTextCsvStartRowとreplyPostTextCsvStartRow両方とも-1になってる。',
);
}
if (
SETTINGS.postSettings.noAnkerPostTextCsvStartRow === 0 ||
SETTINGS.postSettings.replyPostTextCsvStartRow === 0
) {
return kill(
'設定エラー。noAnkerPostTextCsvStartRow/replyPostTextCsvStartRowの初期値は-1或いは1以上で。',
);
}
}
/**
* 入力フォームを表示して入力されたスレのURLを受け取る。
*/
function openPromptThreadUrl() {
const url = prompt('スレURLを入力');
}
/**
* 開いてるスレのレス全て読み取ってPostListインスタンスを作って返す。
* 重すぎるので使うのやめ。どうやらインスタンスの大量生成が原因な模様。
*/
const posts = window.document.getElementsByClassName('post');
return new PostList(Array.from(posts).map((e) => new Post(e)));
}
/**
* 開いてるスレのレス全て取得してPostDOMListに格納して返す。
* @returns
*/
function createPostDOMList() {
const posts = window.document.getElementsByClassName('post');
for (let index = 0; index < posts.length; index++) {
//HTMLCollectionからElementを1つずつ抽出して配列に。
arrPostDOMList.push(posts.item(index));
}
return new PostDOMList(arrPostDOMList);
}
/**
* 開いてる投稿結果画面に表示されてるエラーを読み取ってPostErrorMessageインスタンスを作って返す。
*/
function createPostErrorMessage() {
window.document