n-hirokiの開発ブログ

30歳を越えたプログラミング初級者の僕が、プログラムで生計を立てることを目指しているブログです。

CentOSのlibstdc++を更新する

vagrant sshしたら表示がおかしくなった。

前回いろいろいじったらこんな表示になってしまった。
f:id:ZEROFROM:20190716112419p:plain
vagrant ssh

調べたらどうもCentOSのインストールされているライブラリが古く、ソフトウェアが要求するバージョンと合わないのが原因らしい。
参考にさせていただきました。

www.saintsouth.net

インストールされている libstdc++ に組み込まれているバージョンを確認します。

f:id:ZEROFROM:20190716113015p:plain
libstdc++ に組み込まれているバージョンを確認

sshの時に要求されたバージョンがないのがわかった。

gccのビルド

$ sudo yum install gmp-devel mpfr-devel libmpc-devel
$ sudo yum install glibc-devel.i686

y/nの質問が2回あったので両方ともyを選択。

ソースコードのダウンロード

http://ftp.tsukuba.wide.ad.jp/software/gcc/releases/
上記のURLからソースコードをダウンロードします。

$ mkdir -p ~/src
$ cd ~/src
$ curl -LO http://ftp.tsukuba.wide.ad.jp/software/gcc/releases/gcc-4.8.4/gcc-4.8.4.tar.gz
$ tar fxz gcc-4.8.4.tar.gz
$ cd gcc-4.8.4

ビルド

$ ./configure
$ make //すごい時間かかる 僕は1.5時間くらいかかった。

新しいライブラリをインストール

現在のライブラリインストール状況を確認して、目的のライブラリ「libstdc++.so.6.0.19」のみコピーします。

$ ls -l /usr/lib64/libstd*
$ sudo cp ${HOME}/src/gcc-4.8.4/x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.19 /usr/lib64

既存のライブラリ (libstdc++.so.6.0.13) から、先ほどコピーした新しいライブラリに切り替えます。  古い方のライブラリはシンボリックリンクを含めて削除せず、いつでも切り戻せるよう移動するだけにします。

$ cd /usr/lib64
$ sudo mv libstdc++.so.6 libstdc++.so.6.bak
$ sudo ln -s libstdc++.so.6.0.19 libstdc++.so.6

$ ls -l /usr/lib64/libstd*

最後に、目的のバージョンの「GLIBCXX_3.4.15」が有効になっているか確認します。

$ strings /usr/lib64/libstdc++.so.6 | grep GLIBCXX

いろいろファイルが作られて、どのディレクトリに今まで作ってきたプログラムが入っているかと言うと、

localhost/home/vagrant内に入っています。
f:id:ZEROFROM:20190718164734p:plainf:id:ZEROFROM:20190718164749p:plain

Socket.IOのエラー『SyntaxError: Use of const in strict mode.』

こんにちは!n-hirokiです!

昨日でたエラーを調べます!



hiroki-prog.hatenablog.com

エラーを探る

・今回のエラー

Socket.IO SyntaxError: Use of const in strict mode.


・エラー先のコード一部

f:id:ZEROFROM:20190715204746p:plain
constエラー

google先生に聞いてみる「Socket.IO SyntaxError: Use of const in strict mode.」

良さそうな情報が見つかった。

  1. JavaScript に const や let が導入されたのは ECMAScript 2015
  2. Node.js でこれがデフォルトで有効になったのは Node.js 4.x 以降
  3. use strict を指定すると ECMAScript 5 の strict mode となり、かえって Syntax Error になってしまう
  4. const let に関しては、 node --harmony app.js といった感じに --harmony オプションを付けることで、当該機能を有効化することもできるよう


node.jsのバージョンを新しくすれば良さそうですね


Vagrantのnode.jsのバージョンを新しくする

つい最近、Vagrantのnode.jsとnpmのバージョンを最新にしようと思ったのですが、まだできていませんでした。
なのでやります!

