「javascript」を含む日記 RSS

はてなキーワード: javascriptとは

2022-09-03

事業会社の1人Web担当、疲れる

今の会社Web担当になって3年になる。

職業訓練校でhtmlCSSJavascriptを3か月勉強して、自分サイト作ってポートフォリオにして今の会社入社した。

Web制作会社じゃなくて、レンタル業を営む家族経営会社就職した。

ここに就職したのは、面接した社長の息子とフィーリングが合ったからというのと、

小さい会社ゆえに仕事内容が広報とか企画とか多岐に渡っていて、色々な経験ができて楽しそうだと思ったから。

最初は良かった。

高卒、専門卒中心の社員の中で、そこそこ文書作成が得意な私は重宝された。

名目Web担当ではあったものの、同業他社調査報告書まとめてそこから新しいプランを作ったり、

色々やらせてもらえるのはやりがいがあったし、楽しかった。

コロナが来てからも頑張ってた。

お客様減ったけどなんとかやってた。

だけど、最近は本当にお客様がめっきり減った。

コロナ融資の返済も始まったらしい。社長イライラするようになった。

お客様が来ないのはHPがいけないんだ、とHPやり玉にあげられるようになった。

社長からSNS文章センスがないと怒られるようになった。

それと、あんなに渋っていたWeb広告を出すという事で、こちらもやらなくてはいけない。

Webの事は増田さんが担当から

普段仕事に新しいことがのしかかる。

作成した文章文句を付けられる。

暇な店舗販売員が、こうした方が良い、ああした方が良いと言ってくる。

待ってくれ、他にやる事あるから

最近はもうクタクタだし、色々言われて自分の発信にも自信がなくなってきた。

それに、今お客様が来ないのは私の力不足ももちろんあるだろうけど、

現場の流れ作業感というか、店舗ときめかない感じとか、Webだけのせいじゃなくね??という思いも沸々とわき上がる。

社長文章センスがないと言われて、成果も出せなくって、もう私なんか会社にいらない人なのかなって気持ちになる。

やめたら社長人件費が浮いたって喜ぶのかなと思うと切なくなる。

でも冷静に考えて、私がやめたらWeb担当いなくなってSNSWebサイト放置状態になるのでは??

もっとひどい状態になるのでは?

増田さんが辞めてもみんな困らない状態ように、あなた仕事はこの会社のみんなが出来るようにしなさい」、

なんて言う社長には私の仕事の事なんて全然分かんないのだろうけど。

もうさっさと潰れちゃえば明日仕事に行かなくて済むのになって考える自分がいる。

今の会社Web担当は一人しかいない。

経験からやってきたけど、ちゃん仕事教えてくれる上司がいたらまた違ったのかな、なんて思ったり。

ある日「あなたには無理」って社長に言われたように、もう私には無理なんだろう。

斜陽業界の小さなパイコロナ禍で奪い合うなんて、私には道筋が見えない。

もうこの会社もそろそろさようならだ。

その前に会社自体消えるかも。

なんでもいい。とにかく疲れたから休みたい。

2022-08-21

anond:20220821222437

からOSの動きがわからないのにdockerわかりますっていうのがよくわからない。

htmljavascriptしか書きませんっていうならいいけど。

anond:20220821215323

どうしてマジで未だに企業無料講習や職業訓練Javaなんだろうな・・・

PHP(+JavaScript)、Pythonあたりならエントリーレベルでも仕事あるけど、

Javaとかエントリーレベルは開発保守(大抵地獄)しかないやろ

そもそもエントリーレベル到達以前に習得挫折する可能性すらあるやろ・・・

せめて他の言語で慣れてから、あるいはネットワーク周り軽く理解してからはいかんのか?

anond:20220821214902

だよなぁ、馬鹿には来てほしくないよなぁ

サーバー監視オペ入れたらいいなぁぐらいのぼんやりしたビジョンしかないわー

html,css,javascript,Java,DBA,SQL,ネットワーク関係等いろいろやるらしいんで、まあ肌に合うの見つけられればとは思う。

2022-08-20

