GoogleSpreadsheetを使って簡易DBを作る

##はじめに
Unityなんかでゲーム制作をしていると、スコアランキングなんかを作りたい時があります。
ふつうはMySQLなんかのDBを使って書くといいと思います。しかしサーバーの維持費がかかったりします。そんな時は、Google Spreadsheetを使って節約しましょう
##Google スプレッドシート
最近は、オフィスソフトウェアもオンラインで動くものが増えてきて、Googleスプレッドシートも、いわゆる、ウェブ上で動作する表計算ソフトウェアです。
簡単にファイルを共有でき、Googleドライブなんかに保存されるので、個人でのファイル管理に割く手間を省いてくれます。

表計算ソフトということで、マクロ機能が付いています。
さらに、このマクロを、ウェブアプリケーションとして公開という機能があります。
この機能を使うと、GETとPOSTを受け取ることができます。

余談ですが、Google Formなんかもウェブアプリケーションの類でしょうか、最近使う人がとても増えてきましたね。自分で書かずとも、簡単にウェブフォームを作ることができるので、とても便利ですね。その結果をGoogleスプレッドシートで見れてとても良いですね。

##マクロ
適当にスプレッドシートを作成した後、ツール>スクリプトエディタと開きます。

ここで、Google Apps Script=マクロの言語を自由に記述できます。
このGoogle Apps Scriptとかいうやつは、だいたいのグーグルサービス共通で、様々なサービスのAPIが使えます。よい!無料部分でだいたいなんでもできます。めっちゃ便利
詳しくは解説しないので、[ここらへん](https://cartman0.hatenablog.com/entry/2017/12/17/Google_Apps_Script%E3%81%AE%E7%84%A1%E6%96%99%E5%88%B6%E9%99%90%E3%83%A1%E3%83%A2)とか読んでください。

その中で、doPostとdoGetという関数名にすると、HTMLのPOSTとかGETとかを受け取れる。[参考](https://developers.google.com/apps-script/guides/web)

スクリプトエディタに、次のように追加します

function doGet(e) {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheets()[0];
sheet.getRange("A1").setValue('HelloWorld');
}

適当にデバッグボタンを押して実行します。(デバッグボタンの横にある関数一覧をdoGetにしておきましょう)初回実行の際は、なんか、スプレッドシートにアクセスの許可が必要です、なんたらかんたら~って出るので、適当に許可しましょう。

A1セルに、”HelloWorld”と表示されましたか?
でたら成功です。

まだまだこれでは普通ですね。スプレッドシートに戻ってA1セルを消しておきましょう。

##URLでアクセスできるようにする

メニューから、公開>ウェブアプリケーションとして導入を押します。
そしたら、なんか出るので、アプリケーションにアクセスできるユーザーを「全員(匿名も含む)」に変えて導入を押します。

でてきたURLをコピーして、別のタブで開いてみると……何も起きませんね。(一見では
でも、スプレッドシートに戻ってみると、”HelloWorld”とあるはずです。あら便利。

##パラメータを受け取って、結果を返してみる。

function doGet(e) {
var req = "Dance to Dance";
var response = "failed";
if(!!e && !!e.parameter && !!e.parameter.text) {
req = e.parameter.text;
}
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheets()[0];
var ary = sheet.getRange("A1:A10").getValues();

for(var i = 0; i < ary.length; i++) {
if(ary[i][0] == “”) {
sheet.getRange(“A” + (i + 1)).setValue(req);
response = “success”;
break;
}
}
return ContentService.createTextOutput(encodeURIComponent(response)).setMimeType(ContentService.MimeType.TEXT);
}

先ほどと同じように、URLも発行します。(保存しなおす度にURLを再発行する必要があります)

そのURLの最後に……

https://script.google.com/macros/(……中略……)/exec?text=yeah

GET送信のパラメータを付け加えてアクセスすると……
success, failedなんか出たりします。
ここで、スプレッドシートに戻ってみると……

はい、yeahというのがA1かA2セルにあるかと思います。
やばい、もうめっちゃDBじゃん。

あとは、リファレンスを読むなり、VBAができるならそれっぽい要領で上手くできると思います。

かといって、私は、このDBをゲームのスコア管理ぐらいにしか使っていませんが……!よいライフを

CD買った。

1月の頭にCD買いました。
ネクライトーキーというバンドのONEというアルバムです。年明けてしまいましたが、先月のに発売されたやつです。
CD発売付近に知り、めっちゃはまりました。
キャッチーさがやばいです。そして中毒性。曲を書いている人がボカロも使っている方だということで、何となくネット音楽のような雰囲気もありますね。
特に「めっちゃかわいいうた」が、リズムのキャッチーさと、歌詞の適当なパワー感が好みです。やっぱりめっちゃいい。
それと、「許せ!服部」という曲がめっちゃすごい電波曲ですね。中毒性が異常です。ナユタンっぽいセンスもあります。つまるところ、自分の好みのアーティストっぽい曲が流れてたら聞き入っちゃうよねっていう話です。エモい。

それと、ボーカルのアニメ声、何気に気になりますけど、2回目に聞くときになれますね。
慣れて逆にこれじゃないとなんか足りないみたいな感じになります。すごい。音楽聞くことってやっぱり大切だなぁなんて思いました。
公式サイトは、
https://necrytalkie.jp/
です。すごい。

最近、作曲も頑張りたいなぁっと前でちょこっとつぶやいたせいで、いろいろ音楽聞いてしまっています。
やっぱりインプットが大切だなぁと改めて思うようになりました。
理論はさっぱりわかりません。もちろん。
コード進行とかいろいろ語れるようになりたいんですけど。

デレマスの音楽になんかも結構影響されちゃってますね仕方ないです。
デレマスのCDというか、アイマスのCDもちょこちょこ買ったりしているんですが、多すぎてやばいですね。アレ。
破産します……。
まあ自分の気に入った曲ばっか買っているわけですが。
やっぱりレンタルとか利用して効率よく集めたいなぁと思ってたりします。
CDって基本、定価でしか買うことができないのでお金がすごくかかる。おまけにアイマス系はちゃんとグッズ展開もしているのでそういうのも買っていくとなるとやっぱりお金がたくさん必要ですね。
働いてますけど。ミリシタの曲も結構最近聞いたりしていい曲多いですよねあっちも。はぁ、本当に全部プレイリストに入れたいと夢がいつかなうのやら……。

私は、趣味はいろいろ広げるタイプなので、いろいろ広めに行きます。
仕事がつらひぜ。

それと、そういえばついに暖房を買いました!
うれしい。あったかいのが恋しい。早く届かないかなぁ……。
寒いのなら厚着すれば行けるとか言っていた時代がありました。(去年なども暖房なかった……
恐ろしい。

やっぱり寒い。

あけましておめでとうございます

あけましておめでとうございます
ついに2019年がやってきましたね。

抱負ややりたいことは、この前書きました。
寝正月してます。えっと、仕事も頑張ります。

今これを聞いています。
ミライアカリさん良い……

年末で

もう12月も31日になってしまいました。
去年も何となく抱負を抱えたことを覚えております。とはいっても何もできませんでした(毎年そうですが
いろいろ環境も変わったり変わらなかったり。
Minecraftも年の後半になるとほとんど遊んでいませんでしたね。なにか時間を見つけてちょっとづつ遊んでいきたいものです。

さて、来年はですね、まずデジゲー博かなんかに自分で作ったゲームを出したいというのがあります。ゲームは数年に1本は作ってるつもりなんですけど、今年はあんまり作れなかったなぁと反省しております。
来年も4月1日のエイプリルフール用のゲームから、まずは仕上げていきたいと思っています。
実を言うとPLiCyのゲームコンテスト用のゲームのアイディアまでできていて、12月中に何とかして作ろうと思っていたのですが、うまくいかないものですね。さっぱり進捗が出ませんでした。
これを糧に来年はちゃんとゲームを必ず1本は仕上げるのを目標としていきたいと思います。

ゲームってやっぱり作るの大変ですよね、絵を描いたり、プログラムを組んだり、音楽を作ったり……。
それに、UnityのC#ももうちょっと触って慣れたいですね。
あとC#7もちゃんと調べておかないと。
プログラマはちゃんと調べて新機能を使いこなしたいですよね。さっきさらっと読んだ限りでは、変数の展開いいですね。とっても便利そうで仕方がありません。Tuple拡張も便利になりそうで本当につかいたいです。

まず来年になりましたら一応、とりあえず、センター試験地理も一応やりたいですね。地理好きとしては。
あとTwitterでの活動頻度をもうちょっと上げたいですね。後半というか前半もあんまり活動できていなかったことを反省しております。さっきからなんやら反省ばっかりで申し訳ないのですが。

とりあえずテレビを見つつゆったりとした年末を過ごしたいと思います。
年を取るのもなかなかなれませんが……。行くる年を見守るのももうたくさんではありますが……、
それでは、皆様、よいお年を。また来年ご挨拶させていただきたいと思います。

最近のこと

年末の休みになりまして、いろいろやりたかったことに挑戦しております。
絵の練習を少しづつして、ちょっとは描けるようになりたいなぁと思って描いてます。
昔からゲームなど作ってきたわけですが、絵はなかなか調達に困りますよね。
というかプログラミングが上手にできたところで、世間、売れるゲームというのは絵がいいものなんです。ソーシャルゲームなども多くがそうですね。だからこそ、もっと練習していいゲームとは言いませんが、なんか人前に出せるような絵を描けるようになりたいです。私の人生ですからね。

あと、ちょっとStudio OneというDAWを購入して、音楽の基礎から学んでいます。肝心の音楽の方はさっぱりわからない。アレンジとやらもしてみたいし、自分で1から作曲……、やっぱりしてみたいです。アイドルマスターシンデレラガールズにはまり始めたときから、漠然と思っていたが、自分の人生自由にしたいわけで、仕事の合間などを見ていろいろ始めてみます。3日坊主にならないようにちゃんとDAW買ったので、頑張っていきたいと思います。
だいたい、ゆっくり進めていくタイプです。絵も音楽も……。(音楽なんかはプログラムなんかとかなり近いなんて聞きました)しかし、自分の力が圧倒的に足りないので、やっていかなければ。

自分の人生……、何となく重そうなテーマを年末の夜に。夢を追いかけて。仕事もして、そして……、寝るだけです。

寒くなってきました。

年の瀬となり、寒くなってきました。
仕事から帰ってきて冷え切った家の中が心に身にしみます。
うまいラーメンでも食いたいと思います。

ところでiPadの2019年版は出るんですかね。
ApplePencil2に対応してほしい。(Proほどの機能はいらない)
最近、何となくタブレットを結構買っちゃってる(ガジェット沼へ)ので、ものすごくiPadが欲しいです……。
いやiPadProも予約しかないし。2018年版も個人的にはすごくいいと思うんですが、店舗に在庫が全然なくって、さらに入荷未定と聞いて予約するのは気が引けました。新しいやつ出るんですかねぇ。出るといいなぁ……。

でもAmazonのFireタブレットはめっちゃコスパいいですね。セールになるととっても安いから、結構雑に扱えちゃうところがいいですね。
ウチでも、何も装備なしで運用してます。
Androidのデバッグ機としても動かしてみたいと思ってるんですが、動くんでしょうか。ちゃんと調べておかなければなりませんね。
いやあスマホとは違って大きいのって何となく得しているような気がします。そんな気がします。
しかし、Wi-fiのルーターが貧弱なのでたくさんWi-fi飛ばすとめっちゃ通信速度遅くなるのがネックですねぇ。買い替えちゃおうかなぁ……。

どうなることやら……。

Lisp勉強2

メリークリスマス、皆さん。
今日はリストをちょこっと勉強して、繰り返しをちょこっと勉強します。

(1 2 3 4 ore ore2)
コンな感じで線形のリストを定義できるらしい。これ自体では使えない。

(first (list 1 2 3))
最初の要素を取り出すそう。つまり1と表示される。

(rest (list 1 2 3))
こっちは、rest、つまり残りを出す。つまり最初以外のリストを作って返却する。
結果は、(2 3)

(nth 2 (list 1 11 111 1111))
nth関数は、n個目を吐き出す関数、1つめにn個目、2つ目にlistを与えればよい。
返却は、111ですね。

(quote (a b c))
quote関数はlistを生成する関数ですが、いつものリストと違って中が展開されないそうだ。
つまり、ここでのaとbとcは変数として展開はされずに、a b cといった文字列で返却される。
結果は (A B C)。
大文字、小文字は無視された。

(cons 10 (quote (a b c)))
consは、リストに要素を追加する命令。1つ目の引数に追加する要素を書く、そして、2つめの引数にリスト本体を渡してあげる。
そうすると、(10 a b c)と表示される。先頭(という概念があるのかは知らないが)に追加される。

()
空のリストはNILになる。それだけ。

(length (quote (a b c)))
これを使うと、リストの長さを取得できる。いたって普通な感じだ。

繰り返し:
(dotimes (n 3) (format t "~a" n))
3回繰り返す。012って出る。
dotimesが繰り返し命令だな。変数の宣言っぽく3っていう風にやる。
ふ~ん、一応何となく分かってきた感じだ、

(format t "~a" n)
ここで、表示している。
~aっていうのがprintfの%dみたいなやつらしい。
なるほど

dolistっていうのもあって、こっちはfor-eachを書けるらしい。使い方はほぼ同じだ。
変数で3って入れてたところに、リストを与えればいいらしい。

力尽きたので、今日はこれにて。
いい夜を。
続く。

スキンサイトのデザインをアップデートしました

スキンサイトのデザインをアップデートしました
表題がすべてを語っています。

デザインを変えたといいましても、それを生成する部分にもかなりの変更を入れました。
coreの部分はphpで書かれているんですけれど、そこの部分にも手をかなり入れました。やばいです。
3年ぶりぐらいにコード見たけどかなり不安になるようなコードばっかり書いてますね。当時の自分……。

cssも青基調のデザインから白系に戻しました。
何となく最近のgoogleなんかをちょっと見た目を参考にしました。ヘッダーが付いてくるタイプでヘッダーの中に検索ボックス埋め込んじゃうタイプ。
※Google翻訳なんかもUI結構変わってて驚きましたが。

念願の、レスポンシブルデザインに完全対応です。cssのtransitionタグをちょっと使えるようになりました。本当に良かったです。レスポンシブルデザインには本当にこれ必須ですね。
あとsnsのシェアにLINEを追加しました。いつの間にか、LINEのシェアリンクが使えるようになってたので、それを適用してシェアできるようにしました。

よくよくいろんなブラウザでテストしたら、Edgeではうまく動かなかったのでそこの部分もちょっと修正しました。
ここら辺は主にjavascriptの修正になりますね。javascriptも多めにminifyしておきました。いろいろ、javascriptも修正しました。
そういえば、Edgeが独自エンジンをやめるというニュースを聞きました。結構イケてるエンジンだと思ってたんですが……。残念です。とはいえ、私は普段使いではFirefox使いなんですけどね。
Webkit系は気持ちの速さが好きです。正直、各ブラウザでcssの誤差が生まれちゃいけないとは思いますが、やっぱりライバルがいるから成長するんですよね。まあ今後も動向が気になりますね。

Web開発って、いろいろな知識を総合的に必要とするのでかなり熟練度が必要ですよね。やっぱ難しい。

バグがもしあったらこっそり教えてくださいね。直します。
(あと画像が古いのでちょっとづつ直していきたい……と思っていたりします)

当時の私、よくこんなの作ったなぁと思えます。すごい今は直すだけで精一杯です。
けっこう厳しい。次はもっとかっこいいフレームワーク使ってやりたいと思います。

p.s.先ほど、一部のファイルのアップロードし忘れていることに気づき、アップロードしました。それまでは一部機能がうまく使えなくなってました。本当にすいません。

Lisp勉強1

今まで手続き型言語とか、オブジェクト指向の奴ばっかり扱ってきたので、関数型言語とかよくわからん。
古典的にLispを勉強してみようと思った。
プログラムは日々圧倒的成長が必要なのだ。(しらんけど)

Ubuntuでやってます。
まずは適当にLisp Commonパッケージをインストール
処理系の違いはよく分からん。
sudo apt-get install sbcl

sbclの対話の奴でやってみる。
公式っぽいところのチュートリアルみつつ
(format t "Hello World")
へ~、文字列型扱えるんだ。

続いて、関数を見る。
まずは四則演算
(+ 1 2)
ポーランド記法だ。おそらく(関数名 引数…)って感じだろう。

(+ 1 (* 3 5))
入れ子。いいね。部分的ポーランド記法だな。

なんか虚数も扱えるらしい。数学的だ……
(私は普通に数学苦手です)

(let ((str "Hello, world!")) (string-upcase str))
はい、意味不明です。

調べてみると、
letは局所変数を宣言する関数(マクロ)のようです。
どうやら、C#あたりでいうローカル変数とそのスコープを定義しているみたいです。

let (A) (B)
(A)が変数定義をする引数、(B)がスコープ内部、次の命令的な奴を並べてくそう。
ほほう。

つまり、
str = "Hello, world!"
str.toUpper()

みたいな感じですね。なるほどなるほど。

let*を使うと、前に定義した値を使えるっぽいです(?)変数定義の時に初期値の値の関数が展開されるってことですかね……

(let ((x 2)) (if (= x 2) x (+ x 4)))

if文。なるほどね。boolを返す関数を比較演算っぽく利用するんだ。
というか変数を直で書くと表示されるんだね。ふむ。

次はリストやってます。
メイン処理は基本的にリストをうまく利用して書いていくそうです。なかなか奥深い。
ちょっと楽しくなってきました。
関数型もなかなかいい感じです。

phpでちょっと考えた話

大乱闘スマッシュブラザーズ、私もやりたい。
そんなこんなで金曜日になりました。

ところで、Noto’sSkinsのサイトを現在せっせと更新中なわけですが、phpのバージョンを変更することにしました。
サーバーの都合上、5.6から、念願の(?)7.1に変えました(テスト環境を)。
そしたら、エラーが出ましたね。

どうやらphp7以降ではいろいろな字句解析とかもいろいろなところで変更が入ったらしくって、結構エラーが出ちゃいました。私自身、phpを書くのが得意というわけではなく残念なphpのコードを書いていたのが、原因なのですが……。

countでエラーが出ました。
どうやら、7より前のcount(array)関数では、引数の型が変数ならば何でもよかったようで、配列以外の型だと自動的に0を返してくれるようだったのですが、7からでは取れる引数が、配列のみになったようです。

なるほど……、phpの型って結構ガバガバで怖いと思いました。

その代わり、phpにはis_array(value)という関数があってそれで、配列か判定できるようなので、それを使ったりいらないところを消したりしました。
動きました。よかったです。

phpでは、比較演算子の等価(==)がガバガバなことで有名ですね。
奥が深い……ネットワーク関連ももうちょっと勉強したいと思えます。
あとRubyも使ってみたい。Ruby on Rails、ぜひやってみたい。今の流行は何なんでしょうか、割と知らないので今度調べてみます。

普段IDE使ってC#やらJava書いているとこういうところで困りますね……。
それでは。