参考にした記事↓
qiita.com

  1. nvmをインストール
  2. nvm ls-remoteでインストールできるバージョン確認
  3. nvm install stable 最新版をインストール
  4. 結果の最後に 「nvm is not compatible with the npm config "prefix" option: currently set to ""Run `npm config delete prefix` or `nvm use --delete-prefix v12.6.0` to unset it.と表示された
  5. nvm use --delete-prefix v12.6.0実行
  6. node -v バージョン確認
    f:id:ZEROFROM:20190715213631p:plain
    node -v
  7. もう一度「nvm install stable」実行
  8. node -v [v0.10.48]
  9. v12.6.0 is already installed.の一文を発見
  10. 調べたら「nvm ls」でバージョン変更できるらしいf:id:ZEROFROM:20190715215451p:plain
  11. うまくいかないのでuseで変える
  12. nvm use 12.6f:id:ZEROFROM:20190715215626p:plain
  13. うまくいってないだろうけどバージョン確認
    f:id:ZEROFROM:20190715215737p:plain
    node バージョン


うまくいかない、、、。
続きは明日。。。


Socket.IOを使ってみる

こんにちは!
n-hirokiです!
今、仕事前(コンビニ店員)にベローチェによってSocket.IOの勉強をはじめました。
今日の勉強記録です!

Socet.IOとは

リアルタイム双方向通信を可能にするものでチャットやゲームなどでよく使われています。
僕はIoTに使います。
Socket.IO

Socket.IOはNode.jsで動いているのでNode.jsとJavaScriptの知識が必要。

Socet.IOインストール

インストールするために

  1. ローカル開発環境にSocet.IOを使うディレクトリを作成
  2. そのディレクトリ移動
  3. 下記のコマンドを実行
  //証明書の信用ができなくエラーになるためこれで回避
  npm config set strict-ssl false

  npm install socket.io  //socet.io インストール
  npm config set strict-ssl true  //戻す

通常は2行目のインストールのコマンドだけでできるみたいですが、僕の場合はエラーになってしまうので、この3行になりました。

・過去記事
hiroki-prog.hatenablog.com

WebServerを作る

app.js

  var app = require('http').createServer(handler),
      io = require('socket.io').listen(app),
      fs = require('fs');
  app.listen(1337);
  function handler(req, res){
    fs.rendFile(__dirname + '/index.html', function(err, data){
      if(err){
        res.writeHead(500);
        return res.end('Error');
      }
      res.writeHead(200);
      res.write(data);
      res.end();
    })
  }

index.html

<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="utf-8">
    <title>Socet.IO</title>
  </head>
  <body>

    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
    <script src="/socket.io/socket.io.js"></script>
  </body>
</html>


上記のapp.jsとindex.htmlを作り、まずは接続確認します。

  node app.js

するとSyntaxErrorですね、、、。

f:id:ZEROFROM:20190714133922p:plain
実行結果

Socket.IOのindex.jsに対して、
constを厳密に使ってくださいって言われてるみたいですね。


Socket.IOの中身をいじる必要があるのか?
どうすれば、、、。

npm install ejs <ejs をインストールしたいけどエラー>

  npm install ejs

f:id:ZEROFROM:20190712133751p:plain
Error: CERT_UNTRUSTED

エラー:CERT_UNTRUSTED

どのようなエラーかわからなかったので日本語に直してみる
cert : 証明書
untrusted : 信頼できない

どうやら「証明書が信頼できない」ようだ

blog.yug1224.com

このサイトを参考にさせていただきました

  npm config set strict-ssl false
  npm install ejs  //ここでインストールできた
  npm config set strict-ssl true

f:id:ZEROFROM:20190712134554p:plain
ejsインストール

blog.yug1224.comさんありがとうございました。


ブログサイト「Plat-みんなで創るブログ」作った話

こんにちは!
n-hirokiです!

みんなで1つのブログを創るサイト Plat を公開しました。

Platとは

Plat -みんなで創るグラブルブログ-
同じ趣味のある人たちが「Plat」と「Twitter」を通して盛り上がれる場所です。
今回はスマートフォン向けソーシャルゲームグランブルーファンタジー 」をテーマにしました。