だれかシャノンラボのReact×Firebaseマンツーマン講座を受講した人いる?

どんな感じでした???

https://shannon-lab.co.jp/?p=9737

React×Firebaseマンツーマン講座

概要

昨今ではFacebookが開発したJavaScriptフレームワーク「React」が注目を集めていますFacebookInstagramAirbnb等の大規模なサービスからプロトタイプまで幅広い現場採用されています

また、GoogleのBaaS(Backend as a Service)「Firebase」が登場し、バックエンドの開発が不要となり、大幅な開発工数の削減が可能となりました。

Reactにフロントエンド、Firebaseをバックエンドとして採用することで、効率的に質の高いWebアプリケーションを開発することが可能になりました。

しかし、ReactやFirebaseは日本語情報も少なく、学ぶ機会も限られています。本講座では、React、Firebaseの基礎からアプリケーションの開発までマンツーマン指導を行います

カリキュラム

ReactとFirebaseの基礎を習得し、演習としてSNSの開発を行うことで理解を深めます

React概要SPA

関数コンポーネントJSX基礎

ステート管理基礎

定番ライブラリ

UIコンポーネントライブラリ

Firebase概要

Authentication基礎と会員機能

Firestore基礎とRDBとの違い

Cloud Storage基礎

Cloud Functions基礎

セキュリティルール

SNS開発演習1

SNS開発演習2

SNS開発演習3

StyleCIによるデプロイ自動化

本講座のメリット

開発からデプロイまで、テストツールを使い実際の開発に限りなく近い環境で学ぶことにより、実践で生きるスキルが身につきます。一人でもアプリの開発ができるようにスキルアップしていけます

講座スケジュール費用

授業時間 週1回1.5時間

受講費 月7万x6ヶ月=42万円+税

期間 2020年10月~2021年3月

