2024/09/23

Google Search Consoleリダイレクトエラー対策

event_note9月 23, 2024 editBy スタディPCネット 武蔵ヶ丘校 forum No comments

Google Search Consoleでインデックス登録されない

Google Bloggerの記事が、Google Search Consoleでインデックス登録できない。リダイレクトエラーになる。対策として、urlの末尾に「?m=1」を付けてリクエストするという方法があるらしいが、効果は無かった。

「?m=0」を付けると解決したという記事があったので、さっそく試してみる。

>> 【最新】とりあえずの解決方法|GoogleのBloggerが検索インデックス登録されない|ニフティニュース (nifty.com)

2024/08/01

【Excel関数】MMULT

event_note8月 01, 2024 editBy スタディPCネット 武蔵ヶ丘校 forum No comments

【Excel関数】MMULT

作成:2024年07月30日
MMULT(マトリックス・マルチプリケーション)関数を解説します。

よくある、解説になってない解説。
  • 2つの行列の行列積を求めます
  • 計算結果の 行数×列数 は、行列1の行数×行列2の列数 になります
  • 行列1の列数 と、行列2の行数 は同じである必要があります
意味不明ですね。

なので今回は普通とは全く違う解説をします。
  • MMULTとは、行と列の組み合わせの数だけSUMPRODUCTする関数です
わかりやすい!では詳しく解説していきます。

  1. 結果(行列1の行数 × 行列2の列数)のイメージ化
  2. SUMPRODUCTのおさらい
  3. 行列積(SUMPRODUCTを繰り返す)
  4. 使いどころ

1. 結果のイメージ化

MMULTを数式で表すとこうなります。
i行k列の行列b と k行j列の行列c の行列積cはi行j列 になると示されています。
・・・って、こんな数式も解説も覚えられないですよね!

なのでイメージで覚えましょう。
結果の左に行列1結果の上に行列2。この関係をイメージできると「結果 = 行列1の行数 × 行列2の列数」というルールは覚えなくても自然と導けるはずです。

2. SUMPRODUCTのおさらい

行列1の行数・行列2の列数はもう大丈夫ですね。次は、行列1の列数・行列2の行数です。この2つは同じ数でなければいけません。なぜか?SUMPRODUCTするからです。
ということで、SUMPRODUCTのおさらいです。
{1;2;3;4}という配列と、{11;14;17;20}という配列があります。まず、各要素同士を掛けます{11;28;51;80}。その後、掛けた結果を合計します{170}。これがSUMPRODUCTです。
各要素同士を掛けるということは、要素の数が同じでなければ計算できませんね。上図がイメージできれば、自然と導けるはずです。

3. 行列積(SUMPRODUCTを繰り返す)

結果の1セル分(1行目1列目)の計算はできました。他のセルも同様に計算してみましょう。
結果の1行目2列目は、{1;2;3;4}{12;15;18;21}のSUMPRODUCTですね。結果は{180}になります。
残りのSUMPRODUCTも計算すると、最終的な結果は{170,180,190;418.444,470}となり、それはMMULTの結果でもあります。

4. 使いどころ

確かに行列積が簡単に求められて便利ではありますが、MMULTの凄いところはそこではありません。
MMULTの計算の過程がとても特殊なのに気付きましたでしょうか?なんと、部分的に集計しているのです。エクセルの普通の集計関数(SUMとかAVERAGEとか)は、複数の値を一個の値にします。「行単位・列単位で集計」ということができません。その不可能を可能にするのがMMULT関数なのです。
365からは、BYROW/BYCOL関数を使って簡単に行・列単位の集計ができるようになりましたが、それまではこのMMULT関数を駆使する必要がありました。そのお話は、また別の機会にしたいと思います。

2024/04/02

【Excel関数】再帰LAMBDA

event_note4月 02, 2024 editBy スタディPCネット 武蔵ヶ丘校 forum No comments

【Excel関数】ローカルのLAMBDA関数を再帰呼び出しする

作成:2024年04月02日
等差数列の和を、再帰関数で求める例で解説します。
「10」だったら、10+9+・・・+2+1=55、というやつです。
  1. VBAだったら
  2. 名前の定義で再帰関数を作る
  3. セル内で再帰関数を定義して使う(その1)
  4. セル内で再帰関数を定義して使う(その2)

1. VBAだったら

まぁ、プログラミング言語だったら、こんなもんでしょう。
Function func(引数 As Integer) As Integer
  If 1 <= 引数 Then
    func = 引数 + func(引数 - 1)
  End If
End Function

2. 名前の定義で再帰関数を作る

