Post

【Googleフォーム】動的な初期値を設定したい。

サイト上にGoogleフォームリンクを設置する時に、ページに合わせて動的にフォームの初期値を変更したいなと思って設定してみました。

その設定した時のメモです。

Googleフォームから初期値設定ページを開く

Googleフォームを作成して、右上の三点リーダー(…)をクリックします。

その出てくる項目の中から「事前入力したURLを取得」をクリックします。

初期値を設定したい項目に値を入力する

「事前入力したURLを取得」を押して開いたフォームの、動的な初期値を入れたい項目に値を入力します。(値はなんでもOK)

入力したら「リンクを取得」をクリックします。

「リンクを取得」をクリックして出てきたURLをコピーします。

// コピーされたURL
https://docs.google.com/forms/d/e/[formのID]/viewform?usp=pp_url&entry.247309575=userId&entry.1732707192=userName

取得URLの中で「動的に初期値を変えたい部分」を変更する

取得したURLの中で、entry.[項目id]=[設定した値]の部分がそれぞれ初期値の内容になります。

この[設定した値]の部分が初期値を表しているので、これを変更すると初期値が変更します。(画像の「userID」と「userName」部分)

多次元配列のイメージ。4次元以降がわからなかったのでメモ。

PythonやJavascriptでよく見かける「◯次元配列」のイメージができなかったのでメモ。

考え方が合っているかわからないですが、データベースみたいに考えてみました。

(イラストで理解しようと思ったら4次元以降がイメージできなかった…。)

1次元のデータ

abc
// 1次元配列
const array = [a, b, c]
// 一番深い要素を取り出してみる
console.log(array[0])
// a

2次元のデータベース

012
0abc
1def
2ghi
// 2次元配列
const array = [
    [a, b, c],
    [d, e, f],
    [g, h, i],
]
// 一番深い要素を取り出してみる
array[0][0]
// a

3次元のデータベース

012
0[a,b,c][d][e]
1[f][g][h]
// 3次元配列
const array = [
    [[a,b,c], [d], [e]],
    [[f], [g], [h]],
]
// 一番深い要素を取り出してみる
array[0][0][0]
// a

4次元のデータベース

012
0[
[a,b],
[c,d],
[e,f],
]
[[g,h,j]][[k,l,m]]
1[[n,o,p]][[q,r,s]][[t,u,v]]
// 4次元配列
const array = [
    [
        [[a,b],[e,d],[e,f]],
        [[g,h,j]],
        [[k,l,m]]
    ],
    [
        [[n,o,p]],
        [[q,r,s]],
        [[t,u,v]],
    ]
]
// 一番深い要素を取り出してみる
array[0][0][0][0]
// a

まとめ

リストの中にリストが入ってる状態を「多次元」と呼ぶのかな。それで「どれだけこの入れ子が続いているか」で「何次元か」を表しているのかも…まだはっきりとわからない。

一番深い要素を取り出す時に[x]をいくつ使うかみたいな考え方でもいいのかもしれない。array[0][0][0][0]だったら[x]が4つだから4次元配列、みたいな。

もっと調べてわかったことや間違っているところを随時更新していきたいです。

ISO 8601表記の時間を(PT18M17S)を「◯秒」や「◯分◯秒」に変換する方法。

Youtube APIの再生時間などを取得すると「PT18M17S」という表記で出力されます。

少しデータの表記を加工したかったので、変換方法をまとめておきます。

やりたいこと

PT18M17Sを「1097秒」や「18分17秒」といった表記に変換したい。

duration = "PT18M17S"  # 18分17秒

⑴「.replace()」を使って変換

duration = "PT18M17S"

time = duration.replace('PT','').replace('H','時間').replace('M','分').replace('S','秒')
print(time)

# 18分17秒

⑵ ライブラリ「isodate」を使って変換

$ pip install isodate
import isodate

duration = "PT18M17S"

td = isodate.parse_duration(duration)
seconds = td.total_seconds()
print(seconds)

# 1097.0

秒数から「XX:XX:XX」表記に変換する

import datetime

# 「x(秒)」から「x:xx:xx」形式に変更
def get_time(td):
    m, s = divmod(td.seconds, 60)
    h, m = divmod(m, 60)
    if h == 0:  # 1時間未満であれば時間表記は省略
        return f'{m}:{s}'
    return f'{h}:{m}:{s}'

