日記

日本語の勉強のためのブログ

【JS】NodeList内の要素をforEachで操作する

忘れないうちにメモ。

目的

twitterのいいね数を非表示にしたい

思いついた方法

document.querySelectorAllで複数ツイートのいいね数の表示領域を指定し、得たNodeList内の各要素を非表示にする。

詳細

document.querySelectorAllについては過去に触れたことがあるので、その経験を活かして、複数ツイートのいいね数の表示領域を指定するところまではできた。リプライ/リツイート/いいね数の表示領域はrole属性(role="group")のついたdivタグにまとめられていたので、それをquerySelectorAllに与えればよい。
問題はそれで受け取ったNodeListの処理であるが、forEachメソッドを使うことで、各要素に対してstyle.display="none"と変更できた。

コード

document.querySelectorAll('div[role="group"]').forEach(
    function(currentValue) {  // currentValueは現在NodeListで処理されている要素
        currentValue.style.display = "none";
    }
);

結果

現在ブラウザ上で見えている範囲についてはいいね数を非表示にできるが、スクロールしていくと普通に表示されてしまっている。失敗である。

参考資料

developer.mozilla.org

その他

JQueryを使えば簡単にクエリセレクタを扱えるらしい。正直触れたことがないのでわからないが、今後調べてみようと思う。

海外IPと誤判定されAbemaTVが見られなかったときの話

1年ほど前の話になるが、久しぶりにAbemaTVにアクセスしたところ、sorry... AbemaTV is only accessible within Japanという表示が現れて視聴することができなくなっていた。

問題の表示(twitterから引用)

ヘルプページを確認すると、

当該エラーは、プロキシ(Proxy)やVPN経由でのアクセス、または海外IPアドレスからのアクセスが行われている場合に表示されます。
これらのアクセス方法を利用している場合、ABEMAを視聴することはできません。
プロキシやVPNを無効にし、あらためて視聴をお試しください。 help.abema.tv

とのこと。

しかし、

  • 自分は日本在住のため海外IPアドレスのはずはない
  • プロキシ/VPN設定を見ても変更した痕跡はない
  • アドブロックを無効化しても効果なし
  • 所持していたPC、スマートフォンのどれを試しても閲覧不可
  • 家のwifiを切ってモバイルデータ通信を利用すると閲覧できた

この結果から、wifi接続時のIPアドレスが何らかの原因と考え、いろいろ調べてみると以下のページを見つけた。 techracho.bpsinc.jp

このページをもとにIPアドレスの移転履歴を調べると、当時使っていたwifiIPアドレスが、数年前に海外から買い取られたものであるとわかった。 www.nic.ad.jp

f:id:kalax:20210706164112p:plain
IPアドレス移転履歴

おそらく、使用していたIPアドレスが海外IPアドレスと誤判定され、アクセスを弾かれてしまったようだ。
その後また数か月後に再度アクセスしたところ閲覧できるようになっていた気がする(詳しく覚えていない)。

その他補足

Nuro光でも同じような症状が起こることがあるそうだ。 xn--nuro-8c4cnopkncshb2h0794esg6a3fl.com

【Vivaldi】閲覧履歴をCSV形式でエクスポートする

履歴ページを開いた際の動作の重さが気になったので、エクスポート&削除することにした。

環境

Windows 10 Home Ver.21H1
Vivaldi 4.0.2312.33 (Stable channel) (64-bit)

方法

この記事を参照。

qiita.com

この記事ではChromeでの方法について書かれているが、Vivaldiもほぼ同様の操作でエクスポートできる。
(ちなみにVivaldiではC:\Users\***\AppData\Local\Vivaldi\User Data\Default下の"History"ファイルが閲覧履歴ファイルである)

注意点

閲覧履歴が溜まっている場合、履歴ファイルの容量が非常に大きくなっているため注意が必要である。
自分の環境では、125000件弱の履歴が保存されていた状態で、Historyファイルの容量は75MB程度、エクスポートしたCSVファイルの容量は55MB程度であった。
このCSVファイルを変換してxlsxファイルにすると15MBほどに軽量化できたので、容量不足の場合はxlsxへ変換するのがよいと思う。
CSV -> xlsx 変換の方法や、変換時の文字化けの対処法については以下の記事を参照。

forest.watch.impress.co.jp

半波長ダイポールアンテナの放射電界を求める際の積分について

やりたいこと


\begin{aligned}
E_{\theta} &= \frac{jk \eta}{4\pi r} \sin{\theta} \int_{-\lambda / 4}^{\lambda / 4} I(z)e^{-jk(r - z \cos{\theta})} dz
\\
&= \frac{jk \eta I_0}{4\pi} \frac{e^{-jkr}}{r} \sin{\theta} \int_{-\lambda / 4}^{\lambda / 4} \cos{(kz)} e^{(-jkz \cos{\theta})} dz
\end{aligned}

を解きたい。
軽く調べても結果のみが書かれているページしか見つからなかったため、できる限り丁寧に式変形しながら解いていく。