「名前の定義」の場合、VBAと同じ感じで再帰呼び出しができます。
=LAMBDA(引数,IF(1<=引数,引数+func(引数-1)))
funcという名前を作成し、参照範囲は「自分自身を呼び出すLAMBDA関数」を設定します。

3. セル内で再帰関数を定義して使う(その1)

本題のローカル関数です。VBAと同じ感じで書くとエラーになります。
=LET(
  func, LAMBDA(引数, IF(1<=引数, 引数+func(引数-1))),   ← エラー
  func(10)
)
LAMBDA内で func は未だ定義されていないので使えません。

なので、funcを定義した後で、funcの引数にfuncを渡してみましょう。
=LET(
  fOuter, LAMBDA(fInner,引数, IF(1<=引数, 引数+fInner(fInner,引数-1))),
  fOuter(fOuter,10)
)
LAMBDAの引数に自身のLAMBDAを渡して再帰させることができました。
ちなみに、VBAではLAMBDAは作れませんし、ユーザー定義関数にLAMBDAを渡すこともできません。

「fOuter(fOuter,10)」ではなく「fOuter(10)」という呼び出し方にしましょう。
=LET(
  fOuter, LAMBDA(fInner,引数, IF(1<=引数, 引数+fInner(fInner,引数-1))),
  func, LAMBDA(引数, fOuter(fOuter,引数)),
  func(10)
)

ちょっと名前を修正します。
=LET(
  f, LAMBDA(f,引数, IF(1<=引数, 引数+f(f,引数-1))),
  func, LAMBDA(引数, f(f,引数)),
  func(10)
)
LAMBDAの内外で名前(f)が重複しています。この場合、LAMBDA内でfを使うとLAMBDAの引数の方のfを指すことになるので、この書き方が許されます。

引数2個の場合はこうなります。
=LET(
  f, LAMBDA(f,引数1,引数2, IF(引数2<=引数1, 引数1+f(f,引数1-1,引数2))),
  func, LAMBDA(引数1,引数2, f(f,引数1,引数2)),
  func(10,2)
)
開始と終了の範囲を指定できるようになりました。上記は、10+9+・・・+3+2=54になります。

4. セル内で再帰関数を定義して使う(その2)

正統な方法はこうみたいです。
=LET(
  z, LAMBDA(f, LET(g, LAMBDA(x, f(LAMBDA(v, LET(xx, x(x), xx(v))))), g(g))),
  func, z(LAMBDA(func, LAMBDA(x, IF(1<=x, x+func(x-1))))),
  func(10)
)
どうなってるんでしょう。正直難しすぎてわかりません。
呪文と割り切って、もう使えたらいいじゃない・・・という意見もあるかもしれませんが、このままだと大きな問題を抱えているんです。
引数が増減した場合、どこを修正したらいいかわかりますか?わからないですよね!?

なので加工します。
=LET(
  z, LAMBDA(ff, LET(g, LAMBDA(gg, ff(LAMBDA(arg_1, gg(gg)(arg_1)))), g(g))),
  f, LAMBDA(fff, LAMBDA(引数1, IF(1<=引数1, 引数1+fff(引数1-1)))),
  func, z(f),
  func(10)
)
相変わらず何をやってるのかはわからないけど、引数が増減した場合にどこを修正したらいいのかはわかるようになりました。

引数2個の場合はこうですね。
=LET(
  z, LAMBDA(ff, LET(g, LAMBDA(gg, ff(LAMBDA(arg_1,arg_2, gg(gg)(arg_1,arg_2)))), g(g))),
  f, LAMBDA(fff, LAMBDA(引数1,引数2, IF(引数2<=引数1, 引数1+fff(引数1-1,引数2)))),
  func, z(f),
  func(10,2)
)

ステップ実行してみよう

LAMBDA関数は「数式の検証」に対応しておらず、デバッグ(ステップ)実行ができません。かといって、VBAではLAMBDAが使えない。
ということで、PowerShellで書いてみました。興味ある方はデバッグ実行してみてください。
[scriptblock] $z = {
  Param([scriptblock] $ff)
  [scriptblock] $g = {
    Param([scriptblock] $gg)
    return $ff.Invoke({
      Param([int] $arg_1, [int] $arg_2)
      return $gg.Invoke($gg)[0].Invoke($arg_1, $arg_2)[0];
    }.GetNewClosure())[0];
  }.GetNewClosure();
  return $g.Invoke($g)[0];
};

[scriptblock] $f = {
  Param([scriptblock] $fff)
  return {
    Param([int] $引数1, [int] $引数2)
    if ($引数2 -le $引数1) {
      return $引数1 + $fff.Invoke($引数1-1, $引数2)[0];
    }
  }.GetNewClosure();
};

[scriptblock] $func = $z.Invoke($f)[0];

$func.Invoke(10, 2);