指定キーの重複があればランダムでひとつだけ抽出したいっていう要望をMySQLで叶える話をパワプロで例えた話

今までに自分が育ててきた選手のデータベースがあるとするじゃろ。

 

id | 選手名 | 高校  | ポジ | ランク

 1 | もちこ | パワ校 | 投手 | A

 2 | よしこ | 脳筋 | 野手 | B

 3 | さちこ | 脳筋 | 投手 | C

 4 | よしお | 覇道  | 内野 | C

 5 | もっち | パワ校 | 保守 | A

 6 | ぽんた | 脳筋 | 投手 | D

 7 | さかな | 瞬鋭  | 内野 | C

 8 | ゴリラ | パワ校 | 外野 | S

 9 | さとし | 北雪  | 投手 | B

 

たとえば、誰かに自分が育ててきた選手を自慢したい。

しかも、ひとつの高校につきひとりずつ自慢したい。

さらに、その一人っていうのも一番強い人とかじゃなくて、ランダムで自慢したい。

全ての子を自慢する機会がほしい。

とする。

 

その場合、MySQLのこんな書き方でどうじゃ。

 

SELECT  *

FROM  (

    SELECT id,  選手名, 高校, ポジ, ランク,  RAND() as r

    FROM  選手データ

    ORDER BY r

)    AS  pre

GROUP  BY  高校 ;

 

取得するデータをランダムに並び替えるために

選手データテーブルに乱数を振ってオーダーバイ

それをSELECTで参照、高校名でグループ化。

 

 こうすることで、

 

id | 選手名 | 高校  | ポジ | ランク | r

 3 | さちこ | 脳筋 | 投手 | C   | 0.0954203…

 4 | よしお | 覇道  | 内野 | C   | 0.1549204…

 7 | さかな | 瞬鋭  | 内野 | C   | 0.4970004…

 8 | ゴリラ | パワ校 | 外野 | S   | 0.5970679…

 9 | さとし | 北雪  | 投手 | B   | 0.6087944…

 

こんなかんじのデータがとれて、

SQLの実行ごとに、いろんな生徒が現れるよ!

 

各カテゴリの登録ユーザーを均等に露出させたいときとかにも

ちょっとつかえるとおもうんじゃ。

twitterAPIでメールアドレス取得したくてwhitelist(ホワイトリスト)申請?ぽいことをした

whitelist(ホワイトリスト)って言うのかもはや言わないのか、ちょっと曖昧だけど。。

 

 

まず目的。

webサービスに「twitterでログイン」的な機能をつけたい。

・メールアドレス必須サービスなので、APIでemailも取得したい。

・それにはどうやら通常の権限ではだめそう。なので、なんとかしたい。

 

twitter api mailaddress」とかで検索すると、

whitelistへの申請が必要!twitterに申請しよう!的な記事や、

whitelistの認可はすでに終了した、みたいな記事が。

 

あとは海外ドキュメントばっかりで、はて。状態に。。

 

「とりあえず問い合わせが必要」っていう情報だけ持っていたので、

手探りで、以下のページからスタート。

 

dev.twitter.com

f:id:kenmochixx:20160808162929p:plain

 

Request a User’s Email Address
Requesting a user’s email address requires your application to be whitelisted by Twitter. To request access, please use this form.

おやおや。whitelistの文字があるじゃないの!

use this formのリンクを辿った先がこちら。

 

Twitter API Policy Support | Twitter Help Center

f:id:kenmochixx:20160808163621p:plain

 

ほうほう。ちょっとそれっぽいけどwhitelistの文字なし。

とりあえず特別な権限へのアクセスが必要ですをチェックしたら、

申請フォームっぽいフォームが出現。。

 

f:id:kenmochixx:20160808163625p:plain

 

ここの画面で、すでに作成していたログインアプリの情報を入力。

へんてこな日本語項目「権限がリクエストされました」

=English表示だとPermissions Requested」らしいので、

email permissions プリーズ! 的なことをダメ押しで記入\(^o^)/

 

送信したらthanks画面になったので、とりあえずミッションクリア!

お返事くれるらしいので、あとは寝て待つことに。

 

 

~翌日~

 

脅威のスピードで返信が!

Request Email Access Granted
Hello xxx, Thanks for reaching out. We've enabled requesting email permissions for your app. Please note that this permission is only enabled on new sign-ins to your app. In order to begin, please log into apps.twitter.com andAdd a terms of service and privacy policy to your app infoChange your token's scope to request emailRegards,
Twitter Platform Operations

 

 

 おやおやと思いつつアプリの設定ページにいくと

 

f:id:kenmochixx:20160808172003p:plain

 

あ!

 

f:id:kenmochixx:20160808172211p:plain

 

地味に増えてる!

 

Permissionsのページでも、今までは

Request email addresses from users

 の項目をチェックしても

Error

