エンジニアのひよこ_level10

毎日更新してた人。たまに記事書きます。

【GAS】スプレッドシート取得後の二重配列で、空の配列を消す関数を作る【202日目】

GASでスプレッドシート読み込むと二重配列が来る

sheet.getRange('A:A');

こんな感じにA列を取得すると、

 [[:ゆるふわ:], [ゆるふわ], [進捗どうですか?], [大好きだよっ], [にゃ〜], [今日も君は素敵だよっ], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], []]

とかなって、空の配列が混ざるのが非常に面倒。

[[:ゆるふわ:], [ゆるふわ], [進捗どうですか?], [大好きだよっ], [にゃ〜], [今日も君は素敵だよっ]]

こうなってほしい

こんな関数作る

function dropNullItemFromArray(array)
{
  var new_array = [];
  for each (var value in array) {
    if(value != null && value != "") {
      new_array.push(value);
    }
  }
  return new_array;
}

(本当はdropしてない)

のは置いておいて。これで空の配列をなくした配列が出来上がりました。

GASのテンプレートエンジンの書き方をLaravelと比較する【201日目】

新言語あるある

他言語覚える時には、自分の知ってる言語の知識を流用することで、覚えやすくなりますよね。

ということで、Laravel知ってる人がGASをとっつきやすくするための記法比較。

bladeを呼び出す

Laravel

return view('top.hello');

hello.htmlを呼び出す

return HtmlService.createTemplateFromFile("hello").evaluate();

スクリプトを直接記述

PHP: <?php

GAS: <? ?>

<ul>
<?
for(var i=0;i<10;i++){
    output.append('<li>' + i + '番目' + '</li>');
}
?>
</ul>

関数の出力結果を表示する

Laravel: {{ }}

GAS: <?= ?>

<?
function getWorld() {
    return 'World';
}
?>
<p>Hello <?= getWorld(); ?></p>

出力結果をエスケープさせない

Laravel: {! !}

GAS: <?!= ?>

<?!=
<style>
  body {
      font-size:14px;
  }
</style>
?>

参考記事

tonari-it.com

SQLで特定の文字を含むレコードを探す【200日目】

SQLで、特定の文字を探したい

messageカラムに、 ringoが含まれている文字列を探したい。

aoringoとか、akaringoとかがあるレコードを探したい。

こう書く

LIKE%を使おう

SELECT * FROM users WHERE message LIKE '%ringo%';

これで、usersテーブルの、messageカラムで、ringoという文字列が含まれているレコードを探す事ができる。

部下がやる気を出すために、伝えるべき要素3つ【199日目】

注意

これは、過去に参加したセミナーと、
私自身が部下として仕事をして、モチベーション高く仕事が出来た要素を
まとめたものになります。

あくまで参考程度にお願いします。

上司から仕事を振られた

上司「新しくこの仕事増えたよ、やっておいてね!」

の一言で、みなさん新しい仕事のやる気は出るでしょうか。

その上司と余程良い関係がないと普通は難しいと思います。
なので、最低限伝えるべきことを、上のセリフに付け加えて見ましょう。

やる意義

上司「この仕事、新事業として会社に新しい柱を作るための仕事なんだ。よろしく頼むよ。」

やりがいが出ますね。

この仕事にはこんな価値があるのか。
あるいは、この仕事をやると、未来がこう変わるのかというのがわかると、
ただ依頼されただけより、やる気が出ますね。

具体的なやり方

上司「新しいこの仕事、最初に○○して、その後○○すれば簡単にできるはずだ。よろしく頼むよ。」

やりがいではありませんが、具体的なやり方がわかっていると、
新しい仕事に対しても取り組みやすく、抵抗感は薄れます。

新人には意義だけ言われても、どうしたらいいかわからない人もいるので、 具体的なやり方を示すことも、何すればいいかわからない仕事よりもモチベーションが続きやすいです。

目標

上司「この新しい仕事、10日までにする必要があるんだ。よろしく頼むよ。」

期限があれば、その期限までにやろうという意志を持つことができます。
なんとなく仕事をするのは、モチベーションになりませんが、
やらなければならない、でも十分にやる理由になり、モチベーションになります。

それぞれ単体ではやる気になりにくい。

ただし、ここまで挙げたものは、全部がそのまま全員のモチベーションに繋がるかと言われたら、 そうではありません。

意義・やり方・目標、それぞれ人によってやる気になるポイントが違います。

また、3つ並ぶとかなり印象が変わると思います。

「この仕事、新事業として会社に新しい柱を作るための仕事なんだ」
「そのために、10日までにする必要があるんだ」
「最初に○○して、その後○○すれば簡単にできるはずだ」

なので、これらは最低限の内容と考えてもいいと思います。

そして最後に『優しさ』を付け加える

そして最後、一言でいいので『よろしく頼むよ。』なり『新しい仕事で戸惑うかも知れない、気軽に声をかけてくれ』等、
あなたらしい優しさを付け加えておくと、より良いかもしれません。

ココらへんは各々の腕の見せどころになると思います。

個人的な思い

自ら仕事をするではなく、部下に仕事をしてもらうというのは、大変だと思います。
なんでやる気出さないんだと思うことは多々あると思います。

ええ、すみません、本当に先輩方、扱いにくい私ですみません。

なので、いろいろ勉強して私もその時が来るまでに備えておこうと思います。
そして、過去先輩方が苦しんだものを体験しようと思います。

いい方法が見つかったら、シェアしたいな。