代表者がブログを書き、そのブログはサイトのトップページに表示されます。
他の方がそのブログを読み 内容やテーマについてつぶやきます。
その際「 #Plat_グラブル」をつけてつぶやくことでサイト内にも表示します。
そのブログとつぶやきを合わせて1つのブログです!
Platを通して いろんな人たちと 出会い 楽しみ 情報交換をしましょう!


Platを作った理由

常に思うことがあります。
それは 「好きなことを共有して盛り上がることってすごく楽しい」です。
好きなことに1人で夢中になることも もちろん幸せですが 同じ趣味を持った人と共有しあえばもっと幸せです。


ですが 周りに共有できる人がいなかったり 共有する時間が取れなかったりすることって多いと思います。
学生だったら クラスメイトや友達と遊ぶことが多くなるので共有できる場合が多いですが 社会人になったらなかなかできません。
僕は学生の頃 モンハンを学校の友達とワイワイやってかなり楽しかった思い出があります。
そして 社会人になってから新作のモンハンを1人でやったら「あれ? あの時ほど楽しくない」と思いました。
その時に共有することの大切さを知りました。


そこで思いついたのがPlatです。
「同じテーマで いろんな人たちと1つのものを作り上げるって絶対楽しい!」という考えをこめて作りました。
いろんな人と共有するならTwitterでいいかもしれませんが Twitterだと情報が多すぎて 盛り上がり難いと思います。
なので シンプルに 一つのテーマなのが大事なのです!
1日限定の公開なので 今日は誰がどのようなブログを投稿しているだろう?と楽しみにできます。


何で グランブルーファンタジーにしたかというと 僕が好きだからです。
グランブルーファンタジーでうまくいったら他のテーマでもPlatを作りたいと思います。


作っている時の壁の話

Platを作成するにあたって1番の壁になったのは 精神面です。
思いついた時は かなり自信があったのですが 作っていき時間が経つにつれて「これ 本当に楽しいの?」「使ってくれる人いないんじゃないの?」とか 不安な気持ちが頭の中をずっと ぐるぐるしていました。
気持ちがスッキリしていないことが多くなり 作業効率が徐々に下がっていったことを実感しました。
そして、Platに使える時間をそんなに多く取れる日がなくて 結構長期になってしまったのも原因の一つです(反省してます)。



この壁の対処法としてとった行動は「開き直ること」と「向き合うこと」です。
公開して認知してもらわないとわからない。だから形にして公開する。それでユーザーがつかなかったら そこから何かを学んで次に活かせば良い。と考えるようにしました。



技術面では
・コーディングしていくと最初にした設計では足りない部分が浮き彫りになって困った
・初めてTwitterAPI(TwitterOAuth)を使ったのでわからないことが多かった
などです。

その対処法として グーグル先生に聞くことで解決できました。
主に Qiita と ドットインストールがかなり為になりました!


Platの今 と これから

公開はしましたが まだ認知してもらっていません。
なので PlatのTwitterアカウントを作成して いろんな方達に知ってもらえるように努力しています。
Platのシステム上 ある程度の人数が使ってくれないと寂しいだけのものになってしまいます。
なので、軌道に乗るにはまだまだ時間と努力が必要です。


宣伝しつつ機能を追加していきます!



Platを通じて 仲間と出会えたり 盛り上がったり 情報共有したりしてユーザーが笑顔になる日が来ることを願い努力を続けます!

FezNote #4 データベースからデータ取得できない

こんにちは!
n-hirokiです!

前回のブログ
hiroki-prog.hatenablog.com

PHPで翌日から14日間の日付をDataPeriodクラスで生成して表示する

前回の課題であったDatePeriodクラスをつかっての14日間表示がうまくいったので簡単にまとめます。
今回は翌日からの14日間の表示です。

  $today = date("Y-m-d");  //今日の日付
  $begin = new DateTime($today);  //開始日生成
  $begin = $begin->modify('+1 day');  //1日進めて翌日にする
  $end = new DateTime($today);
  $end = $end->modify('+15 day');  //14日分表示したいので14日進める
  $interval = new DateInterval('P1D');  //間隔を1日に設定
  
  $period = new DatePeriod($begin, $interval, $end);  //$periodに14日分の日付データを取得する
  foreach($period as $day){
    //この中でHTMLを形成したりやりたい処理を書けばOK

    //2019年4月1日の場合の例
    echo $day->format('Y');  //2019
    echo $day->format('m');  //04
    echo $day->format('d');  //05
  }