The client application failed validation: You must provide URLs to both your application's Terms and Conditions and Privacy Policy before your application can be configured to request email addresses..

 と言われてしまっていたものが、

 

f:id:kenmochixx:20160808163318p:plain

 

success!\(^o^)/

 

ただ、設定ページ内ではwhitelistの文字がないので、

この「特別な権限」の正式名称はやっぱりいまいちわからず。

 

 

whitelistって名前にふりまわされた感あるのと、

英語ばかりでめちゃエネルギー消耗したので、

同じく英語苦手な誰かのお役にたちますように。

【未解決】DB設計でフラグの扱いあれやこれや

ある「通知」を操作するカラムを新設する際に。。

 

・全て通知される

・ある条件下のみ通知される

・全く通知しない

 

っていうかんじの定義をしたいとして、

かつ、ある条件下ってのが今後増設が考えにくい(しかし未来永劫ないとは言い切れない)場合、

 

0 == 全く通知しない

1 == ある条件下のみ通知される

2 == 全て通知される

 

とするのがいいか

 

-1 == 全く通知しない

0 == 指定なし(全て通知される)

1 == ある条件下のみ通知される

 

とするのがいいかで悩む。

 

 

前者は、defaultとして2をDBに放り込むのがちょっと気持ち悪く感じるけど、直感的にわかりやすい気がする。

結論からいうと今回はこちらを採用。

万が一ここに並列に足したい「条件」が増えたときに、ちょっと詰むだろうなとは思いつつ。

 

後者は、「何か特別な条件下だけ発動させる」という面で扱いやすそう。

汎用性はこっちの方があるかもしれないけど、複合的な条件を設定したい場合、

きっとカラムを新設することになる。予感がする。

 

ちなみに

0 == 通知しない

1 == 通知される

にしといて、別カラムで

0 == 条件なし

1 == 条件の指定

2 == 条件の指定

3 == 条件の指定

ってするのも考えたけど、オーバーすぎる気がして今回は不採用。

 

 

すごいよくあるちょっとしたことなんだけど、

他の人はどんなふうに定義しているのか気になった事案でした。

【セミナー】さくら×モリサワ webフォントの夕べにいってきました

さくらのレンタルサーバーモリサワフォントが使えるようになると耳にし、

併せて開催されたセミナーにひょこひょこ参加。

www.sakura.ad.jp

 

以下備忘録。

ーーー

#さくら×モリサワ webフォントの夕べ

 

##webフォント最新事例紹介

株式会社モリサワ エンタプライズ営業本部 菊池諒さん

 

###webフォントのメリット

・イメージの統一
・制作の手間を大幅改善
・レスポンシブ対応
・情報の検索性向上
 googleで優遇される事も。思いがけない上位表示に繋がる ←衝撃※あとで調べる

 

さくら×モリサワのwebフォント提供はwordpress経由のみ!!!!

フォントで一番見分けやすいのは「な」

 

あとは使用サイトの事例共有でした。

やっぱフォントが綺麗だとそれだけでおしゃれ~~~かっこいい~~~。

会社のコーポレートwordpress、さくらのレンサバにのせかえたし、、。

 

##アイコンフォントinさくらのVPSコントロールパネル

さくらインターネット UXデザイングループマネージャー 河原覚さん

 

###アイコンフォントのつくりかた

1.サイズを決める
2.グリッドを設定
3.描く
4.SVGにする
5.webフォントにする

 

たとえば14px、16pxが基準のサイトなら

14px 14×128=1792px
16px 16×128=2048px

 

###アイコンフォント綺麗に見せるコツ

・14の2分割などでグリッドをひく
・線の幅、カーブ始点終点のエッジなどグリッドにあわせると奇麗
・最後に複合パスにするとSVGにしたときに壊れない
・iconMoon - https://icomoon.io/
・GRUNT webfont

 

本題と違うかもしれないけど、グリッドの使い方が実践的でとても参考になた!

 

##(急遽)Wordpressでのフォント設定講座

さくらインターネット ナカジマさん
さくらサーバーコントロールパネル・webフォント利用ドメインの設定

独自ドメインの設定(wordpressプラグイン)※ドメインひとつまで

 

##フォント設定講座

さくらインターネット 谷口さん

 

###上級者向けのカスタマイズ

ウィジェットにはデフォルトで適応されない
・font-familyの指定!importantなどで魔改造するしかない
プラグインアップデートでとれちゃうかもね

 

###webフォントの表示速度について

・いらない文字を配信してる(サブセット化してない)
・配信元が海外(google)
モリサワxさくらはページ内で使ってる文字だけ
→国内IDCより配信

・一般的なwebサイト(文字数2,731)
webfont off-on
84kb-184kb
2.0sec-2.6sec
・一般的じゃないほど文字量の多いサイト(文字量40,000〜)
2.5sec-3.4sec
→画像の方が格段に重いよね

 

###webフォントの用途

