サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
CES 2025
www.kwbtblog.com
初めてBIツールを使った時に混乱したのが「ディメンション」と「メジャー」の違いでした。 ここでは簡単にその違いや考え方を解説しようと思います。 名称 Tableauでは「ディメンション」と「メジャー」と呼びます。 PowerBIでは「列」と「メジャー」と呼びます。 Lookerでは「ディメンション」と「指標(metrics)」と呼びます。 呼び方は違えど、どれも同じ内容を指しています。 サンプルデータ 下記の年度・都市・商品別売上データを元に解説します。 Excelのグラフ Excelはテーブルのデータをそのまま1対1にプロットしてグラフを描きます。 Excelの集計グラフ 年度や都市などで合計した値のグラフを描きたい時があります。 Excelではそういったグラフはそのままでは作成できず、一旦ピボットテーブルで集計してから、そのピボットテーブルの値でグラフを描きます。 BIツールのグラフ
普段Google BigQueryでは簡単な集計SQLしか使っていないのですが、集計SQL以外にも色々便利な機能があります。 ただ、使用頻度が高くないので、いざ使おうとするとマニュアルを探すところから始まるので、自分用に簡単な使い方をまとめておこうと思います。 ここではプログラミング関連をまとめました。 「BigQueryの少し凝った使い方メモ」記事一覧 BigQueryの少し凝った使い方メモ(ビュー・マテリアライズドビュー・テーブル関数) BigQueryの少し凝った使い方メモ(テーブル作成・データ更新) BigQueryの少し凝った使い方メモ(スケジュールされたクエリ) BigQueryの少し凝った使い方メモ(プログラミング) BigQueryの少し凝った使い方メモ(etc) 関数 ユーザー定義関数を作れる 値を返す テーブルは返せない。テーブルを返すのはテーブル関数で別にある 戻り値
ここしばらく、Selenium・puppeteer・Playwrightの使い方をまとめていました。 まとめが長くなってきたので、ある程度の説明や手順が必要な操作は別記事にまとめようと思います。 ここでは、Selenium・puppeteer・Playwrightそれぞれで、無限スクロールする方法をまとめました。 スクロール 無限スクロールの手順に入る前に、まずは基本となるスクロールをする方法です。 JavaScriptのElement.scrollTopを使って、ウィンドウのdomのスクロール位置を移動させる方法もあるのですが、ここではElement.scrollIntoView()を使って、ウィンドウ内の一番下のdomが見えるようにスクロールさせる方法を使います。 参考として最後にElement.scrollTopを使った方法も記載しました。 sample html ウィンドウの中に、
最近Playwrightを試していたので、使い方を忘れてもまた思い出せるよう、Playwrightの使い方をメモしておこうと思います。 インストール npm install --save playwright Playwrightをインストールすると、同時にブラウザChromium・Firefox・Webkitもインストールされる デフォルトではPlaywrightから呼び出されるブラウザは、その時にインストールされたブラウザが使われる ブラウザをインストールせずPlaywrightのみをインストールし、ブラウザは別途インストールしたものを使用することも可能 しかし、Playwrightのバージョンとブラウザのバージョンは密接に関係があるため、Playwrightとブラウザは同時にインストールして、インストールしたブラウザを使うようにした方がよい 構成 Playwrightは下記クラスで構
WebのクローリングにPuppeteerを使っています。 いつかPuppeteerの使い方をまとめたいなと思っていたのですが、そうこうしている内に月日は流れ、Puppeteerと同様のブラウザ操作ツールとして、Playwrightの名前をよく聞くようになってきました。 ならばいっそのこと、新たにクローラーを書く時はPlaywrightに乗り換えて、その使い方をまとめようかなと思い始めました。 一方、ブラウザ操作ツールとしてSeleniumも有名です。 Microsoft Power AutomateでSeleniumが使えると聞いたので、Seleniumならクローリングだけでなく、日々の業務の自動化にも使えて便利かなとSeleniumにも興味がありました。 SeleniumとPlaywright、どちらにしようかと迷ったのですが、どちらも使ったことがなかったので結局両方を使って確かめること
認証機能付きReactサイトを手軽に作りたかったのですが、都度バックエンドを構築するのが面倒で諦めてました。 しかし、AWS Amplifyを使えば、手軽にバックエンドを構築できるのではと試してみました。 一通り欲しかった機能は試したので、再利用可能なように、ざっくり作り方をメモしておこうと思います。 公開サイトじゃないので、凝ったものではなく、必要最小限の下記機能を盛り込んだものになります。 ホスティング Basic認証 認証 認証者によるDynamoDBアクセス 認証者によるLambdaアクセス ドキュメント https://docs.amplify.aws/ ドキュメントが古いこともあるので、コマンドのヘルプも参照する。 amplify --help amplify [command] --help Amplify CLIインストール Amplify CLIを使って作業するので、まず
思い立ったらサクッとSPAサイトが作れたらいいなぁと思っていたのですが、Reactはちょっとしたサイトを作るにも大掛かりになってしまうので諦めていました。 しかし、最近ReactのRecoilを触り始めたのですが、Recoilを使うと、Reactも随分シンプルに書けるようになっていました。 フロントエンドの手軽さはReact+Recoilで解決できそうなので、後はバックエンドをサクッと作れれば夢が叶いそうです。 そこで、モバイルアプリのバックエンドをサクッと作れる方法として、「Google Firebase」と「AWS Amplify」をよく聞くので試してみました。 ここでは、それぞれを使ってみた感想を書こうと思います。 FirebaseとAmplifyがやってくれること Firebase、Amplify共に、バックエンドで面倒な、下記のような作業をやってくれます。 リソースの提供 ホステ
以前、AWS CloudFormationテンプレートを手書きしようとして挫折しました…。 www.kwbtblog.com その時学んだのは、CloudFormationテンプレートは人の手で書く類のものではなく、何かしらのツールを使って生成するものだなと。 そして、そのためのツールが、AmazonからAWS CDKという形で提供されていたので使ってみたのですが、めちゃ便利でした!! もうこれからは、AWSのリソース作成はコンソールやCLIで行わず、全部AWS CDKで作ろうかと思うくらい便利でした! 必要な時にサクッとAWS CDKを使えるよう、ここにAWS CDKの簡単な説明と基本的な使い方をメモしておこうと思います。 AWS CDKとは? AWS CDK(Cloud Development Kit)とは一言で言うと、CloudFormationテンプレートジェネレーターです。 Ty
シェルスクリプトで、JSONからデータを取り出すのにjqコマンドを使っています。 使い方をよく忘れるので、自分用使い方メモです。 基本 基本動作「標準入力から入力を受け取り、フィルターをかけて、標準出力に出力する」 .は入力値を表す フィルターはパイプ(|)でつなげていく フィルターはシングルクォーテーションでくくる フィルターにダブルクォーテーションを使う場合は、バックスラッシュでエスケープして入力する その他 単にJSON整形ツールとしても使える(jq '.') JSON文字列を生成できる テストサイト A playground for jq 配列 .[インデックス]でインデックスを指定して取り出す インデックスはマイナス値も使える インデックスは複数指定できる []は配列全体を展開する 展開した配列を配列に戻すには、全体を[]で囲む 展開した配列からパイプを介して配列に戻すことはでき
JavaScript(TypeScript)で書かれたプログラムを、Go言語で書き直しました。 その動機や、書き換えた結果などを書こうと思います。 また、今回Go言語が初めてだったので、Go言語とはどういったものかや、Go言語をやってみた感想なども合わせて書こうと思います。 動機 メンテナンスしづらい 移植したプログラムは、JavaScript(TypeScript)で書かれた、データ処理関連のプログラムで、サーバーで動かしていました。 JavaScriptはポピューラーな言語ですが、フロントエンドをやらない人にはあまり馴染みがないようで、扱える人が限られていて何かあった時の対応が不安でした。 どのプログラム言語にも似たような文法があり、ちょこっと修正するくらいなら、一通り文法書に目を通せば何とかなりそうな気もするのですが、PromiseなどのJavaScriptの非同期プログラミング文法
GCPのKubernetes(GKE)で、プログラムでエラーが発生したら、Slackやメールなどの外部に通知する方法です。 自分でエラー検知の仕組みを実装しなくても、GCPの設定のみで可能です。 大まかな仕組み プログラムでエラーが発生した時に、プログラムから標準エラーにメッセージを出力するようにします。 GKEでは標準で、コンテナの標準出力および標準エラーをCloud Loggingにログとして出力してくれます。 Cloud MonitoringでCloud Loggingのログを監視して、出力があった時に外部通知するようにします。 GCPの仕組み GKEとCloud Logging GKEでクラスターを作成すると、デフォルトで各種ログがCloud Loggingに出力されるようになります。 ログにはコンテナからの標準出力・標準エラーも含まれていて、プログラムからは意識することなしに、標
データ処理を行う時、ついつい面倒くさくて、全てのデータをメモリに読み込んでから処理しがちです。 データサイズが小さい時は問題ないのですが、巨大なデータを扱う場合は、メモリを大量に消費しますし、1つのデータの読み込みや書き込みが完了するまで、他の読み書き作業はブロックされるので、時間がかかってしまいます。 そんな時は、少しづつデータを読み込こみながらその都度処理する、いわゆるストリーム処理をすると、メモリはバッファ分だけで済みますし、データの読み書きは並行実行されるので、早く処理が終わり便利です。 ストリーム処理が非同期処理と相性がいいのか、Node.jsには標準でストリーム関連の機能が入っていて、外部ライブラリでもストリーム処理ができるようになっているものが多いです。 Node.jsではストリーム処理はよく出てくるので、使い方を知っておくと何かと便利なのですが、非同期関数を扱う分、全体を読
Go言語は、シンプルな関数を組み合わせてプログラミングをすることが多く、また、関数毎にエラーチェックが発生するので、全般的にコードが長くなりがちです。 ちょっとした事をしたい時でも、コードをそれなりに書く必要があるのですが、毎回ゼロから書くのは面倒なので、よくやる処理を自分コピペ用にメモしておこうと思います。 ここでは、Go言語で、ファイル(IO)を使って読み書きする方法の自分用メモを記載しました。 はじめに ioについて Go言語では、入出力はioパッケージとして抽象化されていて、ioパッケージを使って読み書きプログラムを記述します。 ファイルはio.Reader・io.Writerインターフェイスを持っているので、ioを使って記載された読み書きコードはそのまま使えます。 また、ファイルに限らず、他の入出力であっても、io.Reader・io.Writerインターフェイスを持っていれば、
Golangを始めました。 始めてみて感じたのですが、Golangはできるだけ文法をシンプルにかつ、できるだけコードがシンプルになるように設計されています。 そしてそのために、Golangには若干トリッキーな構文がいくつかあります。 しかし、それらを知らずに、他の言語での先入観や勝手な思い込みで判断してしまって、ハマることがちょいちょいありました。 ここでは、Golangを始めてみて、個人的にハマったことや、勘違いしたことを、トピック別に備忘録としてメモしていこうと思います。 今回は、マップに構造体を入れると「cannot assign to struct field ...」のエラーになることについてのメモです。 マップに格納した構造体の要素に代入はできない マップには構造体を格納できるのですが、その構造体の要素に代入(=)しようとすると cannot assign to struct
Golangを始めました。 始めてみて感じたのですが、Golangはできるだけ文法をシンプルにかつ、できるだけコードがシンプルになるように設計されています。 そしてそのために、Golangには若干トリッキーな構文がいくつかあります。 しかし、それらを知らずに、他の言語での先入観や勝手な思い込みで判断してしまって、ハマることがちょいちょいありました。 ここでは、Golangを始めてみて、個人的にハマったことや、勘違いしたことを、トピック別に備忘録としてメモしていこうと思います。 今回は、Golangにおけるクラスと継承についてのメモです。 Golangにはクラスがない Golangにはクラスがないと言われますが、実際そうです。 しかし、クラスに近しいものはあります。 そもそも、クラスで主にやりたいことは、だいたい下記のようなことじゃないでしょうか。 複数の変数を1つのグループにまとめる(メン
Web版のOffice365を操作する方法の1つに、Microsoft Graph (Office365) APIというものがあります。 例えば、Microsoft Graph (Office365) APIを使えば、Office365の外部から OutLookからメール送信 Excel Onlineのファイル編集 SharePointのファイル取得 など、ユーザーに代わって、Web版のOffice365を使った様々な操作ができます。 APIを使うには、アクセストークンをOAuth2.0で取得する必要があるのですが、このOAuth2.0トークン関連の作業は結構煩雑です。 ここではその、Microsoft Graph (Office365) APIのトークン取得方法と、有効期限の切れたトークンの更新方法について記載しました。 方針 OAuth2.0周りのやりとりを自前でやるのは大変だったので
データを月・週ごとに集計するには、まず日付の月・週の頭の日付を求め、その頭の日付でGROUPします。 Google BigQueryなど、頭の日付取得にDATE_TRUNC()関数が使える場合は、下記のような感じで集計できます。 SELECT DATE_TRUNC(dt, MONTH) AS dt_month ,SUM(sales) AS sales FROM tbl GROUP BY dt_month しかし、SQL ServerにはDATE_TRUNC()のような、日付を切り詰める関数がないので、自分で求める必要があります。 月で集計 やり方はいくつかあるのですが、FORMAT()関数を使うのが見た目的に分かりやすいかと思います。 FORMAT()関数を使って、手動で日付を「1日」にしてしまいます。 例えば、月で集計するには下記のようになります。 WITH tmp AS ( SELEC
Node.jsで、AES暗号化・復号化する機会があったので、そのメモです。 暗号化アルゴリズム「AES-256-CBC」で行いました。 ざっくりAES CBC暗号化について AES CBCは、任意の長さのバイナリデータを、鍵を使って暗号化し、同じ鍵を使って復号化する暗号化アルゴリズムです。 しかし、鍵だけで暗号化すると、元データが同じなら、暗号化したデータも毎回同じになって解読されやすくなってしまいます。 なので、AES CBCでは、鍵のみではなく「鍵+暗号化毎に設定する任意の値」を使って暗号化を行い、その「鍵+暗号化毎に設定する任意の値」を使って復号化を行うことにより、同じデータでも毎回暗号化結果が変わるようにして解読されにくくしています。 そして、その「暗号化毎に設定する任意の値」をIV(初期化ベクトル)と呼びます。 鍵について 鍵は暗号化側と復号化側で事前に共有しておく必要があり、鍵
Google Cloud Storageのサブディレクトリ一覧を、GCP Pythonライブラリを使って取得したかったのですが、 ハマったので、その経緯と方法のメモ書きです。 他の言語のライブラリも、Pythonライブラリ同様APIラッパーなので、応用可能かと思います。 NG 例 最初、下記の方法でサブディレクトリが取得できないかなと試してみましたがダメでした。 from google.cloud import storage client = storage.Clinet() bucket = client.get_bucket('xxxx') dirs = bucket.list_blobs(prefix="a/", delimiter="/") [print(x) for x in dirs] # "a/" ハマりポイント Gooble Cloud Storageも、AWS S3同様
Passport.jsを使う機会があったので、また必要になった時用のPassport.jsの使い方個人メモです。 Passport.jsとは Passport.jsとは、Node.js+Expressで作ったWebサイトに、ユーザーがログインできる、ユーザー認証を入れるためのライブラリ ユーザー認証の種類は、自分でユーザー管理する「ユーザーID+パスワード認証」だけでなく、GoogleやTwitterなどといったSNS認証など、様々な種類がある 各種の認証周りの実装はライブラリ化されていて、認証の仕組みを意識しないでユーザー認証を導入することができる 導入 ライブラリはメイン部分と、Strategyと呼ぶ認証部分に分かれている 認証の種類毎にStrategyが分かれていて、使いたい認証のStrategyを都度インストールして使用する 例)Google認証 インストール npm instal
WSL(Windows Subsystem for Linux)のファイルやフォルダはWSL内で閉じていて、エクスプローラーなど、WSLの外からはアクセスできません。 なので、WSLとWindowsの両方からアクセスできる場所として、Windowsのフォルダをシンボリックリンクで参照して使っています。 便利でよく使っているのですが、問題があって、「ls」でファイル一覧を見た時、Windowsのフォルダの色が、緑背景に青文字でとても見づらいのです。 原因 Windowsのフォルダ・ファイルは、WSLから見ると、other userの書き込み権限がついてしまいます。 そして、「ls」のデフォルトのカラー設定では、other userの書き込み権限がついたフォルダは、緑背景に青文字になっているためです。 なので、「ls」のカラー設定を変更して対処します。 手順 流れ 「ls」のカラー設定は、環境
AWS Lambda と Serverless Framework を使って、簡単なSlack Bot(ボット)を作ってみたので、その作業メモです。 Slack Botの作成は手順が多く手間なのですが、AWS Lambdaを使うとサーバー周りのことを気にしなくて済みます。 また、Lambdaの開発にServerless Frameworkを使うと、面倒なAWSコンソールでの作業が不要になるので、割と手軽に作成できてオススメです。 Slack Botの概要的な説明とGUI作業は別記事にしましたので、Slack Botが全く初めての場合は、先にこちらを読んだ方が分かりやすいかと思います。 www.kwbtblog.com 本記事は主に、実装方法についてのメモになります。 Slack Bot作成のための要件 Slack Botを作るには、いくつか満たさないといけない要件があるので、その要件と解決
Jenkinsが動いているサーバーを変更したので、Jenkinsをバックアップして新しいサーバーに反映しました。 再び Jenkinsのバックアップが必要になった時用のメモ書きです。 概要 Jenkinsはよくできていて、Jenkinsのホームディレクトリーをまるままコピーして、移行先のJenkinsのホームディレクトリーに展開するだけです。 また、Jenkinsのホームディレクトリは環境変数「$JENKINS_HOME」に記載されています。 手順 echo $JENKINS_HOME Jenkinsのホームディレクトリを確認(ここでは「/var/jenkins_home」とします) cd /var tar zcf backup.tar.gz jenkins_home 「jenkins_home」ディレクトリを圧縮してファイル「backup.tar.gz」に保存 移行先にて cp back
日付で飛び飛びなデータを集計する時には、カレンダーテーブルが欲しくなることがあります。 Google BigQueryでは下記でカレンダーテーブルを作成できます。 「GENERATE_DATE_ARRAY()」でカレンダー配列が作れるので、「UNNEST()」で配列を行に展開してテーブル化します。 SELECT * FROM UNNEST( GENERATE_DATE_ARRAY( '2019-01-01', '2019-12-31', INTERVAL 1 DAY) ) AS date INTERVAL <INT> <DATE_PART>で日付間隔を変えれます。 例えば、毎月1日のカレンダーが欲しい場合は「INTERVAL 1 MONTH」とします。 上記例の引数「INTERVAL 1 DAY」はデフォルト値なので、書かなくても構いません。 関連カテゴリー記事 www.kwbtblog.
パワーポイントなどで図を描こうとすると、レイアウトやサイズなどがなかなか決められず、サクッと描くことができない性分です。 設定を変更できるから迷うのであって、いっその事、ガチガチに制約があった方が割り切れていいんじゃないかと、よくある、テキストで描かれた図を作成するツールを検討してみました。 そのようなツールはいくつかあるのですが、一番シンプルで分かりやすかった「Graph::Easy」を使ってみることにしました。 Graph::Easyの使い方はそれほど難しくないのですが、CUIツールなので使っていないとすぐに忘れてしまうため、個人用備忘録としてここにまとめました。 インストール Graph::EasyはPerlのモジュールなのでcpanを使ってインストール cpan Graph::Easy cpanが入っていない場合は下記でcpanをインストール sudo apt-get instal
あまり需要ないかも知れませんが、下記の「Arduinoで作成したUSB接続のPC音量調整ボタン」のRaspberry Piバージョンを作成したので、その手順と説明メモになります。 www.kwbtblog.com Raspberry PiをUSB機器(ガジェット)にするざっくりとした説明 通常、Raspberry Pi のUSB端子には、マウスやキーボードといったRaspberry Piで使う周辺機器を接続するのですが、Raspberry Pi Zeroは、PCとUSBケーブルで接続して、自分自身をPCのUSB機器(ガジェット)にすることができます。 USBにはOTGという、PC無しでUSB機器どうしを接続させる規格があって、それを使うとUSBの親になったり、子なったりできます。 そして、LinuxにはUSB OTGドライバーが入っているので、今回それを用いてRaspberry PiをUS
サイトに手軽にアクセス制限をかける方法としてBasic認証を使うことがあります。 Basic認証は便利なのですが、ブラウザがID・パスワードを覚えてくれなくて毎回入力する必要があったり、ID・パスワードを知っていれば誰でもアクセスできてしまうのが問題だったりします。 もう少しちゃんとした認証を入れたいのですが、認証システムを作るまではやりたくなく… そこで、Webサーバーの設定だけで、Basic認証の代わりにGoogle認証を使って、指定したGmailアカウントしかアクセスできないようにしてみました。 概要 WebサーバーにはNginxを使い、oauth2_proxyという認証周りの処理をやってくれるリバースプロキシを使用します。 Nginxにアクセスがあると、Nginxはoauth2_proxyに有効なユーザーかを問い合わせ、有効であれば次の処理、つまりサイト表示を行います。ユーザーが無
下記のようなディレクトリ構造において、バケット直下や、「dir_A1/dir_B1」直下のディレクトリ一覧をJSONで取得する方法。 s3://bucket_1/ dir_A1/ dir_B1/ dir_C1/ dir_C2/ dir_C3/ dir_A2/ dir_A3/ バケット直下の場合 $ aws s3api list-object-v2 --bucket 'bucket_1' --prefix '' --delimiter '/' --output json { "CommonPrefixes": [ { "Prefix": "dir_A1/" }, { "Prefix": "dir_A2/" }, { "Prefix": "dir_A3/" } ] } サブディレクトリ直下の場合 $ aws s3api list-object-v2 --bucket 'bucket_1' --
ラズベリーパイ単体でDockerを使う分にはいいのですが、ラズベリーパイをミニサーバー代わりにして、そこでDockerを使うのは使い勝手が良くないなぁという話です。 きっかけ 定期的にクロールを実行するサーバーを、デスクトップPCで動かしていました。 追々専用サーバーを用意するつもりだったので、サーバー移行しやすいようDockerを使用しました。 コンテナ構成は下記のとおりで、docker-composeで構成し、docker-machineでWindowsにHyper-VのDockerマシンを作成して、そのマシンにdocker-composeをアップしていました。 +-------+ +---------+ +-------------+ +---------------------+ | Nginx | --> | Jenkins | --> | Linux + SSH | --> |
次のページ
このページを最初にブックマークしてみませんか?
『www.kwbtblog.com』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く