データベースからうまくデータを取得できない

今はこのforeachの中でDBからデータを取得しようとしているのですがうまくいかない感じです。

・わかっていること
$stmt->execute();でfalseになっていない。
$result = $stmt->fetch(PDO::FETCH_ASSOC);の$resultの中身がfalseになっている。

$stmt->execute();の時点でfalseになっていないので
$result = $stmt->fetch(PDO::FETCH_ASSOC);
この1行がおかしいと思い数時間悩みました。
もしかしてfetch(PDO::FETCH_ASSOC);が使えなくなってしまったのか?もしくは文法が少し変わったのか?とかいろいろ調べました。
ですが、やっぱり使えるし文法も合っていました。


行き止まりになってしまった。
このままPCに向かっていてもハマったままだと思い、15分ほど寝て夕食を食べて1時間ほどウォーキングしてシャワーを浴びました。


かなり頭がリフレッシュしたので再開します!


コードとにらめっこすること20分ぐらい。
「もしかしてSELECT文がおかしいのではないか?」
executeしてもfalseを返さなかったから合ってるとずっと思っていたけれど、もしかしたらfalseを返さないくらいのミスをしているのではないのかと考えました。
文法を調べて自分の書いた文をチェックしました。
そしたら、変数を囲うシングルクォーテーションが抜けていました。

  $stmt = $pdo->prepare("SELECT * FROM テーブル名 WHERE カラム名 = $hoge");
  //修正↓
  $stmt = $pdo->prepare("SELECT * FROM テーブル名 WHERE カラム名 = '$hoge'");

これを修正したらうまくいきました。

やっぱりちょっとしたミスは見つけるのが大変ですね!
今回は数時間で次に進めたのでラッキーと思っておこうと思います!


最後にデータベースからデータを取得するためのコードをまとめておきます。

try{
  $pdo = new PDO('mysql:host=ホスト名;dbname=データベース名;charset=utf8','DBユーザー','パスワード',array(PDO::ATTR_EMULATE_PREPARES => false));
  $stmt = $pdo->prepare("SELECT * FROM テーブル名 WHERE カラム名 = '$x'"); //指定のカラムのデータの中に$xと一致するレコードを指定のテーブルから取得する
  $flag = $stmt->execute();
  if($flag==false){
    echo "SQLエラー";
  }else{
    //今回はレコードが1つなのが前提なのでループは使用しない。
    //レコードが複数の可能性がある場合には while( $result = $stmt->fetch(PDO::FETCH_ASSOC)){ これでループするとレコードを全て参照したらループから出てくれる。

    $result = $stmt->fetch(PDO::FETCH_ASSOC);  //$resultの中にレコードのデータが入る
    $y = $result['カラム名'];  //これで取得したレコードのデータを取得できる
    echo $y;

    //必要な処理をいろいろ書く


}catch(PDOException $e){
      exit('データベース接続失敗。'.$e->getMessage());
}

FezNote #3 PDOException~PDOでの例外~

こんにちは!
n-hirokiです!

ブログ投稿日の選択

前回のブログ
hiroki-prog.hatenablog.com

今回の取り組みは、ブログを投稿する日付を選択する画面のPHP実装です。

PHPでの実装機能

  1. その日から14日間の日付を表示
  2. 対象の日に投稿されているかDBにアクセスしてチェック
  3. 対象の日に投稿していた場合、ユーザー名とタイトルを取得
  4. 下の画像のような表示をするようにsprintfを使って、変数を生成する

日付選択イメージ
日付選択イメージ

DatePeriodクラスを使って日付を生成します。
そのためにforeachでぐるぐる回すのですが、その中でPDOでDBにアクセスしようとしたら下の画像の例外が発生しました。


SQLエラー
SQLエラー

とりあえず、DBを調べてみようと思うのですが、もう3時になるので明日にします。