aoma blog

エンジニアの日常とか技術とか

CUNEの地獄袋 開封の儀

地獄袋、運良く抽選に当たりましてGETしました!

CUNE 地獄袋 2020のチケット情報・予約・購入・販売|ライヴポケット

サイズはざっくり「小さめ」と「大きめ」の2種類とのことで、「大きめ」を選びました!

これより開封の儀をとり行う

いきます!

  • デニム
  • ジップパーカー×2
  • パーカー
  • ヘアバンド×4
  • ペンケース
  • ハギレ×2
  • 入場チケットバンド
  • 初音ミクコラボタグ多数
  • ポストカード多数
  • 20と描かれたペロペロキャンディ
  • ボールペン1本
  • 結束バンド1本

かなり嬉しい結果でしたー!
CUNE好きだな。

追記

ちなみにパーカーにはワレメとヤブレがありました。

GitHubPages&Jekyllで日本語フォントを変更したい

半分グチです。

GitHubPagesはJekyllと連携してます。

GitHubPagesの設定画面でJekyllのテーマを選んでサクッといけてる感じのサイトを作れます。

で、選んだテーマの日本語フォントがいけてない(というか海外製だから何もしてない)ので、変更したかったんですよ。

当然ググりますよね。結果よくわからん!ってなりましたという話。

ググったよ

まずGitHubPagesのヘルプにたどり着きました。 _config.yml でたいていの設定は上書きできるぜと。おお素晴らしいと。 詳しくはJekyll本家のサイト確認しろと。

でJekyllにいきますよね。 当然お目当てのピンポイントなページには到達せつ、その中で探すことになります。 するとまずRubyで環境構築せいと。 いやいや、GitHubPagesと連携してるんで、環境構築とかしたくないからこれ採用しようとしてるんだと。 で読み込みますよね。

結果よくわからんと。 最終的に上書きするなら選んだテーマのREADME見ろって書いてあるわけですよ。

いやいやちょっと待てよと。 そもそも気分によって半年に1回とかサクッと見た目を変えたいから「テーマ」を選んでるわけですよ。 その度にいろいろ設定上書きを調べろというのかい? テーマを気軽に変更したいからこういうサービスを選んでるんですよ?と。

かれこれ1、2時間調べましたよね。でもう諦めました。

結論

GitHubPagesとJekyllに丸投げしてるのがよくない。 Jekyllもしっかり連携しろと。 お互いが協力してわかりやすいヘルプページ作ってください。いやマジでお願いします。 Rubyで環境構築とか抜きにした、GitHubPagesで選べるテーマだけに特化したヘルプページを。

【エン痔ニアの職業病】おしり障害報告書

先日、おしりが気になるので病院に行ってきました。
はたして痔なのか気になりまして。。
きっとエンジニアで同じ悩みを抱えてる人は多いと思うんですよね。座りっぱなしの職業ですから。でも、

  • 恥ずかしくて病院に行きづらい
  • 黄門様を誰かに見られるなんてイヤ!
  • 炎上プロジェクト中で行きたくても時間がない(お尻も炎上してるのに)

といった理由で一歩を踏み出せない人もいるのでは?
なので恥ずかしいけど参考になればと思い、書きます!

おしり障害報告書

現象

  • 便をした後キレイにしたにも関わらず、数分後に肛門が汚れている
  • 残便感がある(肛門付近に残ってる感)

原因

  • ウォシュレットのしすぎ
  • いぼ痔が大きくなっていた

詳細(病院でわかったこと)

  • そもそもお尻はすこし穴が空いている
  • 左右のいぼ痔で穴を塞いでいる(いぼ痔は誰にでもあるのが普通。大きくなると問題)
    • これでうんちがストップする
  • いぼ痔は水をストップするようには出来ていない
  • キレイにしようとしすぎて長時間ウォシュレットしていた

    • 肛門内に水が入り残る
    • 数分後に出てきて汚れる
  • いぼ痔が大きくなっていた

    • 違和感が残便感に感じた(便ではなかった)