解法

まずはオイラーの公式を用いて式をまとめてから、積分する。


\begin{aligned}
E_{\theta} &= \frac{jk \eta I_0}{4\pi} \frac{e^{-jkr}}{r} \sin{\theta}
\int_{-\lambda / 4}^{\lambda / 4} \cos{(kz)} e^{(-jkz \cos{\theta})} dz
\\
&= \frac{jk \eta I_0}{4\pi} \frac{e^{-jkr}}{r} \sin{\theta}
\int_{-\lambda / 4}^{\lambda / 4} \frac{e^{jkz} + e^{-jkz}}{2} e^{(-jkz \cos{\theta})} dz
\\
&= \frac{jk \eta I_0}{8\pi} \frac{e^{-jkr}}{r} \sin{\theta}
\int_{-\lambda / 4}^{\lambda / 4} (e^{jkz(1+\cos{\theta})} + e^{-jkz(1-\cos{\theta})}) dz
\\
&= \frac{jk \eta I_0}{8\pi} \frac{e^{-jkr}}{r} \sin{\theta} \frac{1}{jk}
\left[
\frac{1}{1 + \cos{\theta}}e^{jkz(1+\cos{\theta})} + \frac{1}{1 - \cos{\theta}}e^{-jkz(1-\cos{\theta})} \
\right]_{- \lambda / 4}^{\lambda / 4}
\\
&= \frac{\eta I_0}{8\pi} \frac{e^{-jkr}}{r} \sin{\theta}
\left[
\frac{1 - \cos{\theta}}{1 - \cos^2{\theta}}e^{jkz(1+\cos{\theta})}
+ \frac{1 + \cos{\theta}}{1 - \cos^2{\theta}}e^{-jkz(1-\cos{\theta})} \
\right]_{- \lambda / 4}^{\lambda / 4}
\\
&= \frac{\eta I_0}{8\pi} \frac{e^{-jkr}}{r} \sin{\theta} \frac{1}{\sin^2{\theta}}
\left[
(1 - \cos{\theta}) e^{jkz(1+\cos{\theta})}
+ (1 + \cos{\theta})e^{-jkz(1-\cos{\theta})}
\right]_{- \lambda / 4}^{\lambda / 4}
\\
&= \frac{\eta I_0}{8\pi} \frac{e^{-jkr}}{r} \frac{1}{\sin{\theta}}
\left[
e^{jkz \cos{\theta}}
\left\{
(1 - \cos{\theta})e^{jkz} + (1 + \cos{\theta})e^{-jkz}
\right\}
\right]_{- \lambda / 4}^{\lambda / 4}
\\
&= \frac{\eta I_0}{8\pi} \frac{e^{-jkr}}{r} \frac{1}{\sin{\theta}}
\left[
e^{jkz \cos{\theta}}
\left\{
(e^{jkz} - e^{-jkz}) - (e^{jkz} + e^{-jkz}) \cos{\theta}
\right\}
\right]_{- \lambda / 4}^{\lambda / 4}
\\
&= \frac{\eta I_0}{8\pi} \frac{e^{-jkr}}{r} \frac{1}{\sin{\theta}}
\left[
e^{jkz \cos{\theta}} \times 2
(j \sin{kz} - \cos{\theta} \cos{\cos{kz}})
\right]_{- \lambda / 4}^{\lambda / 4}
\\
&= \frac{\eta I_0}{4\pi} \frac{e^{-jkr}}{r} \frac{1}{\sin{\theta}}
\left\{
e^{j \frac{k \lambda}{4} \cos{\theta}}
(j \sin{\frac{k \lambda}{4}} - \cos{\theta} \cos{\frac{k \lambda}{4}})
- e^{- j \frac{k \lambda}{4} \cos{\theta}}
(j \sin{(- \frac{k \lambda}{4})} - \cos{\theta} \cos{(- \frac{k \lambda}{4})})
\right\}
\\
&= \frac{\eta I_0}{4\pi} \frac{e^{-jkr}}{r} \frac{1}{\sin{\theta}}
\left\{
e^{j \frac{k \lambda}{4} \cos{\theta}}
(j \sin{\frac{k \lambda}{4}} - \cos{\theta} \cos{\frac{k \lambda}{4}})
- e^{- j \frac{k \lambda}{4} \cos{\theta}}
(- j \sin{\frac{k \lambda}{4}} - \cos{\theta} \cos{\frac{k \lambda}{4}})
\right\}
\end{aligned}


ここでk = \sqrt{\epsilon \mu} \omegaより、


\begin{aligned}
k \lambda &= \sqrt{\epsilon \mu} \omega \lambda
\\
&= \sqrt{\epsilon \mu} 2 \pi f \lambda
\\
&= \sqrt{\epsilon \mu} 2 \pi v
\\
&= \sqrt{\epsilon \mu} 2 \pi \frac{1}{\sqrt{\epsilon \mu}}
\\
&= 2 \pi
\end{aligned}


