カイワレの大冒険 Third

技術的なことや他愛もないことをたまに書いてます

初対面の人と円滑に話すコツ!これやってダメなら、相性あわないと思って諦めろ!

初対面の人と話すことが多いので、自分なりに工夫しているのですが、初対面の人と話すの苦手な人も多いと思うので、書いてみます(こういう自分も別に特段得意なわけではないです)。

話すことをパターン化しておく

知っている人と話すことに比べ、初対面の人と話すときは、かなりパターン化しやすいという特徴があります。

たとえば、こんな感じ。

  • 名前を聞いて
  • 仕事内容を聞いて
  • 休みの日は土日かどうかを聞いて
  • 休みの日に何しているか趣味は何かを聞いて
  • どのあたりに住んでるか聞いて

みたいなことを、流れに応じて、聞くのが王道のように思います。

名前を聞く

お名前はなんですか。すごく無難な質問ですし、これ聞かれて答えない人はほとんどいないんじゃないかっていうぐらい無難な質問です。 まず聞きましょう。

相手が答えてくれたら、どういう漢字で書くのかという質問や、こういう意味なんですかねみたいな意味を問うような質問とかもしてもいいかもしれません。

仕事内容を聞く

これも無難です。何をしているのかと聞く。エンジニアですとか、営業やってますとか、事務やってますとか。

そしたら、具体的に何をやっているんですかとか、土日はお休みですか、みたいな質問を更にしてもいいかもしれません。

まずこのあたりのキャッチボールを考える

まずここに述べた名前とか職業で会話のキャッチボールを心がけます。

質問しすぎないように、相手からの質問を待ったり、相槌を打ったりしながら、会話を続けます。

この辺で最低限会話できたら、次を考える。たとえば休日について。

それでキャッチボールをしている最中で、土日お休みですかとかを聞けたら聞いてみる。

事務されてるんですねー、どんなことやってるんですかー、ふーんじゃ土日は休めそうですねー。みたいな。 美容師なんですかー、じゃ土日も仕事ですよねー。みたいな。 医療系なんですかー、じゃ夜勤とかですかねー。みたいな。

休む時間ありますか?大変そう。リラックできてます?お休みの日は何してるんですか。みたいな。 と話を広げていく。

聞けたら、住んでいる地域とか

ここは話の盛り上がり方次第ですが、住んでいる地域や、生まれも聞けるといいですね。 ただし、あまりに距離がある状態で聞くと、相手はなんでそんなこと知りたいのかと警戒してしまう可能性があります。

15分とかある程度話が続いているときに、聞きましょう。

住んでいる地域がわかれば、あのあたり静かそうでいいですよねーとか、行ったことあります!とか。 生まれがわかれば、よく実家には帰りますかとか、行ったほうがいいところはありますかとか、聞けます。

ここまでをパターン化しておくと、最低限の会話は繋がるように思います。

飲み会とかで二人で話す時間が長いなら、そこから発展して、恋愛だったり、悩みだったり、色々繋げたいですが、まずはここまで頑張れるかどうかかなーと。

嫌われてもいいと思う

会話の流れをパターン化したら、次はメンタル面。 よく思っているのが、この人に嫌われても最悪いいやと開き直るということです。

初対面なので、最悪嫌われたら、もう会わなきゃいいだけだと思うことにしています。

もちろん、好きなタイプなどよく見せたがってしまう状況はどうしても出てきますが、極力最悪どうなってもいいやと思い、質問するようにしています。

実際自分に置き換えても、この人とはちょっと会わないかもと思うぐらいで、嫌うことはそこまでないですし、そこまでやばい状態になることは多分ないので、ある程度の適当さを持つようにしています。

一つ一つの会話をほりさげるように頑張る

ここまで述べたことを自分なりに工夫して会話していくのが大事ですが、そのときに一つの質問を浅くせず、深く掘り下げることを気にした方がいいと思います。

  • 名前→漢字→意味とか。
  • 仕事内容→具体的に→将来からの夢だったのか?→違うなら、元々はなんだったのかとか。
  • 趣味→毎週やってる?→運動好きなんですね→年取ってもやりたいですかとか。

とりあえず、一つのネタをとことん掘り下げます。

終わりに