td = datetime.timedelta(seconds=1097.0)
time = get_time(td)
print(time)

# 18:17

おまけ:ISO 8601表記の意味

P[n]Y[n]M[n]DT[n]H[n]M[n]S

「P」は期間を表して、「T」は時間を表しています。

P期間」を表す指定子
◯Y
◯M
◯D
T時間」を表す指定子
◯H時間
◯M
◯S

npm install 時の「–save」と「–save-dev」の違い

パッケージをインストールするnpm installをする時に、「--save」や「--save-dev」などを見かけることがあり、特に理解していなかったので少し調べてまとめます。

「–save」と「–save-dev」の違い

本番環境にインストールする--save)」か「ローカル環境にインストールする--save-dev)」かの違い。

何も付けないと「–save」になる

--save--save-devも付けずにnpm installをすると、デフォルトで--saveとして扱われるらしい。

「–save-dev」を使う場面の見分け方

「ソースコードを公開して、そのコードを他の人がクローンすることがあるかどうか?」が一つのポイントになるようです。

どうやらクローンした人が、そのアプリケーションに使われているパッケージをインストールするためにnpm install --productionをすると、--saveでインストールしたパッケージがインストールされてしまうみたい。

MAMPのMySQL接続エラーを解消するまで。

急にMAMPが動かなくなりました。

接続エラーが起きた原因

MAMPの起動中にmacが予期せぬエラーで強制シャットダウンしたことが原因のようです。。

接続エラーの解消方法

/MAMP/tmp/mysql/ のディレクトリ下にある「mysql.sock.lock」ファイルを削除しました。

「mysql.sock.lock」の削除理由

MAMPを正常に終了した時は自動でこのファイルが削除されるはずなんですが、今回は強制シャットダウンが起きてしまったため、このファイルが削除されることなく取り残されてしまったみたい…

接続エラーの解消までの記録

STEP1:まずはエラーログを確認する

MAMPはエラーが起こると、/MAMP/logs/ にエラーログを残してくれます。このエラーログのファイルを開いて書かれているERROR部分を確認すると、どんなエラーかを把握することができます。

今回のエラーログ
xxx [ERROR] Another process with pid xxxx is using unix socket file.
xxx [ERROR] Unable to setup unix socket lock file.
xxx [ERROR] Aborting

STEP2:エラーログの内容を調べる

エラーログで出ていたERROR部分をそのままググります

そうすると「Stack Overflowで質問している人」や「同じエラーを解消した人のブログ」などが出てきたので、それを読みながら試しました。ありがたや…

まとめ

「MAMPエラー」や

まとめ

初めは「MAMP 起動できない」や「MAMP オレンジ」などで検索したのですが、様々な原因がでてきて今回のエラーがどれに当てはまるのかを見つけるのが大変でした…

エラーログをググことで自分の原因と近い解決方法がでてくることが多いので、MAMPエラーが出た時にはまず「エラーログ」。

  • MAMPのエラーが出た時はエラーログを確認すること
  • 「エラーログ」をググること

「HTTPリクエスト/HTTPレスポンス」って何?

「HTTPリクエスト」「HTTPレスポンス」の意味が理解できていなかったので、わかっている範囲でまとめてみました。

HTTPリクエストの構成要素3つ

HTTPリクエストでは、大きく3つの要素で構成された情報が送られています。

  1. リクエストライン
  2. ヘッダ
  3. ボディ(メッセージボディ)

リクエストライン

ここには「メソッド」「URL」「HTTPのバージョン」の3つが記載されています。

よく使われるリクエストメソッドを表にまとめました。

メソッドの種類内容
GETデータの取得
POSTデータの送信
PATCHデータの更新
DELETEデータの削除
HEADヘッダ情報の取得
OPTIONSオプション情報の取得

リクエストヘッダ

[フィールド名] : [値] 】が記載されています。

よく使われるフィールドを表にまとめました。

フィールド名内容
User-Agentブラウザの種類、OS情報など
Refererリクエスト元のページ
CookieCookieの情報
Authorizationログインに必要な認証情報(ID, PASSなど)
If-Modified-Since日付を送信して、その日以降にデータ更新がある場合は取得
Accept利用可能なアプリケーション・メディアタイプ
Accept-Encoding利用可能な文字セット
Accept-Charset利用可能なエンコーディング形式
Accept-Language利用可能な言語コード