・見た目のインパク
・読みやすいUD書体を使いたい
・CSS3のテキストエフェクトを使いたい

 

 

##質疑応答

###font-weightの指定は?

weightを含んだデザインになっているので、基本はfont-family名で指定。(m,lとか)

 

###wordpressでデフォルトフォント→webフォント切り替えのカクつきが嫌

wordpressの場合デフォルトフォント非表示の制御をしてるから大丈夫です

 

ーーー

 

会場でもらったフォーチュンクッキーがやたらおいしかった。ごちそうさまでした。

mysqlチューニング。遅いクエリをログに残すslow_query_logめもめも

vi /etc/my.cnf

[mysqld]

slow_query_log = 1
slow_query_log_file = /var/log/mysql-slow.log
long_query_time = 0.1

mysqlの設定ファイルにかきかき。

上記は0.1秒以上のクエリを記録する場合。

 

 

ログをためるファイルを作っておく。

vi /var/log/mysql-slow.log

 

 

所有者をmysqlに。

chown mysql.mysql /var/log/mysql-slow.log

 

 

mysqlで設定の確認

show variables like 'slow%';

 

 

mysql再起動。

service mysqld restart

 

5.1.73と5.6.19どちらもこれで動きました。

おわり!

twitterボタンのツイート数バルーンがいつのまにか死んでたのでザオラルした話

ザオリクではない←ポイント

 

情弱なので全く知らなかったんだけど、

ツイートボタンのツイート数が11/21におわったっぽい。。

blog.twitter.com

 

その結果、サイトで使ってたやつーがこうなった。

 

f:id:kenmochixx:20151125182826j:plain

 

だっさ!!!!!!!!

 

なげいてたところ、こんな素敵なAPIを発見。

ディジティ・ミニミ社の「widgetoon.js」と「count.jsoon」!

ツイートの収集と、URLのカウントをやってくれるそうな!

 

使い方は簡単で、

http://jsoon.digitiminimi.com/

↑にURL登録。したら自動で収集しといてくれる。

 

で、サイトに設置。

<script type="text/javascript" src="http://jsoon.digitiminimi.com/js/widgetoon.js"></script>

 でJSを読み込んで、

ツイートボタン&ツイート数バルーンを表示したいところに

<a href="http://twitter.com/share"
  class="twitter-share-buttoon"
  data-url="●●●URL●●●"
  data-text="●●●テキスト●●●"
  data-count="vertical"
  data-lang="ja">ツイート</a>

<script> widgetoon_main(); </script>

f:id:kenmochixx:20151125184004j:plain

やったー簡単!

 

ただし、誠に残念なことにhttpsには対応してないそうで、

f:id:kenmochixx:20151125183918j:plain

こうなる。←ザオラル

 

 

しかし助かった~。

ありがたく使わせていただきます。

Gmailへのメール配信で日単位の大幅遅延が発生したので原因をさがした

タイトル通り。

 

とあるサービスでメール配信を行っているんだけど、

Gmailのユーザーにだけメールが遅延する事象が発生。

しかも1,2時間ではなく、1,2日単位で遅れてしまうん…。

 

色々原因を探ってみたところ、メールログ内にこんな文字列ありけり。

 https://support.google.com/mail/answer/81126 to review our Bulk Email

URLに飛んだら↓のページがでてきました。

 

support.google.com

 

この中で唯一心あたりがあったのは、下記の部分。

 

登録解除

ユーザーが次のいずれかの方法でメーリング リストから登録解除できるようにする必要があります。

  • メール本文内の目立つリンクでユーザーを配信停止の確認ページに誘導する(確認以外の入力は求めない)。
  • メールへの返信で登録解除をリクエストする

 

ポイントかなぁと思ったのは、「確認以外の入力は求めない」のところ。

 

メール配信がサービス内容に直結するサービスだったため

現時点では「配信停止(退会)はこちら」という誘導文と

退会画面へのリンクは設置してたんだけど、

マイページ内へ繋がるURLなので、ログインが必要になります。

 

推測するに、文字通り「確認以外の入力は求めない」となると、

ログインID・パスワードの入力がいらない

→URLに何らかの会員識別用パラメータが必要

→少なくともユーザー単位でユニークなURLを配信

ってかんじのことが必要になるのかなと。

 

スパム扱いではなく遅延になった理由とかは察する以外にないんですが、

メール本文テキストの解析はしてるってこととリンク先までは辿らないだろう

(システムによっちゃアクセスで処理が実行されちゃうよね)ってことを考えるに

全員に同じURLを設置していた

ってことが直接的な原因だったのかなと判断。。

 

とはいえ、本文への差し込み機能をこのためだけに作るのはあほらしかったので、

「メールへの返信で登録解除をリクエストする」って方法をとることにしました。

 

Fromなんて一瞬で書き換えられるよねっていう大問題には気づかないふりをして、

次の大規模改修まではこれでいこう。