正直ここまでやって、話が続かないとか、相手からボール飛んでこないとかは、相性が悪いとか、話しにくい人とか、別の問題な気がします。 もちろん、質問攻めにしたり、相手がボールを投げる時間を考えないとかは問題ですが、その辺ケアしても、うまくいかないのなら、いっそ気まずくてもしょうがないぐらいに開き直ったほうがいい気がします。

もちろん対人間ですので、パターンが効かないときもあるでしょうし、人によって差異はあるかと思いますが、おおよそなんとかなる気がします。

ということで、初対面の人との会話のコツを書いてみました。 何度も会ってる人との会話より、数倍楽だと個人的には思うので、是非参考にしてみてください!ではでは!

git resetを使って、単一のファイルをmasterに戻す

結論から言うとできない。

$ git reset --hard master FILE_NAME

的なことをやると、以下のように怒られる。

fatal: Cannot do hard reset with paths.

ハッシュしか指定できないらしい。

ので、正解はこっち。

$ git checkout master -- FILE_NAME

こちらもどうぞ。

blog.masudak.net

blog.masudak.net

var_dump()で省略されないように、全部出力する

眺めのSQLを var_dump()したら、以下の様な感じになった。

string(966) "SELECT
ここに長い文字列
hoge"...

... って置き変わってる・・・

ので、 var_dump() の前に以下を入れる。

ini_set('xdebug.var_display_max_children', -1);
ini_set('xdebug.var_display_max_data', -1);
ini_set('xdebug.var_display_max_depth', -1);

おわり。

BigQuery脱初心者を目指せ!今から覚えるべきテクニック3つ

CASEやJOIN、GROUP BYなども覚えて、SQLは大体大丈夫!となっている方も多いかもしれません。

しかし、BigQueryに触れるなら、もうちょっと覚えておいた方が楽になることが色々あります。

ので、覚えてみましょうと言う話。3つで十分なのかという声もあるでしょうが、ネタが出てこないので、3つで許してください。

1. TABLE_DATE_RANGE()

TABLE_DATE_RANGE() で、複数テーブルからフェッチ。

SELECT
  id
FROM
TABLE_DATE_RANGE([foo_dataset.], TIMESTAMP('2015-09-10'), TIMESTAMP('2016-06-15'))

ちなみに、 [] 使えば、テーブル名が日付だけでも大丈夫です。 それがないと、こんなエラーになるので、気をつけてください。

Encountered " "TIMESTAMP" "TIMESTAMP "" at line 5, column 51. Was expecting: ")" ...

2. JSON_EXTRACT_SCALAR()

JSON_EXTRACT_SCALAR() を使ってJSONを操ることができるので、やってみましょう。

こんな風にフェッチできます。

SELECT 
  JSON_EXTRACT_SCALAR('{"a": ["x", {"b": "foo"}]}', '$.a[1].b') AS str

結果はこんな感じ。a配列の1番目のキーbの値を取るということですね。

Row  str  
1   foo

ちなみに、JSON_EXTRACT() というのはありますが、その場合は以下のように返ってきます。

Row  str  
1   "foo"

ダブルクォートも一緒に文字列として返してしまうので、よほどのことがない限りはJSON_EXTRACT_SCALAR() のほうがよいでしょう。

もちろん、WHERE句でも使えますので、駆使できるとよいでしょうね。

3. CONTAINS

最後に CONTAINS 。上の項目でJSONをパースする方法をお伝えしましたが、BigQueryには、LIKE以外にも CONTAINS というのがあります。

こんな感じ。

SELECT
*
FROM dataset.table
WHERE sample_json CONTAINS "some_key"

正直、以下と何が違うのかはわからない。

SELECT
*
FROM dataset.table
WHERE sample_json LIKE "%some_key%"

まぁ、絞り込みができます。

ただ、JSONを対象にして、 CONTAINS を使いたい場合、もしキーが存在しているかどうかだけを見たいなら、以下の方がいいかも。

SELECT
*
FROM dataset.table
WHERE JSON_EXTRACT_SCALAR(sample_json, '$.a[1].some_key') IS NOT NULL

こうすることで、確実に some_key があるデータだけを抽出できます。

終わりに

簡単に書いてみましたが、いかがだったでしょうか。

BigQueryはもう何年も使っているのですが、未だに新たな発見があり、覚えることが非常に多くありますね。