対策

  • ウォシュレットをやめる
  • 拭きすぎない
  • 1〜2分でトイレから出る(座りすぎは痔に良くない)
  • いぼ痔を小さくする注射をした

さいごに

症状や原因は人それぞれです。
重い病気の可能性もありますので、勇気を出して早めに病院に行きましょう。

JavaScriptで一覧ページの画像URLを全て取得する

稀に、一覧ページとかに表示されてる画像URLを全て取得したいとき、あるよねー!

そんなときは Chromeデベロッパーツールを使いましょう。

JS pathを取得

Copy JS pathで取得

document.querySelector("#qurireco > article:nth-child(1) > a > div > div._7uaWVw_YSgf_GKoctUM12 > span > img")

こんな感じ。

f:id:aoma23:20191125160708p:plain

getAttributeで画像URLが取得できることを確認

Consoleタブに貼り付けて確認してみる。

console.log(document.querySelector("#qurireco > article:nth-child(1) > a > div > div._7uaWVw_YSgf_GKoctUM12 > span > img").getAttribute("src"));

JS pathの規則性を探す

document.querySelector("#qurireco > article:nth-child(1) > a > div > div._7uaWVw_YSgf_GKoctUM12 > span > img")
document.querySelector("#qurireco > article:nth-child(2) > a > div > div._7uaWVw_YSgf_GKoctUM12 > span > img")
document.querySelector("#qurireco > article:nth-child(3) > a > div > div._7uaWVw_YSgf_GKoctUM12 > span > img")

nth-childのカッコ内の数字が違う感じだなー。

ループさせる要素を見つける

上記でみつけた規則性から下記要素をループすれば良さそう。

document.querySelectorAll("#qurireco > article")

素数を確認

念の為件数を確認。

console.log(document.querySelectorAll("#qurireco > article").length);

ループして出力

var elements = document.querySelectorAll("#qurireco > article");
for (var element of elements) {
  console.log(element.querySelector("a > div > div._7uaWVw_YSgf_GKoctUM12 > span > img").getAttribute("src"));
}

クリップボードにコピーするのも良き

var elements = document.querySelectorAll("#qurireco > article");
var list = [];
for (var element of elements) {
  list.push(element.querySelector("a > div > div._7uaWVw_YSgf_GKoctUM12 > span > img").getAttribute("src"));
}
copy(list.join("\n"));

かんたんですね!

PHPer がはじめて Tour of Go を学んだときのポイント24選

Goって興味はあったけど全然触ってこなかったaomaです。

Goには A Tour of Go という、これをやればGoマスターになれるステキサイトがあります。

A Tour of Go

普段PHPに慣れている中で、ムムッ!?っとなった点を目次別にメモしました。
PHPerでこれからGoを学ぶよって人の助けになれば幸いです。

Packages, variables, and functions.

Flow control statements: for, if, else, switch and defer

