仕事で CSV データを調査する機会があったので、なんとなく CSV Viewer を調べてみたら「Excel Viewer」というめちゃくちゃ便利な Visual Studio Code の拡張があったというお話しです。
要はこれなんですが…
さっそく、サンプルとして郵便局サイトにある東京の住所一覧で見てみます。
普通に開くとこうなるのは通常通りで、、
ここで Open Preview すると…
サクッとこうなります。
拡大するとこう。生の CSV よりは段違いに見やすいですね。
まずそれだけでも十分なのですが、
なんと、Sort や Filter もサクサク動きます。CSV であることを忘れるぐらいに。
もう、Excel に CSV 食わせて、「前0が消えてる」とか「日付が数値になった」とか「いったん全部文字列にしてー」とかやらなくて良さそうです。素晴らしい。
一応 これ、CSV 以外に Excel も開けますが、Excel は Excel で見たほうが良いねって感じの微妙な動きでした。あと、Powered by Wijmo とのことで、中身は FlexGrid と FlexSheet が動いているっぽいです。GrapeCity、懐かしい響きです。
それでは。
2018年3月15日木曜日
2018年3月10日土曜日
PHP のシステムから SendGrid を使ってみました。
メール送信機能を追加する機会があったのですが、サーバに何も設定されておらず、Dev や Staging など複数台のサーバに作業するのは面倒だなぁと。。
じゃぁ SendGrid を使って見ようということでやってみたら、驚くべき楽さで出来たという話です。。
API KEY は SendGrid の管理画面で取得します。
KEY 毎に細かく権限を設定できるようです。
【Create & View】を押下すると Key が表示されます。
こんな感じ。
1回きりしか表示されません。【Done】を押下するとその後は「*****」とマスクされた状態でしか見れません。忘れたら削除するのみ。
じゃぁ SendGrid を使って見ようということでやってみたら、驚くべき楽さで出来たという話です。。
- API KEY を取得する
- composer で library を install
- サンプルのママでメールが届く
正味30分もかかららず終わりました。。
サーバをアレアレ弄ってるとあっという間に1時間くらいたつので、ダンチです。
API 経由であれば、送信に失敗したときのエラーもしっかり返してくれるので、mail() や mb_send_mail() よりも優しい。。
API KEY を取得する
早速やった内容ですが、API KEY は SendGrid の管理画面で取得します。
KEY 毎に細かく権限を設定できるようです。
【Create & View】を押下すると Key が表示されます。
こんな感じ。
1回きりしか表示されません。【Done】を押下するとその後は「*****」とマスクされた状態でしか見れません。忘れたら削除するのみ。
composer で library を install
GitHub repository の README にあるように、composer が使えるので composer.json に以下の記述をして、composer install するだけ。
{
"require": {
"sendgrid/sendgrid": "~6.0"
}
}
https://github.com/sendgrid/sendgrid-php
サンプルのママでメールが届く
これも同 README にあるように書いて、API KEY と to のメアドだけ書き換えれるだけ。
// If you are using Composer (recommended)
require 'vendor/autoload.php';
// If you are not using Composer
// require("path/to/sendgrid-php/sendgrid-php.php");
$from = new SendGrid\Email("Example User", "test@example.com");
$subject = "Sending with SendGrid is Fun";
$to = new SendGrid\Email("Example User", "test@example.com");
$content = new SendGrid\Content("text/plain", "and easy to do anywhere, even with PHP");
$mail = new SendGrid\Mail($from, $subject, $to, $content);
$apiKey = getenv('SENDGRID_API_KEY');
$sg = new \SendGrid($apiKey);
$response = $sg->client->mail()->send()->post($mail);
echo $response->statusCode();
print_r($response->headers());
echo $response->body();
https://github.com/sendgrid/sendgrid-php
これだけで(躓きもなく)動きました。素敵ですね。
料金体系もやたら優しいので、わざわざメールの設定するぐらいならこっちのがいいやと感じました。
これだけで(躓きもなく)動きました。素敵ですね。
料金体系もやたら優しいので、わざわざメールの設定するぐらいならこっちのがいいやと感じました。
2018年2月28日水曜日
MariaDB + DBeaver で、日付の扱いに不安があるという話
まず前提として、DBeaver はお気に入りです。
"25:45:00" とか "-40:00:00" という、「時刻」のフォーマットとしては許可されない値まで入るという。
ある時、DBeaver がこんな表示をしていました。
ところが、SQL を close_time = "02:00:00" としても取得することができません。
書きこんではどうかと、close_time に書き込んでも、思った通りの値が入りませんでした…
もしやと思い command でデータを取得してみると、、
あらどうして、DBeaver が表示する値と異なっているではありませんか。
そう、これは「時刻として正しくない時間を表示できない」という DBeaver のバグだったのです。やれやれ。。
DBeaver での表示はこうで、2番目のデータが取得できていませんでした。
さすがに今度はそこまで悩む前に、MySQL Workbench で確認してみました。
すると。。。
なんということでしょう。
今度は「0000-00-00」を NULL と表示してしまうバグにぶち当たったのでした。。。
この日が DBeaver に初めて Issue 登録した日になりました。
DBeaver はマイナーな DB にも All-in-one で対応しているので、細かい方言に対応しきれていないようです。
ただ、UI も機能もスピードも優秀なので、もちろんこれからも使っていきます。
お世話になってるので、PR を送るぐらいしても良いかなと思いました。
MySQL Workbench から完全卒業できる日はまだのようです。
無料で使える質の良い SQL Client ですが、完璧はものは存在しないわけで、、
それは TIME 型 から始まった
MariaDB には TIME 型というデータ型があります。この通り、ちょっとした範囲の時間(時刻でなく) を格納できる型です。Description
A time. The range ishttps://mariadb.com/kb/en/library/time/'-838:59:59.999999'
to'838:59:59.999999'
. Microsecond precision can be from 0-6; if not specified 0 is used. Microseconds have been available since MariaDB 5.3.
"25:45:00" とか "-40:00:00" という、「時刻」のフォーマットとしては許可されない値まで入るという。
ある時、DBeaver がこんな表示をしていました。
ところが、SQL を close_time = "02:00:00" としても取得することができません。
書きこんではどうかと、close_time に書き込んでも、思った通りの値が入りませんでした…
もしやと思い command でデータを取得してみると、、
あらどうして、DBeaver が表示する値と異なっているではありませんか。
そう、これは「時刻として正しくない時間を表示できない」という DBeaver のバグだったのです。やれやれ。。
NULL が抽出できない
そんなことを忘れた頃に、今度は「NULL の日付が取得できない」という問題が発生しました。DBeaver での表示はこうで、2番目のデータが取得できていませんでした。
さすがに今度はそこまで悩む前に、MySQL Workbench で確認してみました。
すると。。。
なんということでしょう。
今度は「0000-00-00」を NULL と表示してしまうバグにぶち当たったのでした。。。
この日が DBeaver に初めて Issue 登録した日になりました。
DBeaver はマイナーな DB にも All-in-one で対応しているので、細かい方言に対応しきれていないようです。
ただ、UI も機能もスピードも優秀なので、もちろんこれからも使っていきます。
お世話になってるので、PR を送るぐらいしても良いかなと思いました。
MySQL Workbench から完全卒業できる日はまだのようです。
2018年2月27日火曜日
キーボードで Google 検索する拡張機能を作りました
Google 検索ですが、いつも j k / Enter を超多用して検索しています。
で、このショートカットキーは元々ある機能だったのですが、あるとき無くなりました。
Google 検索から Google+ が外されたタイミング? だったな、、
それと一緒に消え失せました。
なので、自分で作りました。Chrome の拡張機能です。
もし無くなって未だに不便を感じている方はどうぞ。
キーボード使ってなかった、という方は今すぐ使ってください。効率がダンチです。
こんな感じで ▶ が表示されます。
以下だけのシンプル機能です。
ブラウザ標準のショートカットと合わせるのが常套手段です。
Google Search with Keyboard
https://chrome.google.com/webstore/detail/google-search-with-keyboa/ickgeahkgnomlmmmpmhllbfmbncjcnel?hl=ja
どうぞ!
コードはこちら
https://github.com/jtanaka/GoogleSearchWithKB
で、このショートカットキーは元々ある機能だったのですが、あるとき無くなりました。
Google 検索から Google+ が外されたタイミング? だったな、、
それと一緒に消え失せました。
なので、自分で作りました。Chrome の拡張機能です。
もし無くなって未だに不便を感じている方はどうぞ。
キーボード使ってなかった、という方は今すぐ使ってください。効率がダンチです。
Google Search with Keyboard
こんな感じで ▶ が表示されます。
以下だけのシンプル機能です。
- j : 下を選択
- k : 上を選択
- / : 入力ボックスへ移動
ブラウザ標準のショートカットと合わせるのが常套手段です。
- Enter : 選択中のリンクへ遷移
- Ctrl + Enter : 選択中のリンクを新規タブで開く
Google Search with Keyboard
https://chrome.google.com/webstore/detail/google-search-with-keyboa/ickgeahkgnomlmmmpmhllbfmbncjcnel?hl=ja
どうぞ!
コードはこちら
https://github.com/jtanaka/GoogleSearchWithKB
2018年2月26日月曜日
Steam に OpenID で接続する
Steam Web API の続きです。
自分のアカウントで Sign in する機能を忘れていたので実装してみました。
接続には、ここで紹介されていた LightOpenID を使います。
以前に作成した対戦履歴を表示するコードを、以下のように変更しました。
index.php
Sign in は別のファイルで実装しました。
auth.php
実際に動かせるサイトを準備しました。
コードはこちら。
https://github.com/iignatov/LightOpenID/blob/master/examples/example.php
自分のアカウントで Sign in する機能を忘れていたので実装してみました。
↓こういうやつ
Steam には OpenID で接続します。
https://steamcommunity.com/dev
接続には、ここで紹介されていた LightOpenID を使います。
以前に作成した対戦履歴を表示するコードを、以下のように変更しました。
- Steam ID をセッションから取得する
- 無ければ Sign in させる
- API Key を環境変数から取得する
session_start();
if (!isset($_SESSION['steam_id'])) {
// Require sign in.
echo "
<div style='text-align:center'>
<p><a href='/auth.php'><img src='http://steamcommunity-a.akamaihd.net/public/images/signinthroughsteam/sits_02.png' width='109' height='66' border='0'></a></p>
<p>Please sign in.</p>
</div>
";
} else {
// https://gist.github.com/almirsarajcic/4664387
function convert_steamid_64bit_to_32bit($id)
{
$result = substr($id, 3) - 61197960265728;
return (string) $result;
}
function convert_steamid_32bit_to_64bit($id)
{
$result = '765'.($id + 61197960265728);
return (string) $result;
}
$key = getenv("STEAM_API_KEY"); // Set API key from environment variable.
$steamid = $_SESSION['steam_id']; // Set target's steam id here.
echo "<h2>SteamID : {$steamid}</h2>";
$accountid = convert_steamid_64bit_to_32bit($steamid);
echo "<h2>accountid : {$accountid}</h2>";
$curl = curl_init();
// ヒーローリストを取得する
curl_setopt($curl, CURLOPT_URL, "https://api.steampowered.com/IEconDOTA2_570/GetHeroes/v1?key={$key}");
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$json = curl_exec($curl);
$response = json_decode($json);
$heroes = [];
foreach ($response->result->heroes as $hero) {
$heroes[$hero->id] = str_replace("npc_dota_hero_", "", $hero->name);
}
// 対戦履歴を取得する
curl_setopt($curl, CURLOPT_URL, "https://api.steampowered.com/IDOTA2Match_570/GetMatchHistory/v1?key={$key}&account_id={$accountid}");
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$json = curl_exec($curl);
$response = json_decode($json);
curl_close($curl);
// 対戦履歴一覧を表示する
foreach ($response->result->matches as $match) {
$start_time = new DateTime('@' . $match->start_time);
foreach ($match->players as $player) {
if ($player->account_id == $accountid) {
$hero_name = $heroes[$player->hero_id];
$img = "<img src='http://cdn.dota2.com/apps/dota2/images/heroes/{$hero_name}_sb.png'>";
}
}
echo "
<div>
{$start_time->format('Y/m/d H:i:s')}
{$img}
</div>
";
}
}
Sign in は別のファイルで実装しました。
<?php
include_once("../vendor/autoload.php");
$openid = new LightOpenID("https://test-steam-web-api.azurewebsites.net");
$openid->identity = "http://steamcommunity.com/openid";
$openid->returnUrl = "https://test-steam-web-api.azurewebsites.net/auth.php";
if (!$openid->mode) {
header('Location: ' . $openid->authUrl());
} elseif ($openid->mode == 'cancel') {
header('Location: /');
} else {
if ($openid->validate()) {
session_start();
$claimed = explode("http://steamcommunity.com/openid/id/", $openid->identity);
$steam_id = $claimed[1];
$_SESSION['steam_id'] = $steam_id;
}
header('Location: /');
}
exit;
実際に動かせるサイトを準備しました。
コードはこちら。
参考
https://steamcommunity.com/devhttps://github.com/iignatov/LightOpenID/blob/master/examples/example.php
2018年2月25日日曜日
Steam Web API で Dota2 の対戦履歴を表示する
Steam Web API の続きです。
自分の Dota2 の対戦履歴を取得するところまでやってみました。
使う API は以下の2つ。
あと、画像を取得するのに CDN を利用します。
これらを組み合わせて、対戦履歴を表示してみました。
コードはこんな感じに。
https://github.com/jtanaka/test_steam_web_api
実行するとこんな感じに。
無事表示することができました。
ここまで確認できればサービス作れますね。
自分の Dota2 の対戦履歴を取得するところまでやってみました。
使う API は以下の2つ。
あと、画像を取得するのに CDN を利用します。
- http://cdn.dota2.com/apps/dota2/images/heroes/<name>_<suffix>
http://cdn.dota2.com/apps/dota2/images/heroes/pangolier_lg.png
これらを組み合わせて、対戦履歴を表示してみました。
コードはこんな感じに。
// https://gist.github.com/almirsarajcic/4664387
function convert_steamid_64bit_to_32bit($id)
{
$result = substr($id, 3) - 61197960265728;
return (string) $result;
}
function convert_steamid_32bit_to_64bit($id)
{
$result = '765'.($id + 61197960265728);
return (string) $result;
}
$key = "YOUR_API_KEY"; // Set Your API key here.
$steamid = 76561197961028586; // Set target's steam id here.
echo "<h2>SteamID : {$steamid}</h2>";
$accountid = convert_steamid_64bit_to_32bit($steamid);
echo "<h2>accountid : {$accountid}</h2>";
$curl = curl_init();
// ヒーローリストを取得する
curl_setopt($curl, CURLOPT_URL, "https://api.steampowered.com/IEconDOTA2_570/GetHeroes/v1?key={$key}");
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$json = curl_exec($curl);
$response = json_decode($json);
$heroes = [];
foreach ($response->result->heroes as $hero) {
$heroes[$hero->id] = str_replace("npc_dota_hero_", "", $hero->name);
}
// 対戦履歴を取得する
curl_setopt($curl, CURLOPT_URL, "https://api.steampowered.com/IDOTA2Match_570/GetMatchHistory/v1?key={$key}&account_id={$accountid}");
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$json = curl_exec($curl);
$response = json_decode($json);
curl_close($curl);
// 対戦履歴一覧を表示する
foreach ($response->result->matches as $match) {
$start_time = new DateTime('@' . $match->start_time);
foreach ($match->players as $player) {
if ($player->account_id == $accountid) {
$hero_name = $heroes[$player->hero_id];
$img = "<img src='http://cdn.dota2.com/apps/dota2/images/heroes/{$hero_name}_sb.png'>";
}
}
echo "
<div>
{$start_time->format('Y/m/d H:i:s')}
{$img}
</div>
";
}
実行するとこんな感じに。
無事表示することができました。
ここまで確認できればサービス作れますね。
参考
https://wiki.teamfortress.com/wiki/WebAPI#Dota_22018年2月24日土曜日
Windows で高速に Git clone する方法
Windows 環境で開発しているとき、 どうやって Git clone していますか。
実はコマンドは、エクスプローラーのアドレスバーに直接打ち込めます。
Powershell を開くときなども、ここに "powershell" と打ち込むとディレクトリを移動しなくて良いので楽です。
実はコマンドは、エクスプローラーのアドレスバーに直接打ち込めます。
Powershell を開くときなども、ここに "powershell" と打ち込むとディレクトリを移動しなくて良いので楽です。
登録:
投稿 (Atom)