SQL文で’INSERT INTO Pages VALUES(?, ?, ?)'のように、?を使う理由【198日目】

こんな時ありませんか

SQL文を見た時に、

INSERT INTO Pages VALUES(?, ?, ?)"

こんな感じに、一部に?が使われている時。

どんなことになるの?

?のところに、あとで数値を入れます。

PDOの時の例で言うと、

$dbh->prepare("INSERT INTO Pages VALUES(?, ?)")
    ->execute(array(1, 'Etc'));

こうすると、SQL文の ?にexecuteの配列が順番に入って、

INSERT INTO Pages VALUES(1, 'Etc');

みたいになります。

何が嬉しいの?

SQLインジェクションと呼ばれるWebサイトの攻撃対策になります。
ユーザーが意図して悪い入力をすることで、パスワードが漏洩したりするのを防ぐ事ができます。

普通に書くと困る理由

$dbh->exec("INSERT INTO Pages VALUES(" . $id . "," . $name .")");

こんな感じだとなぜダメなのか。

例えば、今回の例で言うと、$idと$nameに入る値をユーザーに入力させる時に、

$id = 1;
$name = "ETC); SELECT * From Pages;(";

という入力がされると、SQL文は

INSERT INTO Pages VALUES(1, ETC); SELECT * From Pages;()

SELECT * From Pages;が余分に実行されます。
もし、SQL文の結果を出力するシステムなら、Pagesテーブルの内容がユーザーに見られてしまう。

ただ、 ?を使うことによって、
VALUEの第一引数は1、
第二引数は"ETC); SELECT * From Pages;("という文字列、と捉えてくれるようになります。

公式ドキュメント

PHP: SQLインジェクション - Manual

【PHP】PDOで、エラーが出たら今までの変更なかったことにする方法【197日目】

どんな時につかう

基本はbegin commit rollbackの話。

// 1個目
$sth = $this->dbh->prepare("INSERT INTO Pages VALUES(?, ?, ?)");
$sth->execute(array(1, 'Etc', date('Y-m-d H:i:s')));

//typo
$sth = $this->dbh->prepare("INSERT ITO Pages VALUES(?, ?, ?)");
$sth->execute(array(1, 'Uiro', date('Y-m-d H:i:s')));

あ。INTOがイトーになってる。タイポしてる。でも1個目動いちゃういやあああああ
とか、2個目がエラー出ちゃった時とかに、1個目だけは動いちゃうのを防ぐ

全部正しく動いた時だけ、SQL動かしたいときとか!

コード(まとめは最後)

1.たいぽでもエラーを投げるハンドラ生成

$dbh = new PDO('mysql:host=mysql;dbname=dbname',
                'username',
                'password',
                array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));

2.これからやるSQLは、Commitするまで動かしちゃだめだよってする

$dbh->beginTransaction();

3.正しく動けばcommit(実行)、失敗したら、rollback(なかったこと)する

$dbh->commit();
$dbh->rollback();

まとめるとこんな感じ

$dbh->beginTransaction();

try {
    // SQL文動かす
    $sth = $this->dbh->prepare("INSERT INTO Pages VALUES(?, ?, ?)");
    $sth->execute(array(1, 'Etc', date('Y-m-d H:i:s')));

    $dbh->commit();
} catch (PDOException $e) {
    $dbh->rollback();
    exit($e->getMessage());
}

公式ドキュメント

PHP: トランザクションおよび自動コミット - Manual

ブログ更新時、Slackに通知を送るやつの補足・蛇足【196日目】

いい感じに記事まとめてくれた

いい感じにやり方記事まとめてくれたので、シェア!
ちょこっと補足があるので書きますね。

https://shiwataro.com/2018/04/27/post-215/shiwataro.com

補足

最初にすること、RSSをSlackと連携

get.slack.help

コマンドがちょっと違う

自分のブログのURL/feed
↑これははてなブログの時

フィードのアドレスがドメイン+feedとは限らないので注意。
https://www.cccxxx.com/blogs/rss.xml

とかね。下みたいに、フィードURLを探してくれるサイトとかもあるらしい

https://berss.com/feed/Find.aspx

蛇足

コマンドの単語の意味を考えてみる。

feed

Webサイトが更新情報やページの一覧や概要などをまとめたデータ。xml形式とかで保存されたファイル。

http://willow710kut.hatenablog.com/feed

私のfeedURLが↑なので、これ直接アクセスすると、どんなファイルかわかりますよ!

subscribe

定期利用、継続利用するサービスがサブスクリプション方式と呼ばれているので、
subscribe + URLで、このURLを定期購読するみたいなイメージ。

【PHP】PDO使ってSQL文タイポした時にExceptionを投げる【195日目】

こんな時に使う

(PDO使う時ほぼないというツッコミは置いておいて)

 $dbh->exec('CREATE TBLE Pages (id int, name nchar(255), create_date datetime)');

あ、 TABLETBLEになってる。
でもエラー出てないから気づかなかった・・・

って時に、エラーを投げてやりたい。

こうかく

PDOのオブジェクトを生成する時に、
第四引数に、 array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION)を渡してやる。

$dbh = new PDO('mysql:host=mysql;dbname=dbname',
                'username',
                'password',
                array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));

これで、構文間違えた時もエラーが出る。
try catchとかで、rollbackさせたい時とかどうぞ。

公式ドキュメント

PHP: PDO::__construct - Manual

ここで使うOption

PHP: 定義済み定数 - Manual