'''

アカデミアやめて本当によかった

スペックアラサーIT系人材Web系はだいたい一通り触れてきてフロントエンドバックエンドもある程度できるけどインフラは最低限くらいにしかできない程度に苦手。言語PerlJavaScriptから始まってPHPRubyPythonGoTypeScriptあたりは言語レファレンスを見なくてもある程度は書ける。非WebだとC++とかも一応書けるには書ける。フレームワークで言うとRailsとかDjangoみたいな全部込み込みのものからFlaskとかpeeweeとか選定して作るみたいなレベルまで色々経験してきたし、フロントエンドもnodeとio.js喧嘩してた頃からAngularとかBackboneを経由してReactやVueなんかに触れてきた。某転職サイトでは得意な言語は一通り偏差値65-70で某ポートフォリオサイト技術スコアは3.6くらい。運良く趣味やらバイトやらでWeb系をやってきたから外向きに見せられる実績もある程度あるしエンジニア人材マーケット内でもそこそこ需要があるといった感じ。ずば抜けた才能があるわけではないけどどんな現場でもそれなりにスキルを発揮できる器用貧乏タイプだと思う。

そんなこんなで博士に至るまでIT系スキルを活かしつつだいぶウェット寄りの分野でプログラミングを駆使して色々なことに取り組んでた。民間エンジニア人材としては平々凡々でも周りがプログラミングできない連中だらけのアカデミアの世界では神扱いされてちやほやされた。そんでもてはやされて勘違いして工学じゃなくて科学博士課程に進んだのが間違いの始まりだった。

身バレするのが嫌だから詳細は伏せるけど、まあパワハラアカハラなんて日常茶飯だった。指導教員はまともに指導なんてしないし周りの教員たちも工学的なことばっかやってるのを見て好き勝手言ってきた。正直進む道を間違えたのは自業自得だけど、そのくせ「せっかく進学したのにやめちゃうの?」みたいなこと言って引き留めてくるからタチが悪かった。今からして思えばプログラミングができるレアな便利人材を手放したくなかったんだろうなって感じがする。

そんなこんなで博士の終わりが迫ってくる頃にはアカデミアに対してこれでもかというくらい嫌気が差していたけど、それでもやりたいことがあるから一応就活アカデミア系と民間系で両方やってた。どちらもオファーが来たけど結論から言うとお話にならないくら民間の方が条件が良かった。

まず給料民間が1.5倍以上、アカデミアの技術職との比較だと2倍以上の開きがある。しかもこれは「民間の一番下」と「アカデミアの一番上」を比較した数字でそれぞれ逆をとったら正直目も当てられない。その上福利厚生もさまざまな手当も民間の方が条件がいい。給与の伸び代も民間の方がいいし就労条件も民間の方がいい。そもそもアカデミアでフルリモート可なんて存在しないんだから勝てるわけがないんだけど。その上で民間原則として終身雇用に対してアカデミアは任期付きのポストばかり。就活を始める前からわかってたけどいざ現実として待遇の違いを突きつけられるともはや笑うことしかできなかった。

「それでもアカデミアは自分研究ができるんだからいいじゃないか」と言う意見を目にするけど、結局はPIとして独立するまでは他の先生ラボで雇われになる。その間にうまくやらなきゃ一生そのまま下請け仕事をし続けることになる。そしてたとえ独立できたとして、選択と集中の名の下に文科省にとって都合のいい研究テーマ立案しなければまともに研究費を取ることすらできない。大口予算を取ろうと思ったらいかビッグマウス役人丸め込んでそれっぽいことをやれるかで全てが決まる。

自分が外れ値であることは否定しない。プログラミングが楽しくてWeb系の技術が好きで、可処分時間を使って夢中になって勉強したり色んなものを作って遊んだらして過ごしてきたからこそ今がある。でも正直少しでもプログラミングができるならアカデミアに残るより民間就職した方が待遇ワークライフバランスもいい。きちんとリサーチすればカルチャーだってすごくいい会社はたくさんある。

それを承知の上でアカデミアに残る人は正直すごいと思う。自分がその立場にいることを想像したら気が狂いそうになる。もし似た立場で迷ってる人がいたら心から伝えたい。アカデミアやめて本当によかった。

2022-08-13

プログラマー生産性は人により100倍くらい差があるというけれど

 割りとマジだよねと思う出来事をふと思い出したので書いてみる。

 といっても後輩が俺の思ってもいないところでつまづいて、それに俺がカルチャーショックを受けたというだけの話。

 問題の話なんだけど、とある有名サービスJSON APIを叩いて呼び出し結果を手元のオブジェクトマッピングするというただそれだけのコードを書くというもの

 普通に考えて一日もしないで出来ると思うような代物だけど、三日以上悩んで彼はそれでも出来なかった。

 何があったかというと、その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は叩けるけど、そこでトラブルとどうにもならなくエンジニアにちょくちょく遭遇するんだけど、やっぱりもうちょっと基礎出来てないと駄目だなと思った出来事だった。

 具体的には、再帰が相性が良いプログラムを書けるとか、APIに頼れないときはさっさと自作する頭の切り替えとかもろもろ。

 それと、情報大学出てるのなら、せめて木構造に対してはサクっと再帰関数くらい書けてほしかったなと思う出来事だった。

2022-08-11

anond:20220811214433

言わんとすることは察するが、おとなしく Python をやれ。挫折しにくいから。個人的には Ruby > JavaScript > Python > PHP > Perl だけど。

anond:20220811213201

node.jsやってるけどjavascriptと同じように書いて動くのでどのあたりが難しいかわからんし素のjavascriptと何が違うのかもわからんやで

anond:20220811213647

あぁ。「Javascriptが適切な気がするわ」に対して反論されたと思ったのか。

そういうつもりで言ったんじゃない。

なんで、PythonやらJavaScriptやらRuby初心者向けと勧められちゃうんだろう。

a = 100

puts a

とか打ち込んでぱっと実行結果が見れるから、その瞬間は簡単に思えるけど、20行やら30行やら100行とかちょっと行数が増えるだけでこれらの言語ってJavaやらC#に比べたら格段にコード書くのが難しくなるよね。

初心者が数行程度のコードを書いて「Python簡単じゃん!」と騙されるのはわかるけど、人にどの言語がいいとか勧めてる人ってそこそこコードを書いてる人らだよね。

プログラミング興味ない

書かざるを得ないかコードは書くんだけど、プログラミング自体は何も面白いと思わない。

最新のなんとかフレームワークイケてる!とかそういう話にも全く興味がわかない。

どうにか興味を持てないかと思って、CPUを作ろうみたいな話からSICPなんかのコンピュータサイエンスの基礎理論みたいなものまで勉強してみたりもしたけど、結局どれも興味ねーなってことが分かっただけだった。

しか現代はとにかく猫も杓子もプログラミングコンピュータサイエンスだ。コンピュータ需要が強烈過ぎて何もかもがそれに飲み込まれコンピュータプログラミング楽しい人間が非常に生きやす時代だ。

初心者勉強すべき言語PythonだとかいやCだとかJavascriptだとか、あるいは開発環境はどうするべきだとかなんとか楽しそうに議論してる人たちが羨ましいわ。

anond:20220811213201

ぜんぜんむつかしくないよ。

JavaScriptだし。

anond:20220811210947

javascriptフロントエンド言語

サーバサイドにnode.jsというのがあるが、書き方が難しくて初心者向けじゃなくなる。

と思っている。Byプログラムほとんど書くことがないSE

anond:20220811211429

ブラウザでF12キーを押して「コンソール」を開けばJavascriptコンソールが開いてその場でHELLO WORLDできるんだから楽じゃん?

anond:20220811210806

横だけど最初の一歩ならJavascriptが適切な気がするわ

ブラウザでF12押すだけで最低限の環境が出てくるしさ

プログラミング言語の紹介

初心者Pythonから始めましょう。やりたいことはPythonでだいたいできます世界で一番人気の言語資産豊富にあります低学歴素人がなんと言おうとPythonです。Pythonを覚えるのです。簡単なので1日あれば覚えられるでしょう。

次にSQL勉強しましょう。SQLは3日くらいあれば中級者になれるでしょう。現代データベースはだいたいSQLかそれのパチモンが備わっていますSQLができると仕事の幅が広がるでしょう。

そしてJavaScript勉強しておきましょう。Webブラウザは全部JavaScriptが動きますJavaScript勉強することでWebページで遊ぶことができるようになりますスクレイピングなどの理解も深まりますJavaScriptは便利です。

さて、ここまで来たら仕事必要プログラミングは身についているので次に進む必要は無いです。コンピュータ気持ち理解するためにはC言語をかじってみるのもいいでしょう。大企業で働きたいならJava必須です。型に興味を持ったらOCamlHaskellに手を出してみても良いでしょう。システムプログラミングをしたいならGoやRustも良いです。Goバカみたいに簡単ですがRustは初心者向きではないです。

anond:20220811162216

本気でバカだな。Pythonが一番初心者にとって簡単言語なのに。次点JavaScript。この2つさえやればほぼ全てのアプリができる。

Pythonが初めて学習する言語にいいとかない

GoやらRustやら新しめの有力な言語は静的型の言語

JavascriptTypeScriptが生み出されて、PythonPHPは型宣言が取り入れられて、Rubyも型チェックを取り入れようって話が出てる。

実際にコードを書いてる人らは、動的型の言語なんてやってられんってみんな思ってる。

機械学習をやりたいとかじゃなかったら初心者Pythonやる理由はない。

anond:20220811160052

python, javascript, rubyあたりを初めての言語に勧める人いるけど、やめた方がいいね

上級者向け。

これらの言語簡単と感じるのは、入門書に載ってる数行程度のコードの時だけ。

数十行、数百行程度でもすぐ難易度上がってくる。

初心者C#Javaで、次点VBくらいがおすすめ

2022-08-04

JavaScript界隈は頭が悪い

JavaScript界隈は頭が悪い人が多い。

まずはこの人だ。

https://twitter.com/Rich_Harris/status/1541761871585464323

Svelteの作者として知られる氏であるがスペースでのインデント視覚障害者に良くないと噴き上がっている。インデントをタブにするかスペースにするか、実にどうでも良い昔からある戦争であるが今後スペースを使っていると差別であると氏のようなポリコレ野郎に刺されるかもしれない。

次はこの人だ。

https://twitter.com/andrestaltz/status/1030200563802230786

氏はCycle.js開発者として知られるがblacklistが人種差別であると言い出した最初期の人物である

両氏以外にもJavaScript界隈には頭の悪い人が集まっている。JavaScriptコミュニティは他に比べて圧倒的に#BlackLivesMatterバナードキュメントに付けるのが大好きだ。他の差別は気にしないのに意識の高い偽善者パフォーマンスには精を出す。そして自分達は正義だと思い込み強い言葉で主張する。害悪のような人が本当にたくさんいる。これは本当に悲しいことで、日本勢のプレゼンス向上が望まれる。

2022-08-01

anond:20220731183342

自動安価をつけて返信するプログラムでもこんなに長く複雑になる(一部抜粋) 

/**************************************

以下のCSV_DIR, FILE_PATHS, SETTINGSを書き換えてね。 <h3>o- *************************************/</h3>

//CSVファイルが置かれてるディレクトリパス投稿前にエラー出たら大体ここの設定ミス。 例:"C:\\Users\\sakuraimasahiro\\Documents\\iMacros\\Macros\\rentou\\";

const CSV_DIR =

'C:\\Users\\USER\\Desktop\\iMacros\\Macros\\rentou\\';

//ファイルパスCSV絶対パスで、拡張子必要。iimは相対パスでよく、拡張子不要

const FILE_PATHS = {

//投稿文が書かれたCSVファイル

textCsv: CSV_DIR + 'textNoAnker.csv',

//レス投稿文が書かれたCSV。通常とレス用で分けないなら同じファイルを使えばいい。

replyTextCsv: CSV_DIR + 'textReply.csv',

};

const SETTINGS = {

//投稿後の基本待ち時間

baseWaitTime: 5,

//baseWaitTime+0~waitTimeRange(ランダム)だけ待つ

waitTimeRange: 5,

//連投しすぎだと忠告された場合に処理を一時停止させる時間(秒)

waitTimeForAvoidingPunishment: 60 * 30,

//メール

mail: 'sage',

//名前設定

nameSettings: {

//名前名無しなら''。

name: '',

//以下、偽装ワッチョイ設定。浪人ワッチョイを非表示にしてるときだけtrueにしてね。

//妙なニックネーム(ワッチョイ、アウアウウーなど)をランダムで決めて付加するかどうか。true=付加する。false=付加しない。

nickname: false,

//妙なニックネームの後に付く8桁の文字列ランダムで決めて付加するかどうか。

korokoro: false,

//IPランダムで決めて付加するかどうか。

ip: false,

//地域ランダムで決めて付加するかどうか。

area: false,

},

postSettings: {

//アンカー無し投稿をするならtrue。しないならfalse。noAnkerPostかreplyPostのどちらかはtrueにすること(両方trueでもOK)。

noAnkerPost: false,

//アンカー付き投稿(返信)をするならtrue。しないならfalse。もしnoAnkerPostとreplyPostの両方がtrue場合投稿は返信が優先され、返信対象が見つからなくなったらアンカー無し投稿をする。

replyPost: true,

//最初に取得するアンカー無し投稿CSVファイルの行番号。もし返信用と同じCSVファイルを使うなら-1と入力

noAnkerPostTextCsvStartRow: 1,

//最初に取得する返信用投稿CSVファイルの行番号。もしアンカー無しと同じCSVファイルを使うなら-1と入力

replyPostTextCsvStartRow: 1,

//テキストCSV/返信用テキストCSVの取得行が最終行に達したら最初の行まで戻るかどうか。true=戻る。false=マクロ終了。

textCsvLoop: true,

//返信する場合、これより小さなレス番には返信しない。返信を投稿すると、この数値は前回の返信先のレス番に更新される。

minAnker: 895,

//返信する場合名前に以下の文字列を含む投稿アンカーをつけて返信する(ワッチョイやIPなど名前フィールドにあるものならなんでも可)。配列複数指定可能指定無しなら空配列([])。filterNamesとfilterNamesNotIncluded共に無指定ならレス番1から順に返信していく(minAnkerが設定されてればそこから順に)。以下のfilter系は全て併用可能

filterNames: [],

//↑とは逆に、名前に以下の文字列を含まない投稿アンカーをつけて返信する。↑と併用も可能

filterNamesNotIncluded: [],

//返信する場合、本文に以下の文字列を含む投稿アンカーをつけて返信する。

filterText: ['自演かな', '自演わらわら', 'スクリプト使うの', '安価ガバ', '>>660', '自演擁護', '最後' ,'あいうえお', 'かきくけこ', 'さしすせそ', 'なにぬねの', 'はひふへほ', 'まみむめも', 'やいゆえよ', 'やゆよ', 'らりるれろ', 'わいうえを', 'わをん', 'わいうえをん'],

},

//自分IPアドレス確認VPNとかでIPを変更してマクロを動かしてるとき、突然VPN作動しなくなってIPが元に戻ったときマクロを止めるためのもの

ipSettings: {

//自分現在IPアドレス確認をする。

checkIp: true,

//以下の文字列自分現在IPアドレスに含まれている場合マクロを一時停止する。基本的自分の本当のIPアドレス入力

avoidTheIp: '133.206.99.224',

},

//浪人設定。最後動作確認したのは5年くらい前で、今も同じように動作するかは、浪人を持ってないか確認できずわからない。

roninSettings: {

//浪人ログインしてるかどうかをチェックするかどうか。trueらするfalseならしない。trueにしていてもし浪人ログインしていないことを確認したらログインしにいく。

checkLogin: false,

//浪人ログインメールアドレス

mailAdress: 'abc@def.com',

//浪人ログインパスワード

password: '1234',

},

//false: run()実行させず(デバッグ用)

run: true,

//true: 投稿処理だけしない デバッグ

skipPost: false,

};

/**************************************

設定箇所終わり。

書き込めない時の早見表 - 5ちゃんねるwiki

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>

/**

* ここから始まる。

*/

function run() {

//設定ミスがないか調べる。

checkSettings();

var _TextCsvCursors = new TextCsvCursors(

new TextCsvCursor(

SETTINGS.postSettings.noAnkerPostTextCsvStartRow > 0

? SETTINGS.postSettings.noAnkerPostTextCsvStartRow - 1

: SETTINGS.postSettings.noAnkerPostTextCsvStartRow,

FILE_PATHS.textCsv,

SETTINGS.postSettings.textCsvLoop,

),

new TextCsvCursor(

SETTINGS.postSettings.replyPostTextCsvStartRow > 0

? SETTINGS.postSettings.replyPostTextCsvStartRow - 1

: SETTINGS.postSettings.replyPostTextCsvStartRow,

FILE_PATHS.replyTextCsv,

SETTINGS.postSettings.textCsvLoop,

),

);

var _LoopStatuses = new LoopStatuses(0, SETTINGS.postSettings.minAnker);

const _MyPosterName = new MyPosterName({

name: SETTINGS.nameSettings.name,

});

//スレURL指定

const _ThreadUrl = openPromptThreadUrl();

//ループ

while (true) {

//IP確認する設定なら、それをする。

SETTINGS.ipSettings.checkIp && checkCurrentIpNotTheIp();

//スレを開く

openUrl(_ThreadUrl.fullUrlHttps());

//浪人ログインする設定なら、浪人ログインしているかどうかを確認し、していなければログインしにいく。

if (SETTINGS.roninSettings.checkLogin) {

if (!checkRoninLogin()) {

loginRonin();

continue;

}

}

//投稿に使うテキスト取得。

const p = (function () {

if (SETTINGS.postSettings.replyPost) {

//返信あり設定の場合。返信対象が無いか調べる。

const targetAnkerNumber = createPostDOMList()

.filterPostnumberHigher(_LoopStatuses.currentMinAnker())

.filterByPostername(SETTINGS.postSettings.filterNames)

.filterByPosternameNotIncluded(

SETTINGS.postSettings.filterNamesNotIncluded,

)

.filterByText(SETTINGS.postSettings.filterText)

.lowestPostNumber();

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) {

//投稿

postThenCheckError(

_ThreadUrl.serverName(),

_MyPosterName.randomize({

nickname: SETTINGS.nameSettings.nickname,

korokoro: SETTINGS.nameSettings.korokoro,

ip: SETTINGS.nameSettings.ip,

area: SETTINGS.nameSettings.area,

}),

SETTINGS.mail,

p.text,

);

//_TextCsvCursorsと_LoopStatusesを更新

_TextCsvCursors = p.updatedTextCsvCursors;

_LoopStatuses = p.updatedLoopStatuses.incrementPostCount();

messageDisplay([

`投稿回数: ${_LoopStatuses.currentPostCount()}`,

`minAnker: ${_LoopStatuses.currentMinAnker()}`,

`今回アンカー無し投稿取得行: ${_TextCsvCursors.currentRows().noAnker}`,

`今回アンカー有り投稿取得行: ${_TextCsvCursors.currentRows().reply}`,

]);

} else {

messageDisplay([

`返信対象が現われるのを待機中...。`,

`投稿回数: ${_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 メール

* @param {MyText} _MyText

* @param {number} retryTimes

* @returns {void}}

*/

function postThenCheckError(

serverName,

_MyPosterName,

postMail,

_MyText,

retryTimes = 0,

) {

const r =

retryTimes === 0

? new ValuesOfPost(serverName, _MyPosterName, postMail, _MyText).post(

postTo5chTread,

postConfirm,

)

: new ValuesOfPost(

serverName,

_MyPosterName,

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();

return postThenCheckError(

serverName,

_MyPosterName,

postMail,

_MyText,

retryTimes + 1,

);

} else if (error.order === 'WAIT') {

wait(SETTINGS.waitTimeForAvoidingPunishment);

return postThenCheckError(

serverName,

_MyPosterName,

postMail,

_MyText,

retryTimes,

);

} else if (error.order === 'LOGIN') {

//動作未確認

return postThenCheckError(

serverName,

_MyPosterName,

postMail,

_MyText,

retryTimes,

);

}

return;

}

/**

* 現在IPアドレスに、SETTINGS.ipSettings.avoidTheIpの値が含まれていないことを確認する。含まれていたらマクロを一時停止。

* @returns

*/

function checkCurrentIpNotTheIp() {

//IP確認ページへ飛ぶ

openUrl('https://www.cman.jp/network/support/go_access.cgi');

const _IpAdress = createIpAdressFromCMan();

if (_IpAdress.includes(SETTINGS.ipSettings.avoidTheIp)) {

pause('現在IP指定した値が含まれていることを確認。');

//ポーズ解除したならもう一度確認しに。

checkCurrentIpNotTheIp();

}

return;

}

/**

* 設定に致命的な問題が無いか検査

* @returns

*/

function checkSettings() {

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を受け取る。

* @returns {ThreadUrl}

*/

function openPromptThreadUrl() {

const url = prompt('スレURL入力');

return new ThreadUrl(url);

}

/**

* 開いてるスレレス全て読み取ってPostListインスタンスを作って返す。

* 重すぎるので使うのやめ。どうやらインスタンスの大量生成が原因な模様。

* createPostDOMListを使う。

* @returns {PostList}

*/

function createPostList() {

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');

var arrPostDOMList = [];

for (let index = 0; index < posts.length; index++) {

//HTMLCollectionからElementを1つずつ抽出して配列に。

arrPostDOMList.push(posts.item(index));

}

return new PostDOMList(arrPostDOMList);

}

/**

* 開いてる投稿結果画面に表示されてるエラーを読み取ってPostErrorMessageインスタンスを作って返す。

* @returns {PostErrorMessage}

*/

function createPostErrorMessage() {

return new PostErrorMessage(

window.document

.g Permalink | 記事への反応(0) | 15:40

ログイン ユーザー登録
ようこそ ゲスト さん