More types: structs, slices, and maps.

  • ポインタ

  • structのフィールドはポインタで (*p).Xのようにアクセスできる。p.Xと省略することも可能

  • structのポインタpを出力すると&がついた形で返ってくる。(変数だと0x414020みたいなやつなのに...)
  • 配列は固定長。可変長はスライスをうまく使う

    • https://go-tour-jp.appspot.com/moretypes/7
    • コロンで指定した最初の要素は含むが、最後の要素は含まない。var s []int = primes[1:4]の場合、要素は3つ。
    • Sliceは配列のような感じ。要素をいじると元の配列や別のSliceの要素も変更される
    • 長さと容量。とっつきにくいが、長さはどこまで見せるか(カーテンどこまで開けるか)、容量は実際に持っている値たちと考えるとわかりやすい。
    • makeで様々な空のsliceを作れる
    • appendでsliceに追加できる。
      • https://go-tour-jp.appspot.com/moretypes/15
      • cap増え方の謎...
        • 調べた

          https://qiita.com/hitode7456/items/562527069e13347b89c8
          > 長さ が 容量 を超えた時に、その時の 容量 の倍の 容量 が新たに確保されることが分かりました。
          http://toc-dev.blogspot.com/2012/09/goslice-make.html
          > 2のn乗で徐々にメモリが拡張されているのがわかる。
          
        • ということで2の倍数で増えてく模様。(cap=3のときに溢れても6ではない)

          2個目の記事で、3 3 3 3 6 6 6 12 になっているところは、今実行すると、3 3 3 3 8 8 8 8 になった。
          
        • Goのバージョンによっても変わるらしい。気にしなくていいっぽい。

          https://stackoverflow.com/questions/38573983/capacity-of-slices-in-go
          > TL; DR - スライスの容量がどれだけ拡張されるかは仕様に記載されていません。Goのバージョンが異なれば(または実装が異なる場合も、アーキテクチャが異なる場合も同じバージョンなど)、スライスの容量は異なります。
          
  • Maps(辞書的なやつ。key/value

  • 関数は関数の引数や戻り値としても使える

  • クロージャーは変数を保持する。戻り値が関数だとクロージャーと判断してよさそう。

Methods and interfaces

ゴルーチン

  • http://cuto.unirita.co.jp/gostudy/post/goroutin/
    • 並列処理用。独立して動作する実行単位であり、OSが管理するスレッドに割り当てられて動作します。
    • 関数の呼び出し時に先頭に「go」を付けるだけ
    • 「ゴルーチン」として呼び出した関数の終了は待たないことです。そのため、呼び出した関数が返す戻り値を受け取ることはできません。
    • mainから開始している親となる処理が終了すれば、いくら他に「ゴルーチン」が動いていても、すべて中断して終了します。

おまけ

Note: Go playground上の時間は、いつも "2009-11-10 23:00:00 UTC" です。 この値の意味は、読者の楽しみのために残しておきます(^^)

一体どんな意味が!?と思い調べてみました。

Goは2009年11月に公に発表され[23]、バージョン1.0は2012年3月にリリースされました。 https://en.wikipedia.org/wiki/Go_(programming_language) https://opensource.googleblog.com/2009/11/hey-ho-lets-go.html

なるほどGoの誕生日ね!おめでとう!

【MySQL】壊れているビューを削除できない!

現象

気づいたらビューが壊れている。

#1356 - View 'testdb.view_test' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them

削除しようとしても消せない!!

DROP TABLE view_test;
// #1051 - Unknown table 'testdb.view_test'

解決策

まず適当なSQLで壊れていない状態に作り直す!

CREATE OR REPLACE VIEW view_test AS SELECT now();

そして削除!

DROP TABLE view_test;

SO COOL!!!

昨今のJavaScriptをレビューしたら全くわからなかった話

はじめに

最近JavaScriptのプルリクが来たので「よーしやったるでー」って感じでレビューしたんですが、まったく理解できずレビューになりませんでした。

その時疑問に思ったことをメモします。。
誰かの助けになれば幸いです。。

これはもう引退やな。。

classの中で function って書くの省略してるの?

class TestClass {
    test() {
        処理
    }
}

function を省略して書けるのかなと思ったらそうではない。むしろ書いてはいけない。 下記はエラーになる。

class TestClass {
    function test() {
        処理
    }
}

PHPに慣れてるからか、もやもやする。

(a, b) => は無名関数なのはわかったけど function(a, b) じゃダメなの?

(a, b) => は無名関数で function(a, b) と同じ。

好みの問題だがthisに違いがある。

this.hoge;
function(a, b) {
   this.hoge; ←違うもの
}
this.hoge;
(a, b) => {
   this.hoge; ←同じ!こっちのほうがthisが何を指してるかわかりやすい!(外と同じthisになってる)
}

... ってなんや...

... はスプレッド演算子
中身バラす(展開する)やつ。
こんな感じで使う。

var parts = ['shoulders', 'knees']; 
var lyrics = ['head', ...parts, 'and', 'toes']; 
// ["head", "shoulders", "knees", "and", "toes"]

Arrayだったりオブジェクトだったりいろいろあるらしい。。詳しくはこちら

こんな感じで引数としても使える。無限引数。

const testFunction = (...items) => {
    items.forEach(function(item) {
        console.log(item);
    });
}

testFunction('aaa');
testFunction('aaa', 'bbb', 'ccc');

{} は処理書き忘れ?

{} は空のオブジェクト宣言。 function の処理の中身ないやつかと思ったらオブジェクトだった。なるほど、、まぁたしかに。。

reduce 関数とかで出てくる。

var countedNames = names.reduce(function (allNames, name) { 
  if (name in allNames) {
    allNames[name]++;
  }
  else {
    allNames[name] = 1;
  }
  return allNames;
}, {});

copy2clipboard = copy; って何してるんや...

copyクリップボードにコピーする関数。 https://blog.leko.jp/post/copy-function-of-developer-tools/

小技として、 promiseの中とかで使おうとすると名前解決できなかったりするので、

copy2clipboard = copy;

のように、事前にクローンしておいて、

this.copy2clipboard("logloglog");

みたいな感じで使える。

Mapって何や...

new Map(kvArray);

Mapは配列を連想配列にするクラス。Mapは型。
{} とは別。{} はキーに数値を使えないじゃん、ちゃんとした連想配列作ろうよ!ってことでMapができた。

詳しくはこちら

await 恐怖症や...

awaitはasyncが指定されてるときに使える。処理が終わるまで待つ。

awaitがないとthis.usersValidnesにプロミスが入って、this.usersValidnes自体にthenがないのでプロミスのまま生き続ける。処理は終わるけど結果が取れない。

hensu;
hoge().then(e => {
   hensu = e;
})

hensu;
hensu = await hoge()

は一緒。

awaitをなくすと

hensu= hoge()

となり、thenがないことになるので、

hensu.then(e=>~~~~)

してあげる必要がある。

hoge()は5秒くらいで"A"という文字列を返すプロミスだとする。

hensu = hoge();
await hensu; // 処理が終わるまで待つ
console.log(hensu) // 終わったプロミスが表示されるだけ

下記ならば値が取れる

hensu = hoge();
hensu2 = await hensu; 5秒かかる
console.log(hensu2) // "A"
hensu = hoge();
await hensu; // 処理が終わるまで待つ
console.log(await hensu) // ”A”
console.log(await hensu) // ”A”
console.log(await hensu) // ”A”
console.log(await hensu) // ”A”

とかはできる。 awaitは「プロミスを結果に変換する関数」だと考えるとわかりやすい!

async*アスタリスクは何なんや!

* はジェネレータになる。ふつうはfuctionにつく。classだとfunction書けないのでasyncに付いたりする。

yield (いーるど)って何やねん!

ジェネレータ用のキーワードreturn みたいなもの。

yieldreturn する。次呼ばれると yield の下から処理が始まる。

では yield* は一体何なのか...

yield を返すときは yield* としなければいけない。 return ではダメらしい。

function* func1() {
  yield 42;
}

function* func2() {
  yield* func1();
}

ややこしい。。詳しくはこちら

const って上書きできるの?

for await (const record of recordsGenerator) {
    処理
}

constを上書きしてるように見えるが、そうではない。

constは上書きできないので下記は当然エラーになる。

const a = 1;
const a = 2;

が、ここでは下記のような事になるので、スコープが違うのでエラーにならない。

{
   const a=1;
}
{
   const a=1;
}
// constを上書きしているのではなく別モノを定義している。

さいごに

近年のJSはぼくの知ってるJSちゃんじゃなかった。。大人になってた。。