その分便利だとは思いますので、是非みなさんも覚えてみましょう!

これ便利だよとかあれば是非教えて下さい!ではでは!

すぐループして処理しようという発想はやめよう!計算量考えることのススメ

配列とかにあるデータを一通り処理したいときはforとかforeachが便利なのですが、計算量を考えて、できるだけ使わないようにするのが大事という話。

$datas['key01'] = 1;
$datas['key02'] = 1;
$datas['key03'] = 1;

foreach ($datas as $key => $value) {
    if ($key === 'key01') {
        return true;
    }
}

こういうシンプルな処理でも、$datas配列の中身が1000万件などでかくなればなるほど、無駄な処理が増えてしまいます。

そんなときは、 isset() をうまく使うといいです。

PHP以外の言語でも計算量を調べた上で、適切な関数を使いましょう。

$datas['key01'] = 1;
$datas['key02'] = 1;
$datas['key03'] = 1;

$target_key = 'key01';
if (isset($datas[$target_key])) {
    return true;
}

これならループせず、1回で処理済みますね。

データ量が少ないうちから、出来る限り計算量が少なくなる癖をつけておくとよいでしょう。 ではでは!

P.S. 2016/06/15 追記

配列の要素確認と実行速度 : アシアルブログ によると、 isset() は計算量的にはO(1)とのことでした。総なめよりは早いですね。詳細なアルゴリズムはソース読んで勉強しておきますm( )m 詳しい方いましたらご教授ください。

前日と当日のテーブルに存在するデータをBigQueryで抽出する

何日連続ログインとかそういうデータ欲しくなったときに。

こんな感じ。

SELECT
  id
FROM
  dataset.20160610
WHERE id IN
(
  SELECT
    id
  FROM TABLE_DATE_RANGE([dataset.], DATE_ADD(TIMESTAMP('2016-06-10'), -1, 'DAY'), DATE_ADD(TIMESTAMP('2016-06-10'), -1, 'DAY'))  
)

コツは、 TABLE_DATE_RANGE() を使って、第二引数と第三引数に同じ日を DATE_ADD() で渡すこと。

ちなみに、テーブル名が、 yyyymmdd だけの場合は、 [] を使わないといけないらしい。初めて知った。

まぁ、プログラム側で1日前とか出せば、置き換えるだけでできるんだけど、ちょっとやってみたかったので。

ではでは!

連続する二つの処理はファイルを分けるべきか否か

Aを作ったのち、Aのデータ(IDなど)を使ってBを生成するコマンドがあったとする。

そのとき、 create_a_command.phpcreate_b_command.php という二つのファイルを作るべきか、 create_a_and_b_command.php というのを作るべきかという問題。

このとき、サービスクラスはAとBで分けるでいいと思うのです。こんな感じ。

a_service.php

class AService
{
    protected id;

    public function getId()
    {
        return $this->id;
    }

    public function setId($id)
    {
        $this->id = $id;
    }

    public function create()
    {
        $data->create();
    }
}

b_service.php

class BService
{
    protected $a_id;
    public function __construct($a_id)
    {
        $this->a_id = $a_id;
    }

    public function create()
    {
        $data->create($this->a_id);
    }
}

で、commandのほうをどうするか。

分ける場合

create_a_command.php

class CreateACommand
{
    $a_service = new AService();
    $a_service->create();
}

create_b_command.php

class CreateBCommand
{
    $a_service = new AService();
    $a_id = $a_service->getId();

    $b_service = new BService($a_id);
    $b_service->create();
}

そんで、コマンド実行時、&&を使う。

$ php create_a_command.php && php create_b_command.php

一つにする場合

create_a_and_b_command.php

class CreateAAndBCommand
{

    $a_service = new AService();
    $a_sercive->create();

    $a_id  = $a_service->getId();

    $b_service = new BService($a_id);
    $b_service->create();
}

んで、コマンド実行時は普通に実行する。

$ php create_and_b_command.php

こっちのほうがまとまってるということを伝えられるからこっちのほうがいい気はする。

ただ、cも作ることになったらファイル名がヤバイので、ファイル名は変えてもいいかもしれない。

終わりに

こういう普段悩みそうな設計って、参考書とかない気がするしなー。悩むほどでもないのかなー。

ご意見あれば是非是非!宜しくお願いします!ではでは!