メッセージボディ

データの本体が記載されています。

HTTPレスポンスの構成要素3つ

HTTPリクエストでは、大きく3つの要素で構成された情報が送られています。

  1. ステータスライン
  2. ヘッダ
  3. ボディ(レスポンスボディ)

ステータスライン

ステータスラインには「HTTPのバージョン」「ステータスコード」の2つが記載されています。

よく使われるステータスコードを表にまとめました。

グループステータスコード内容
200番台(成功)200成功
300番台(リダイレクト)301恒久的なリダイレクト(サイト移転など)
302一時的なリダイレクト(リニューアル中など)
400番台(クライアント側エラー)401ユーザー認証が必要(Basic認証など)
403アクセス制限,など
404ページが存在しない,など
500番台(サーバー側エラー)500内部エラー(プログラムミスなど)
503サーバーへの過剰負荷,など

レスポンスヘッダ

[フィールド名] : [値] 】が記載されています。

よく見かけるフィールドを表にまとめました。

フィールド名内容
Content-Typeデータの型(HTML、画像など)
文字コード
Expires取得データの有効期限(ブラウザキャッシュ制御のため)

レスポンスボディ

データの本体が記載されています。

このブログの「目的」と「目指すべき方向性」を決めておく

このブログでは新しい知識を知ったり調べたりしたころをまとめて公開していこうと考えています。

そこで改めて「目的の明確化」と「方向性」をメモしておこうと思ったのでそれをまとめておきます。

ブログに書くことの目的

ブログを続けるモチベーションを保つために目的を明確化させておきたいと思います。

思いつく目的(ブログを書くメリットにも繋がる)は3つ考えています。

インプットの質を上げるため

アウトプットを意識した情報収集をすることで、インプットの質を高められると考えています。漠然と調べるのではなく、他の人に共有することを前提として調べた方がより定着すると思うので、これを今まで以上に活用できたらなと思っています。

何を学べばいいのかを知るため

ここにまとめておくことによって「いま何を学んでいて」、「これから何を学べばいいか」という自分の状態がわかるようにするということも目的の一つです。

同じように学んでいる人への共有のため

自分が学んでいて見つけられなかったことや、難しくてわからなかったことを、わかりやすくまとめることで誰かにとって少しでもプラスになればいいなと思っています。

目指すべきは「体験価値を創り出すこと」

ここでまとめる情報は、何かしらの「体験価値を創り出すこと」に繋がるように心掛けたいと思います。

これはつまり学んだことを活かして「何かをモノを創る」という意味で考えています。情報をまとめて価値として提供するだけでなく、何か価値のあるモノを創れるようになりたいという想いからです。

なので例えばWEBサービスなどを創る時にはその進捗もこのブログに書いていきたいと考えています。

最近のまとめたいテーマ

現在WEB関連の仕事がメインということもあり、プログラミング(主にDjangoやNext.js)や用語のメモなどをまとめていこうと思っています。

その他にも最新テクノロジー(WEB3など)や、環境などの社会課題なども学んでいきたいので調べていきたいと思っています。

「わからないこと」をまとめていくブログ

最近、仕事をしたりニュースを読んだりしている中で、「わからないこと」が次から次に出てくるようになりました。

このブログでは、そんな「わからないこと」をまとめていくことを目的としています。

できるだけ「わかりやすく」まとめる

わからないことを調べて書く時に大事にしたいと思うのは、できるだけわかりやすく書くということ。

知らないテーマのことを書く予定なので、調べていくうちに理解が深まってくるかもしれません。でもその上で、難しい知識を説明に使わない細かい部分の説明を飛ばさないなどには注意したいです。

わからないことを質問をする「初心者」と、答えを提示する「専門家」を行ったり来たりするように意識していきます。

このブログで書くテーマ

「サービスを作ること」や「最新のテクノロジーやガジェット(もちろんサービスも)」、「言葉の成り立ち」にものすごく興味があります。

なので、書く内容もこれらが多いかもしれません。

  • サービスを作る時に調べたことや作ったもの
  • 気になる!おもしろい!と思ったテクノロジー・サービス
  • ふと気になった小ネタ・豆知識 etc.