ゆえに\frac{k \lambda}{4} = \pi / 2であるから、


\begin{aligned}

E_{\theta} &= \frac{\eta I_0}{4\pi} \frac{e^{-jkr}}{r} \frac{1}{\sin{\theta}}
\left\{
e^{j \frac{\pi}{2} \cos{\theta}}
(j \sin{\frac{\pi}{2}} - \cos{\theta} \cos{\frac{\pi}{2}})
- e^{- j \frac{\pi}{2} \cos{\theta}}
(- j \sin{\frac{\pi}{2}} - \cos{\theta} \cos{\frac{\pi}{2}})
\right\}
\\
&= \frac{\eta I_0}{4\pi} \frac{e^{-jkr}}{r} \frac{1}{\sin{\theta}} j
\left(
e^{j \frac{\pi}{2} \cos{\theta}} + e^{- j \frac{\pi}{2} \cos{\theta}}
\right)
\\
&= \frac{j \eta I_0}{2\pi} \frac{e^{-jkr}}{r} 
\frac{\cos{ (\frac{\pi}{2} \cos{\theta}}) }{\sin{\theta}}
\end{aligned}


こうして半波長ダイポールアンテナの放射電界E_{\theta}を求めることができた。

(補足)はてなブログで数式を埋め込む方法

以下の記事を参考にした。

7shi.hateblo.jp

とりあえず下のように書けば問題ないようだ。

<div align="center">
[tex:
\begin{aligned}
ここに数式を書いていく
\end{aligned}
]
</div>

(補足)数式が長すぎて表示しきれないときの対処法

数式が書かれている部分をスクロールできるようにすればよい。以下の記事を参考にして設定した。

www.randpy.tokyo

(補足)基本的なTeX記法

忘れていたものについて記しておく。

  1. frac{分子}{分母} で分数が書ける。
  2. 積分\intで書く。積分範囲を指定する場合は普通の数式と同様に ^ や _ を用いる。
  3. 括弧の大きさを自動調整するには括弧の前にleftrightを記述する。

【C言語】変数内の複数行文字列をfor文で一行ずつ読み込む方法

分かりづらいタイトルで申し訳無い…

やりたいこと

例えば

1,2
3,5
3,7
...

のような複数行の文字列が入った変数txtが与えられたとしよう。つまり、

char *txt = "1, 2\n3, 5\n3,7\n";

といった形で与えられている状況を想定する。

このとき、

int i, n, length = 3;    // lengthはtxtの行数
int a[length], b[length];
char *txt = "1, 2\n3, 5\n3,7\n";
for (i = 0; i < length; i++) { 
    sscanf(txt, "%d,%d", &a[i], &b[i]);
}

のようにfor文で一行ずつ取り出して、各行ごとに処理を行いたい。この例では、カンマに区切られた2つの数を配列a, bに代入することが「処理」にあたる。  

問題

ファイルに書かれた文字列や標準入力から受け取った文字列ならfscanfが使えるが、すでに変数に格納されている文字列については使えない。

そのためsscanfを使うしかないように思うのだが、そうすると別の問題が発生してしまう。
fscanfは現在の読み込み位置を示すポインタを勝手に進めてくれるため上のコードでも動くが、sscanfにはそうしたポインタがなく、次呼び出したときはまた文字列の最初から読み込むことになってしまうため、正常に動作しないのだ。

例えば上の例に挙げたコードを実行すると、延々と1行目のみを読み込むこととなる。
そのため、実際の読み込み結果は
a = {1, 1, 1, ...}, b = {2, 2, 2, ...}
となってしまい、意図していた結果
a = {1, 3, 3, ...}, b = {2, 5, 7, ...}
とは異なる結果が返されてしまう。

%nを使う

そこでsscanfのフォーマット指定子"%n"を用いる。

www.tamasoft.co.jp

これを用いると、読み込んだバイト数を取得することができる。

例えば

int a, b, n;
char *txt = "1,2";
sscanf(txt, "%d,%d%n", &a, &b, &n);
printf("%d", n);

とすると、3が出力される。これは%nの直前までに3文字("1,2")を読み込んだからである。

よって%nを利用すれば、以下のような方法で前回の続きから読み込むことが可能となる。

  1. sscanf時に、%nを用いて適当な変数nに読み込んだバイト数を格納する
  2. 文字列変数のポインタをnだけ進める
  3. その文字列変数を用いてsscanfを行う。以下繰り返し

これをコードにした例を以下に示す。

int main(void) {
    int i, n, length = 3;    // lengthはtxtの行数
    int a[length], b[length];
    char *txt = "1, 2\n3, 5\n3,7\n";
    for (i = 0; i < length; i++) {           
        sscanf(txt, "%d,%d%n", &a[i], &b[i], &n);
        txt += n;            // 文字列の開始位置をn文字進める
        printf("%d,%d\n", a[i], b[i]);
    }
    return 0;
}

実行結果は以下のようになり、各行を読み込めていることが確認できる。

1,2
3,5
3,7