homesteadの502 Bad Gatewayエラーに対処

Laravelでサイトを構築するのに、仮想環境でHomesteadを利用していたのですが、サイトへアクセスすると、最初だけ「502 Bad Gateway」というエラーが表示される状況に遭遇しました。

しかも、ずっと表示されるわけでなく、何回か再読込をすると解消するという謎の状況。

とりあえず、nginxのエラーログを見てみると、以下のエラーが。

[error] 2276#2276: *472 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: 192.168.10.1, server: homestead.test, request: “GET / HTTP/1.1”, upstream: “fastcgi://unix:/var/run/php/php7.3-fpm.sock:”, host: “homestead.test”

このエラーで対処法をググっていろいろ調べていたところ、対処法が見つかりました

New Laravel (Homestead) installation: 502 Bad Gateway – *Refresh* – the website is displayed correctly | stackoverflow

以下の通りにすることで治りました。

まずは、/etc/php/7.3/mods-available/xdebug.iniを編集します

sudo vim /etc/php/7.3/mods-available/xdebug.ini

上記ファイルの行の頭に「;」を全てつけてコメントアウトします。

nginxと、php7.3-fpmを再起動します

sudo service nginx restart
sudo service php7.3-fpm restart

これで、502 bad gatewayのエラーは出なくなりました。

xdebugというのが、phpのエラーを詳細に追いかけるツールだそうで、それが有効になっていることの副作用的なかんじでしょうか?

何にせよ上記を無効にすることで治りました。

php artisan migrateでAccess denied for user ‘homestead’@’localhost’に対処

Homesteadのlaravelで、artisan migrateでデータベースを作成しようとしたところ、エラーが起きました。

実行したコマンド
php artisan migrate

エラーの内容
SQLSTATE[HY000] [1045] Access denied for user ‘homestead’@’localhost’ (usin
g password: YES) (SQL: select * from information_schema.tables where table_
schema = homestead and table_name = migrations)

原因についてですが、laravelの実行ディレクトリで、「.env」ファイルを編集する必要があるということなので、編集してみましたが、結局同じエラーが出て接続できません。

さらに原因を調べてみたのですが、「.env」ファイルを変更してもそれを反映させるためにコマンドを実行する必要がありました。

laravelの実行ディレクトリで、以下のコマンドを実行します。

php artisan config:clear

これで、再度マイグレーションを実行したところ、問題なく実行され、データベースにも反映されました。

Laravel HomesteadをPHP7で動作させる

Laravel HomesteadをPHP7で動作させる方法についてです。

Laravelの仮想環境のLaravel Homesteadについて検証していたのですが、公式サイトのチュートリアルに沿って導入していると、何故かLaravelと、対応するPHPが5系でした。

最新のPHP7に対応させるための方法を探していたのですが、調べると何のことはなく、公式サイトのHomesteadのチュートリアルにはPHP5系に対応する記事と、PHP7に対応する記事でそれぞれチュートリアルがあるだけでした。

前の記事で紹介していたのは、4.2なのでphp5系に対応してました

Laravel 4.2 Homestead (PHP5対応)

Laravel 5.7 Homestead (PHP7系対応)

後者のチュートリアルに従ってやっていれば問題なくPHP7系のHomestead環境が整いました。

前者はHomesteadコマンドベースになっていて、後者はVagrantコマンドがベースになっているので、やり方の違いに若干戸惑いましたが・・・。

Laravel Homestead導入時の悪戦苦闘メモ

laravelの勉強をしていて、環境構築用にlaravel homesteadを導入してみたのですが、かなり苦戦したのでメモを残しておきます。

laravel homesteadとは

laravelをローカル環境に導入するときに、環境構築の手間を省くために公式に準備された仮想環境構築ツールです。

laravel homesteadの仮想環境の構築には、Virtual Box+Vagrantを利用するのですが、Vagrantの設定をlaravelの仮想環境に特化するように準備してくれるツールです。

公式サイトには、laravel homesteadを使うことでローカルへの環境構築が楽ちんになると書いてあったのですが、思わずはまってしまったのでメモとして残しておきます。

導入の手順

1・Virtual BoxとVagrantをダウンロードします。

homesteadは基本Virtual BoxとVagrantを使うだけなので、何はともあれこの2つをインストールします。

2・Composerが導入されていない場合はComposerを導入します

Composerは、phpのパッケージ管理ツールです。
Composerは、Laravelを導入するのにあたってほぼ必須となるツールです。
入ってない場合は入れておきます。

3・Homsteadの設定を行います

公式サイトの手順に従います

HomesteadのCLIツールのインストール

composer global require “laravel/homestead=~2.0”

bashプロファイル ~/.bash_profileを編集してコマンド実行パスを追加

export PATH=$PATH:~/.composer/vendor/bin

ymlファイル(Vagrant用の設定ファイル)の初期化

homestead init

SSHキーの設定

ssh-keygen -t rsa -C “[email protected]

homesteadの仮想環境生成

homestead up

それで、以下のエラーが出ました。

Bringing machine ‘default’ up with ‘virtualbox’ provider…
There are errors in the configuration of this machine. Please fix
the following errors and try again:

vm:
* The host path of the shared folder is missing: ~/Code

これは、要するに、ホームディレクトリに Codeというフォルダがないということです。

cd ~
mkdir ./Code

これで再度

homestead up

これでエラーが解消され、問題が解決しました

これで、仮想環境が作成されたのでSSHでアクセスしてみます

homestead ssh

無事仮想環境にログインできました。

メインマシンのhostsファイルに、以下を追加します。

192.168.10.10 homestead.app

公式サイトによると、この時点でサイト(homestead.app)へアクセスできるはずなのですが

http://homestead.app

上記URLへアクセスすると、エラー。

No input file specified

これは、ファイルが存在していないということらしい。

調べて見ると、 ymlファイルに設定されているのが以下の通りなのですが

sites:
– map: homestead.app
to: /home/vagrant/Code/Laravel/public

これは、上記のドメインが、/home/vagrant/Code/Laravel/publicに紐付けられているということなのですが、仮想マシンにログインして確認したところ、「/home/vagrant/Code/」以下に、Laravelのディレクトリが存在していない。

これには相当ハマってしまい、調べても原因がよく分かりませんでした。

とりあえず、メインマシンのcomposerのバージョンが少し古かったみたいなので、メインマシンのcomposerのバージョンを最新に更新。

homestead destroy

これで一旦仮想環境を削除して

homestead provision

これで再度作り直してみます。

これで再度サイトへアクセスすると、表示されました。

しかし、今度は別のエラーが・・・

autoload.phpがないとかそういうことらしく、調べれてみると、必要なファイルが存在してないのがあるようなので、これはComposerをアップデートしたらいいということなので、アップデートしてみます。

composer update

すると、途中でエラー。

proc_open(): fork failed – Cannot allocate memory in phar:///usr/local/bin/composer/vendor/symfony/console/Application.php

メモリが足りていないというエラーです。

php.iniを編集して、memory_limitを編集してみるも、駄目。
調べると、swap メモリの設定を追加したらいけるということ。

仮想マシン内で、以下のコマンドをスーパーユーザ権限で実行

sudo /bin/dd if=/dev/zero of=/var/swap.1 bs=1M count=1024
sudo /sbin/mkswap /var/swap.1
sudo /sbin/swapon /var/swap.1

これで再度Composerをアップデートしたところ、通りました・・・!

Laravelの初期画面。ついに起動!ここまで長かった・・・
Laravelの初期画面。ついに起動!ここまで長かった・・・

雑感

簡単に仮想環境が構築できるといいつつ、やってみると何箇所かはまるポイントがあって大変でした。

ぶっちゃけ、ローカルの仮想環境って、homesteadなんか使わなくてもMAMPやXAMPで十分じゃね・・・という気もしますが、何故Vagrant+Virtual Boxを使うのが良いのかよくわかりません。

また、仮想環境にデフォルトの設定で2GBのメモリが割り当てられるようなので、仮想環境にメインマシンのメモリも圧迫されます。

とりあえず、こういうものもあるということで、引き続き色々使って試してみようとは思います。

その後

Homestead環境のセットアップが終わってからですが、まずは、Laravelのデフォルトのサイトが表示されています。

その後どうやってサイトを作り込んでいくかですが、メインマシンの

~/Code

フォルダが仮想マシンのエイリアスになっているようなので、そこを作業フォルダにしていけばその後の仮想環境の作業をメインマシンで進めていけます。

作ったサイトはhostsファイルにドメインと仮想マシンのIPアドレスを紐付けることで、仮想マシンでの表示が確認できます。

Homesteadの仮想環境はメモリを圧迫するので、使い終わったら、コマンドラインで

homestead halt

で停止することができ

homestead up

で再度起動できます。

homestead環境の削除

vagrant box remove laravel/homestead –all

ymlファイルの更新後の仮想環境への反映

vagrant reload –provision

Laravelのバージョンアップ

公式のLaravel5.7のHomestead導入ガイドに従ってHomestead環境をセットアップしたのに、デフォルトのLaravelのバージョンが5.4で最新の5.7ではなかった。

5.4から5.7へのバージョンアップは、仮想環境のLaravelフォルダまで移動して、個別に行った。

手順としては、Laravelフォルダにある composer.jsonファイルを編集して、設定内容の変更を行った後に、

composer update

で適用される。
(このあたりはググったら色々でてくるので詳細は割愛)

エラーThe host path of the shared folder is missing: ~/Codeの対処

laravelで、homesteadを導入時に、以下のエラーに遭遇しました

コマンド

homestead up

を実行

それで、以下のエラーが出ました。

Bringing machine ‘default’ up with ‘virtualbox’ provider…
There are errors in the configuration of this machine. Please fix
the following errors and try again:

vm:
* The host path of the shared folder is missing: ~/Code

これは、要するに、ホームディレクトリに Codeというフォルダがないということです。

cd ~
mkdir ./Code

これで再度

homestead up

これでエラーが解消され、問題が解決しました

パス(PATH)を通すの意味

サーバでいろいろ設定をしていると、パスを通すという言葉が、ときどきあります。

この、パスを通すというのがどういう意味についてなのですが、サーバやコンピュータでコマンドを実行する際に、そのコマンドの実行ファイルがどこにあるかということです。

ユーザはコマンドラインで様々なコマンドを実行していますが、それは、結局コンピュータやそのサーバの中で、そのコマンドに対応する実行ファイルがどこかにあるのです。

linux系のサーバやコンピュータであれば

/bin/
/sbin/

といったディレクトリ以下に、それらの実行ファイルがあります。

そのディレクトリを開いてみると、多くの実行ファイルがあり、慣れ親しんだ ls や cd といった実行ファイルも存在しています。

これは、linux系であれば、/bin/や/sbin/は、はじめから定義されているのでその場所はわかり、また、bash_profileでは

/usr/bin/
/usr/sbin/

といった場所にははじめからパスが通してあります。

コンピュータでコマンドを実行した際に、コンピュータは、そのパスが通っている場所以下の、コマンドに該当する実行ファイルを探しているわけです。

もしコンピュータ全体から実行ファイルを探そうとすると、膨大な時間がかかっているため、パスを通すことで実行ファイルの場所を絞っているわけです。

特定のソフトウェアをインストールした場合、そのソフトに対応するコマンドが利用できるようになる場合がありますが、ソフトをインストールしただけでは、コマンドのパスが通っていないため、実行ができないことがあります。

これができるようにするためにパスを通す必要があるのです。

パスを追加することで、パスが通された以下にあるディレクトリに実行ファイルがないかどうかを検索対象に追加されます。

パスの変更の仕方

.bash_profileを編集します。

.bash_profileは、ホームディレクトリにあります。
ない場合は作成するとよいです。

編集後、

source ~/.bash_profile

で反映されます。

ジェフ・ベゾスの不倫相手への流出メールの内容

  • 2019年1月24日 8:44 PM
  • 雑記

AmazonのCEOであり、世界長者番付一位の大富豪である経営者・ジェフベゾスの不倫がばれて、それが原因かどうかは定かではないですが(おそらくはそうでしょう)、離婚するということが、先日話題になりました。

この件に関しては、ジェフ・ベゾス自身も公式Twitterで公表しています。

離婚の原因と言われているのが、ハリウッドの有力エージェントであるPatrick Whitesell(パトリック・ホワイトセル)氏の妻でニュースキャスターのLauren Sanchez(ローレン・サンチェス)さんとのW不倫で、それがスクープされたからだと言われています。

Daily Mailで、ジェフ・ベゾス氏がローレン・サンチェスさんに送ったテキストメッセージが流出し、スクープされています。

ジェフ・ベゾス氏がサンチェスさんに送ったテキストメッセージ全文

ジェフ・ベゾス氏がサンチェスさんに送ったテキストメッセージが公開されていて、以下の内容となっています。

‘I love you, alive girl. I will show you with my body, and my lips and my eyes, very soon.’

‘I want to smell you, I want to breathe you in. I want to hold you tight.… I want to kiss your lips…. I love you. I am in love with you.’

‘I miss you. I want to kiss you right now and tuck you in slowly and gently. And maybe in the morning wake you up and not be quite so gentle with you.’

‘Your energy and ideas and competence and SPIRIT turn me on. You make me better. You’re meant for me.’

‘I am so full of love for you. My heart is growing just so it can have room for you. It’s bigger than it’s ever been and still swelling.’

‘I want to hold you tight.… I want to kiss your lips…. I love you. I am in love with you.’

‘You know what I want? I want to get a little drunk with you tonight. Not falling down. Just a little drunk. I want to talk to you and plan with you. Listen and laugh … I basically WANT TO BE WITH YOU!!! Then I want to fall asleep with you and wake up tomorrow and read the paper with you and have coffee with you

簡単に和訳してみました。

——————————————————-

愛しているよ、元気なあなたを。
あなたに私の体とくちびると、目を見せたい、今すぐに。

あなたの臭いを嗅ぎたい、あなたに息を吹きかけたい、強く抱きしめたい・・・
あなたの唇にキスをしたい・・・愛している、私はあなたへの愛と共にある。

あなたがいなくて寂しい。
私はあなたにすぐキスをして、ゆっくりと紳士的に押し倒したい。
そして朝起こして完全にあなたと紳士的ではない。

あなたのエネルギーとアイデア、能力とスピリットは私をその気にさせる。
あなたは私をよりよくする。あなたは私のために生まれてきた。

本当にあなたを愛している。
私のハートは成長して、あなたと部屋にいたい。
それはこれまでになく大きくなってまだ膨らんでいる。

あなたは私が何を欲しがっているか知っている?
私は今夜あなたと少し飲みたい。
泥酔はしない、少し飲むだけだ。
私はあなたとの計画を話したい。
聞いてそして笑う・・・私は単純に貴方と一緒にいたい!!
そして私は貴方と一緒に寝て、次の日に起きて、新聞を読み、コーヒーを飲みたい。

———————————————-

若干下ネタも入っていますが、ジェフ・ベゾス氏が、かなり情熱的にサンチェス氏に熱を上げている様子がわかります。

また、このメッセージに追加として、シャツを来ていないタオルだけを纏ったベゾス氏が鏡の前に立っている自撮り写真をサンチェス氏に送っていたそうです。

世界一の資産家でありIT企業のCEOも、メッセージが芸能人と同じように流出してしまうというのかというかんじがしますね・・・。

デジタルカードゲームのシェアについての調査

一昔前でいうとカードゲームはアナログで遊ぶものでしたが、最近はスマホやタブレットをはじめとしたデジタルカードゲームが人気となっています。

そこでデジタルカードゲームがどのくらい人気があるのか調べてみました。

ハースストーン(Hearthstone)

ハースストーンは世界でのプレイヤー数が1億人を突破しているということです。

プレイヤー1億人突破を祝おう! | ハースストーン

ただし、これは累計でのプレイヤー数なので、アクティブユーザがそれだけいるのかどうかは不明です。

調べたところ、月間プレイヤー数が3000万人ということなので、それでもだいぶアクティブ数がいるようです。

とはいえ、Googleトレンドで見る限りでは、検索結果は徐々に減っているようなので、アクティブユーザ数は減少傾向にあるといえそうです。

ちなみに、これは全世界でのプレイヤー数なので、日本でどれだけの数のプレイヤーがいるかどうかも不明です。

グーグルトレンドの検索結果を見る限りでは、ハースストーンよりもシャドウバースのほうがプレイ人口は倍近くなのでだいぶ多いようです。

世界で見ると圧倒的に人気なのがHearthstoneと言えるでしょう。

グーグルトレンドでの、国内のハースストーン、シャドウバース、ドラクエライバルズの検索結果比較
図1:グーグルトレンドでの、国内のハースストーン、シャドウバース、ドラクエライバルズの検索結果比較

シャドウバース

シャドウバースは、ダウンロード数が2000万ダウンロードを突破したということなので、ハースストーンと比較するとプレイ人口はだいぶ少ないです。

しかし、ハースストーンは世界で人気なのに対してシャドウバースは日本で人気のあるゲームなので、日本国内ではハースストーンよりもプレイ人口が多いものと考えられます。

海外のプレイヤー数がどのくらいいるのかは調べてみたものの不明でした。

おそらくメインは日本人プレイヤーだと思います。

ドラゴンクエストライバルズ

ドラゴンクエストライバルズは、ダウンロードが1300万を突破したということなので、ダウンロード数だけで見るとそれなりに伸びてはいるようです。

しかし、グーグルトレンドでの結果を見る限りでは、ドラゴンクエストライバルズの検索結果が見られません。

しかし、Youtubeの動画を見ているとそれなりに再生回数は出しているので、ある程度のユーザ数はいるように思えます。

ドラゴンクエストは、主に日本でのファンが多いゲームなので、プレイヤーもほとんどが日本人だと考えられます。

ドラゴンクエストが好きなユーザ向けに開発されたゲームで、ゲーム自体はよく作られているのですが、ドラクエユーザとカードゲームユーザがあまり一致しないのか、プレイヤー数は伸び悩みがやや感じられる気がします。

番外編:アナログカードゲームはどうなのか

Magic the gathering

アナログカードゲームのMagic the gatheringについても調べてみたのですが、こちらもGoogleトレンドを見る限りでは、全盛だったのが今から20年以上前で、プレイヤー数は徐々に減少し、現在は安定期になっているようなイメージです。

全盛期に比べるとだいぶプレイ人口が減っていますが今なお世界的に人気のカードゲームということはできるでしょう。

2013年にhearthstoneが発売されてから、当初はhearthstoneが爆発的な伸びを見せましたが、現在は減少傾向にあるので、およそhearthstoneのプレイヤー数の半数くらいがmtgのプレイ人口であるといえそうです。

グーグルトレンドでのmtg、Hearthstone、Shadowverseの検索結果比較
図2:グーグルトレンドでのMTG、Hearthstone、Shadowverseの検索結果比較

遊戯王、デュエルマスターズ

大人のカードゲーマー達からすると若干知名度が低い気もしますが、紙のカードゲームでは遊戯王とデュエルマスターズが最も日本国内では高いようです。

売上ベースでみると、マジックザギャザリングとは比較にならないほど、これらのカードゲームは売上が高いです。

Googleトレンドで見ると、国内では「遊戯王」の検索結果が最も多い結果となっていますが、これがカードゲームの遊戯王を指しているのかどうかよく分かりません。

※ 私は遊戯王プレイヤーではないので、何故遊戯王だけ検索結果がこれだけ多いのか、理解不能です・・・。

図3:グーグルトレンドでのMTG、遊戯王、デュエルマスターズ、シャドウバース、ハースストーンの検索結果比較
図3:グーグルトレンドでのMTG、遊戯王、デュエルマスターズ、シャドウバース、ハースストーンの検索結果比較

MySQL、PHP環境でのトランザクションについて

データベースを勉強していると、やたら出てくるのが「トランザクション」や「コミット」「ロールバック」という言葉です。

PHPやMysqlでプログラミングで案件に携わっていても、これらのトランザクションという仕組みに遭遇する機会が実はそれほどなかったりするのでイメージとしては掴みづらかったりします。

トランザクションとは

トランザクションとは、複数のSQLの実行処理を1つのまとまりにまとめたものです。

トランザクション内でのSQL実行時に正常に実行できなかったり、何か問題が発生した場合、トランザクション開始時まで巻き戻す(ロールバック)を行います。

分かりやすい例でいうと、銀行口座から別口座への送金がそうです。

ある口座からお金を引き落とす処理を行って、別講座に加算する処理を行うまでの間にシステム障害が発生したとすると、口座からお金が引かれた状態で、別の口座にはお金が加算されていない状態になり、そこから復元できなくなる可能性があります。

これを防ぐのがトランザクションという仕組みで、まとまりの処理が終了するまでの間にエラーが起きたら初期の段階にロールバックをして巻き戻したり、あるいは資源をロックして、他の処理からアクセスできないようにします。

MySQL+PHPのデフォルト仕様

MySQL+PHPではオートコミットがONになっています。

これはどういうことかというと、個別にSQLを実行するたびに自動でCommitを行います。

そのため、SQLは個別に処理されるため、上記のような銀行口座の処理のような仕組みを実装する場合には、トランザクションの仕組みを別途記述して実装しないといけません。

PHPにも begin Transaction commit rollbackといった機能があるため、必要に応じて記述することで、トランザクションの仕組みを利用することが可能です。

自分が現在作成しているSQLのプログラムにトランザクションの仕組みを導入する必要があるかどうかというのは、その処理によるため、必ずしも全ての処理でトランザクションを記述しなければいけないということではありません。

ただし、仕組みとしては理解しておく必要があるでしょう。

Javascriptでデータベース接続する方法

Javascriptでデータベースに値を挿入したり、取得する方法についてです。

基本的にはできない

結論からですが、基本的にはできません。

理由としては、Javascirptは、クライアントサイドの言語だからです。

クライアントサイドというのは、PC側のブラウザの機能で処理を実行するということです。

データベースというのは、サーバ側です。

そのため、サーバ側のデータベースから値を取得しようと思った場合、サーバ側で処理を実行する必要があります。

Javascirptはサーバ側で動くプログラムではないため、この処理は一般的にはサーバサイドの言語で行います。

サーバサイドの言語としては、例えばPHPやRubyなどがあります。

サーバサイドの処理として、これらの言語と組み合わせることが一般的には必要になります。

例外としてNode.jsを使えば可能

例外として、Node.jsを使うことでjavasciptの記述でデータベースに接続して処理を行う事が可能です。

Node.jsは、サーバ側の処理をjavascriptで行うことを可能としています。

jquery3で$.get is not a functionの原因と対処法

jquery3をサイトに導入していたところ、以前のjquery1系で動いていたプログラムが動かなくなったので原因を調べていました。

原因を調べる方法は、Safariの開発者用のツールで、開発→javascriptのコンソールで調べていたのですが、エラーの内容が

$.get is not a function

というものでした。

このエラーメッセージについて調べていたのですが、原因がわかりました。

読み込んでいたのはjquery3だったのですが、

https://code.jquery.com/jquery-3.3.1.slim.min.js

というライブラリを読み込んでいたのですが、この末尾についている「slim」というのが、容量を軽くするために、いくつかの機能を省いているバージョンらしいです。
getもその1つで、その他にもajaxなども動作しないようです。

そのため、読み込み先をslimでなく普通のjqueryに変更したところ動くようになりました。

https://code.jquery.com/jquery-3.1.0.min.js”

ソフトバンクからMVNOのmineo(マイネオ)に乗り換えてみた感想

使っていたスマートフォンのキャリアを、ソフトバンクからMVNOのmineo(マイネオ)に乗り換えて使ってみたので、感想を書いてみます。

ソフトバンクから乗り換えた理由

ソフトバンクを解約して安いMVNOに乗り換えた理由はただ一つで、月額料金の安さです。

ソフトバンクを利用していたときは、毎月7000円〜8000円の月額料金を支払っていましたが、mineo(マイネオ)に乗り換えてから毎月2500円程度の月額費用ですむ計算になります。

実に半額以下の利用料金になっている計算になります。

ソフトバンクからMVNOに乗り換えると本当に、半額以下になって単純にお得なのか?

ソフトバンクからmineo(マイネオ)に乗り換えることで、半額以下の月額料金になりましたが、ここにはカラクリがあって、単純にまるまる半額安くなったというわけではありません。

ソフトバンクは、機種本体代金の割引でお得感を出している

ソフトバンクは携帯電話の機種本体の代金を2年縛りで本体代金を割引(実質無料)のような形にすることで、お得感を出しています。

例えばiPhoneは、シムフリーの新製品を買うと10万円くらいしますが、これはMVNOを利用している場合、機種代金は別なので

MVNOの場合
月額2500円×24 + 10万円 = 16〜17万くらい

ソフトバンクの場合
月額8000円×24 + 本体割引で実質無料 = 17万くらい

ということで、新機種の携帯電話を2年ごとに買い換えることを考えた場合、MVNOでもソフトバンクでも総費用にそこまで差はありません。
(もっとも、MVNOで2年毎に新製品を買い換える場合、旧製品を売ることで少しお得になると思いますが)

しかし、携帯電話を4年使う事を考えた場合

MVNOの場合
月額2500円×48 + 10万円 = 22万くらい

ソフトバンクの場合
月額8000円×48 = 38万4000円くらい

と、15万円以上MVNOのほうがお得という計算になります。

つまり、MVNOは、1つの機種を長く使い続ければ続けるほど、また、スマホ本体の機種料金が安ければ安いほどお得になります。

一方、ソフトバンクなどの3大キャリアは、2年ごとにiPhoneを最新機種に買い換えることを考えるとMVNOを比較してもそこまで遜色ある内容ではありません。

以上のことを考えて、どちらが自分に合っているかを考えてみるといいでしょう。

自分の場合は、これまではiPhoneを2年おきに新しくしていたのですが、やめてできるだけ長く使い続けることにしました(といっても、4年おきくらいになると思いますが)

そのため、今後はこれまでよりもトータルで見て安くなると思います。

また、機種をiPhoneの最新の機種でなくて少し古い機種で我慢したり、Androidにすればよりコストパフォーマンスはよくなるでしょう。

デメリットは何なのか

ソフトバンクからmineoに乗り換えたことによるデメリットは何があるか

1・月額容量

月額容量が、ソフトバンクのときは月7GBでしたが、一方でmineo(マイネオ)にすることで、月3GBの契約にしています。

そのため、月に利用できる容量は減っていますが、これまでの利用履歴を確認したところ、平均月2GBくらいの使用だったので概ね問題ないと思います。

これは、自分の使い方が、自宅のWi-Fiがメインで、キャリアでの通信はおまけだからです。

こでも、自分がどのくらい毎月使うかを考えて選ぶと良いと思います。

2・混み合っている時間の遅さ

次に、昼どきなど混み合っている時間に通信帯域が制限されて遅くなるという点についてです。

これは実際あると思うのですが、私の場合はほとんど気になりませんでした。

理由としては1と同じで、Wi-Fiでの使うのがメインでキャリアの通信はおまけ程度だからです。

これが自宅にWi-Fiがなしでキャリアがメインでとなると、また違ってくるかもしれません。

今のところ問題は上記の2点だけです。

値段以外でmineoにしてよかったこと

値段以外の点で、mineoにしてよかったことも使ってみると何個かありました。

1.未使用帯域を翌月に繰り越せる

現在の契約では月の帯域は3GBですが、使わなかった場合、未使用分を翌月に繰り越すことができます。
例えば、1GBしか使わなかった月は、余りの2GBは翌月に繰り越せるので、翌月は5GB使うことができます。
そのため、実質的には3GBよりは多く使えるイメージです。

2.テザリングが無料

ソフトバンクのときは、テザリングオプションが月額500円かかっていました。
mineoではテザリングオプションがなくてもテザリングが可能です。

3.専用の通話アプリを使うことで通話料金が安い

ソフトバンクは、ソフトバンク同士の電話での通話料金は時間帯によっては無料ですが、それ以外のキャリアに電話した場合、30秒20円の通話料金がかかります。

mineoの場合、普通に電話した場合キャリア関係なく30秒20円の通話料金ですが、専用の通話アプリ「mineoでんわ」を使って通話をした場合、30秒10円の通話料金になります。
また、この通話アプリも使い勝手はそこまで悪くありませんでした。

トータルで見た満足度:非常に高い

ソフトバンクからmineoに乗り換えてしばらくたちましたが、総合的に見て満足度は非常に高いです!

今のところ他のMVNOに替えようかとか、3大キャリアにしようかという不満はありません。

ポイントとして、自分の利用の仕方がWi-Fiメインか、そうでないかというのは重要なポイントとなると思うので、迷っている人はその点を踏まえて検討されてはと思います。

MacbookでマクドナルドのWi-Fiに繋がらなかったときの対応メモ

マクドナルドにMacbookを持っていって、繋がらなかったときの対応のメモです。

状況

Macbook Proをマクドナルドの無線LANに接続して、ブラウザを開く

ポップアップでマクドナルドのWi-Fiログインの画面が出てこようとするが、「証明書が無効です」と出てくる→証明書の設定と出てくるので、証明書の設定をクリックして、常に信頼にチェックを入れる

やはりポップアップが真っ白のままでログイン画面が出てこない

対応

ブラウザを開くと、ネットにはつながらないが、ブラウザの画面に「時計が遅れています」→「PCの時刻と時計が合っていません」というエラーが表示されていることを確認。

PCの時計設定を見ると、確かに1月1日になって時間とずれていた。

そこで、MacbookProのWi-Fiの設定をスマホとテザリングでスマホのネットワークにつなぎ直し、Macbookの時刻設定をネットにつなげて一旦合わせる

この後に再度マクドナルドのWi-Fiにつなぎ直すことで無事にポップアップでのログイン画面が表示されてつながるようになりました。

bootstrapについての勉強メモ

CSSフレームワークとして有名な、Twitter bootstrapについての勉強メモです。

bootstrapのインクルード

ダウンロードしてFTPでアップロードしなくてもCDNからincludeする記述ができます。

//4系
//ヘッダに記述
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css" integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO" crossorigin="anonymous">

//フッタに記述
<!-- オプションのJavaScript -->
<!-- 最初にjQuery、次にPopper.js、次にBootstrap JS -->
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js" integrity="sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49" crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js" integrity="sha384-ChfqqxuZUCnJSK3+MXmPNIyE6ZbWh2IMqE241rYiqJxyMiZ6OW/JmZQ5stwEULTy" crossorigin="anonymous"></script>

グリッドシステム

bootstrapは、12本のグリッドで構成されていて、幅を指定する場合にそのグリッドのどれだけを利用するかを指定でき、幅指定がスムーズです。

クラス

.container クラス

全体を囲うコンテナです。
画面幅によって可変です。

.container-fluid クラス
可変のコンテナです

.row
行に与えるクラス

.col
列に与えるクラス

.col-画面幅-グリッド数

画面幅
bootstrap3系 .col-xs Extra Samll オートレイアウト(全幅に対応、主にスマホ縦用)
bootstrap4系 .col- Extra Samll オートレイアウト(全幅に対応、主にスマホ縦用)
3、4共通 .col-sm Samll 576px(スマホ横)
3、4共通 .col-md Medium 720px (PC)
3、4共通 .col-lg Large 940px(PC)
3、4共通 .col-xl ExtraLarge 114opx(PC)

レスポンシブの対応

列のグリッド指定は、12を超えると自動的に折り返します。

この仕組みを使って、例えばレシポンシブで記述する場合は以下のようにします。

<div class="container">

<div class="col-xs-12 col-md-4">
左カラム(PCのときは左カラムの隣に右カラムが回り込む、スマホのときは下に回りこむ)
</div>
<div class="col-xs-12 col-md-8">
右カラム
</div>

</div>

上記はBootstrap3系の場合で、bootstrapが4系の場合は以下の記述になります。
col-xsが4系ではcol-になっている他、containerだけでなく、rowで囲ってやらないといけなくなっています。

<div class="container">
 <div class="row">
<div class="col-12 col-md-4">
左カラム(PCのときは左カラムの隣に右カラムが回り込む、スマホのときは下に回りこむ)
</div>
<div class="col-12 col-md-8">
右カラム
</div>
 </div>
</div>

上記のように記述すると、スマホレイアウトのときは左カラムの下に右カラムが入ります。(.col-xs-12 4系では .col-12が適用される)
PCで見た時は、左カラムの横に右カラムが回り込みます(.col-md-4、.col-md-8)

メニューを折りたたみ式にしたい

collapseというクラスを指定することで、メニューを折りたたみ式にすることが可能です。

<button type="button" class="btn btn-info" data-toggle="collapse" data-target="#menu">menu</button>
<ul id="menu" class="collapse">
    <li></li>
<li></li>
    </ul>

テーブルのtdの横幅

bootstrap4からは、 class=”w-◯◯”(◯◯は数字)で横幅を%指定できる。

靴の臭いを取るのに冷凍、熱湯に浸すのを試してみた

  • 2018年12月10日 7:50 PM
  • 雑記

靴を毎日長いことはいていたら、臭いがついて自分でも少し気になるようになってしまいました。

靴の臭いを簡単に取る方法というのをネットで調べていると、「冷凍庫で1日冷凍すると菌が死んで臭いが取れる」という記述があったので試してみました。

1日冷凍してみた結果

1日靴を冷凍してみたところ、出した直後は臭いが確かになくなっていたのですが、しばらく時間が経つとまた臭いが少し戻ってきました。
つまり、冷凍したら臭いが消えるというのはでたらめで、菌は冷凍することで冷凍されている間は活動を停止するのですが、気温が戻ることで活動は再開されます。
臭いの原因は菌なので、冷凍したからといって菌が死ぬことはありません。(あくまで出した直後だけです)

熱湯に浸してみた結果

臭いの原因は菌ということは、逆に熱湯に浸すと菌は死滅するのでは?
ということで、煮沸した熱湯に靴を浸してみると臭いは消えるのか実際に試して実験してみました。

靴を鍋に入れて煮込む・・・というかんじではなく、煮沸したお湯に靴を数秒間浸してから抜き出すという程度です。
(さすがに煮沸まですると靴がおかしくなりそうなので)

熱湯は効果があった・・・しかし別の注意が必要

靴を熱湯を浸してみると、臭いが消えました。

これは、やはり一定以上の温度の熱で菌が死滅するからだと思います。

肉などの生鮮食品が、加熱すると安心というのと理屈は同じですね。

しかし、熱湯の熱は、靴の素材によっては、素材がおかしくなってしまうデメリットがあります。

私の試した靴では、靴の中敷きにしている素材がゴムのような素材だったので、熱で少し変形というか、歪むようなかんじになってしまいました。

こういうことがあるので、靴も素材を確認してふやけたりしそうであればやめたほうがいいでしょう。

しかし、臭いは乾かすと見事になくなりました。

靴は毎日同じ靴を履いていて蒸れたりすると臭いがつくのであくまで一時的な対処にしか過ぎないと思いますが、熱湯に浸すのは確かに効果があったので、臭いが気になる人は自己責任でやられてはと思います。

また、細菌は靴の中の何らかの汗や垢などを食事にしているようなので、単純に靴を何足か持っておいて、臭いが気になりだしたら予備の靴を準備しておいて、そちらに履き替えて臭いが取れるまで放置するのもおすすめです。
(というか、どちらかというと熱湯に浸すのも荒療治で素材に影響があるので、靴の臭いが気になる方は、できればそちらのほうがおすすめです)

WordPressでソースコードにSQLを直書きで新着記事を10件表示する

WordPressで、ソースコードにSQLを直書きで新着記事を10件表示するというのをやってみました。

やりたいこと

PHPのファイルにSQLを直書きで、新着記事から10件の記事を表示したい

何故SQL直書きが必要なのか

WordPressには、新着記事を指定件数表示する記述が準備されているので、通常であればSQL直書きで記事を取り出す必要はありません。

しかし、今回やりたいことは、WordPressのサブディレクトリにインストールした別のWordPress(ブログ用)から、新着記事を表示したいということです。

もともと、Simplepieというライブラリを使ってやっていたのですが、サイトをhttps化すると取得ができなくなってしまいました。(理由は分かりません)

そのため、仕方なしで、本体のサイトでブログのデータベースに接続し、そこから最新記事を取り出すことにしました。

SQL文は以下のようなかんじです。

#新着記事を10件取り出す
$s_sql = "
            select post_title, post_date ,guid
              from wp_posts
            where post_status = 'publish' order by post_date desc limit 10";

一応解説すると
wp_posts ・・・ WordPressの記事が格納されているテーブル
post_title ・・・ 記事タイトル
guid ・・・ 記事のURL
post_status = publish ・・・ 記事が公開されている
order by post_date desc limit 10 ・・・・ 最新記事から10件

あとは、普通に while文でループして記事を出力したらOKでした。

PHPの勉強メモ

PHPについての勉強メモです。

namespace(名前空間)

php5系の途中から利用可能になった仕様。

namespace ◯◯;

で名前空間を定義することで、同名のクラスや関数も定義して同時に読み込むことができる。

例えば異なる名前空間で同名のクラスが定義されている複数のライブラリを読み込んでから使用する場合は、

new 名前空間名\クラス名;

のようにして使うことができる。

use文での省略

名前空間は、

namespace ◯◯\◯◯\◯◯;

のように、サブディレクトリのような形式で使用することができる。

これが長くなると、

new ◯◯\◯◯\◯◯\クラス名;

のようなかんじで、記述が冗長になる。
記述が複数箇所になればなお冗長になる。

このため、use文を使うことで

use ◯◯\◯◯\◯◯ as A

のような形で宣言すれば

new A\クラス名;

のような形式で利用でき、記述が簡潔になる。

また、この宣言はいろいろな記述が可能で

use ◯◯\◯◯\◯◯\クラス名;

のような形式で宣言すれば

new クラス名のようなかんじでいきなり使用できる他、

use AB\CD\EF;

のような形式で、asを省略した場合

use EF\クラス名;

のような形式で記述が可能となる。

また、

use AB\CD;

のようなかんじで途中まで定義して

new CD\EF\クラス名;

のような使い方もできる。

また、これは、クラス名だけでなくメソッドを呼び出す場合も同様の手順で行うことができる。

::(スコープ定義演算子)

スコープ定義演算子は、クラスの静的プロパティやメソッドにアクセスする場合に使用する。

一般的な方法では、

クラス名->メソッド;
クラス名->プロパティ;

といった書き方がしますが、意味はこれと同じで

クラス名::メソッド;
クラス名::プロパティ;

といった書き方ができますが、前者は対象が動的な場合で、後者は静的であることを表しています。

どちらも実行結果は同じですが、プログラムの読み手が、アクセス先が静的で動的かが見ると分かるということです。

Cake-phpの勉強メモ

Cake-phpは、MVCアーキテクチャで構成されているPHPのフレームワーク

MVCアーキテクチャとは、Model、View、Conrollerで分離されている、いわばSwiftのXcodeと似ている。

Configファイル

Model

View

最近のCake-php

昔に比べると下火になっているものの、現在でも使われている。
世界ではそこまで使われていないものの、日本国内では人気がある。
競合するPHPフレームワークとしては、Laravelなどがある。

Cake-PHPの導入

作業環境にLAMP環境が整っていることが前提。

まずは、インストールするためにComposerを導入する必要がある。

これは、PHPに関する各種ライブラリの依存関係を管理するためのツールなので、とりあえずCake-phpを導入するにあたって必要となる。

あればスムーズというか、例ではほぼ使っているのでほぼ必須といってもいいだろう。

実際にMacのローカル環境に導入してみた結果

Macのローカル環境で使えるApacheの環境にCakephpを導入してみた。

まずはComposerの導入だが、これは問題なく進む。

CakephpをApacheのテストディレクトリまで移動してプロジェクトを作成。

導入の時点でWarningが出ているが、とりあえず実行することができた。

作成したプロジェクトディレクトリを見てみると、Cake-phpのフレームワークのファイルが一式生成されている。

それで、サイトにアクセスしてみると、500エラー。

エラーログを見てみると、php-intl.soがないとかそういうかんじのエラーが出ていた。

phpの拡張機能でphp-intlが必要ということで、入れてみる。

まずは、Hombrewを使って、brew コマンドでインストールを試みるが、brewコマンドで昔はインストールできていたのだが、現在はできなくなっているらしい。

Macportsというパッケージ管理システムを使ったらインストールできるらしい。

Homwbrewがパッケージ管理でMacportsのパッケージ管理システムで、何がどう違うか分からないが、やってみるととりあえずMacportsのほうではインストールできた。

しかし、相変わらずcakephpのプロジェクトを作成し直してもエラー。

エラーを見ると、php-intl.dllがないということ。

調べると、場所に問題があるのが原因で移動したらいいということのようなので、php-intl.dllを探してみると、どこにもない。
そもそも、.dllファイルはWindows環境で必要なものらしく、MacのLinuxベースの環境では不要らしいのだが、とにかく動かないので駄目。

環境構築の時点でつまづいてしまい、お手上げ状態だったのだが、多くのケースでXAMPまたはMAMP環境が前提になっていたので、MAMP環境を入れてみたところ、あっさりと動いた。

MAMP環境では動いて、ローカルのMac環境では動かなかった、その違いは何なのかよく分からないが、とりあえず動いたのでOK。

チュートリアルで実装してみる

Cakephpの公式サイトのチュートリアルで実装してみる。

まず、モデルの部分

これは、データベースのテーブルごとの規約を書いているところ。
テーブルのカラムごとのバリデーション等を定義できる。

モデルには、Entitityオブジェクトと、Tableオブジェクトがある。

コントローラーは、サイトのURLの呼び出しに対して実行される実行内容と考えればいい。

/Controller/◯◯Controller.php

の場合、サイトURL/◯◯で呼び出される。

ビューは、Templateディレクトリの中で、URLの階層構造と同じようにディレクトリを設置して、作成する。

拡張子がctpというのが変わっているが、Smartyと違って独特の記法があるわけではなく、普通のphpファイルに近い。

しかし、phpのごちゃごちゃしたややこしい記述部分はControllerやModelの部分に映っているので記述は最低限のphpの部分だけになっていてhtmlがベースとなっている。
そのため、フロントエンドエンジニアの人がファイルの内容を見て修正したり内容を理解しやすいというわけだ。

Cakephpのライブラリのソースはどこにあるか

Cakephpで呼び出しているライブラリのソースコードは、以下の場所にありました。

/vender/cakephp/cakephp/src/

例えば以下のプログラムがあります。

//名前空間Cake\ORM以下のTable Registryクラスを省略
use Cake\ORM\TableRegistry;

//Table RegistryクラスのgetTableLocatorメソッドは、'Cake\ORM\Locator\TableLocator'クラスのgetメソッドを実行します。ここではArticlesTableクラスを返します(Artices Tableクラスは、Tableクラスの拡張クラス)
//Model→Tableに作成したテーブルクラスにアクセスできる
$articles = TableRegistry::getTableLocator()->get('Articles');

//Table classのfind()メソッドを実行して$queryへ代入
//Articlesテーブルの行を全てselectで取り出す
//findはselectと基本同じ
$query = $articles->find();

//取得した行からqueryのtitleを出力
foreach ($query as $row) {
    //行の連想配列のtitleを出力する
    echo $row->title;
}

それぞれのメソッドやクラスの意味を理解しようと思ったのですが、正直良くわからないので、おまじない的に覚えておいたほうがよさそうです。
(むしろ、そういうのをいちいち理解する必要がないのがフレームワークのいいところ?)

データベース接続

コネクションオブジェクトに対して

$connection->query($sql);

でsqlを実行できるが、パラメータは受け付けず、また、sqlインジェクションの危険性があるため危険

executeオブジェクトの使用を推奨。プリペアードステートメントが使用できる。

$connection->execute(‘SELECT * FROM articles WHERE id = :id’, [‘id’ => 1])->fetchAll(‘assoc’);

型に対してバインドすることも可能。

$connection
->execute(
‘SELECT * FROM articles WHERE created >= :created’,
[‘created’ => new DateTime(‘1 day ago’)],
[‘created’ => ‘datetime’]
)
->fetchAll(‘assoc’);

プリペアードステートメントは、prepareで準備してから別のところで当てはめることも可能。

$stmt = $conn->prepare(
‘SELECT * FROM articles WHERE published = ? AND created > ?’
);

// 複数項目のバインド
$stmt->bind(
[true, new DateTime(‘2013-01-01’)],
[‘boolean’, ‘date’]
);

// 1項目ずつのバインド
$stmt->bindValue(1, true, ‘boolean’);
$stmt->bindValue(2, new DateTime(‘2013-01-01’), ‘date’);

newQuery()メソッドでクエリオブジェクトを生成して、クエリビルダを使用することも可能。

$connection
->newQuery()
->select(‘*’)
->from(‘articles’)
->where([‘created >’ => new DateTime(‘1 day ago’)], [‘created’ => ‘datetime’])
->order([‘title’ => ‘DESC’])
->execute()
->fetchAll(‘assoc’);

connectionオプジェクトから、insert文とupdate、delete文を実行できる

$connection->insert(‘articles’, [
‘title’ => ‘A New Article’,
‘created’ => new DateTime(‘now’)
], [‘created’ => ‘datetime’]);

$connection->update(‘articles’, [‘title’ => ‘New title’], [‘id’ => 10]);

use Cake\Datasource\ConnectionManager;
$connection = ConnectionManager::get(‘default’);

取得した行をを配列に読み込む

// 1行読み込む
$row = $stmt->fetch(‘assoc’);

// 全行を読み込む
$rows = $stmt->fetchAll(‘assoc’);

行数を取得する

$rowCount = count($stmt);
$rowCount = $stmt->rowCount();

エラー情報の取得

$code = $stmt->errorCode();
$info = $stmt->errorInfo();

トランザクションを利用する場合は、コネクションオブジェクトからbeginとcommitを使用することで利用できる。

$conn->begin();
$conn->execute(‘UPDATE articles SET published = ? WHERE id = ?’, [true, 2]);
$conn->execute(‘UPDATE articles SET published = ? WHERE id = ?’, [false, 4]);
$conn->commit();

XAMPPについて

XAMPPとは、ローカル環境、またはサーバ環境に、開発環境を揃えるためのツールです。

サーバにOSをとりあえずインストールしただけの状態では、必要なツールがインストールされていません。

そのため、それらのツールを一式インストールしようと思った場合、それだけでも手間がかかります。

XAMPPは、これらの必要な開発環境を一式そろえてくれるのに便利なツールです。

XAMPの頭文字は

X・・・クロスプラットフォーム、Linux、Windows、Macに対応
A・・・Apacheウェブサーバ
M・・・MySQL
P・・・PHP
P・・・Pearl

の略です。
もともとはLinuxのみに対応していてLAMPPだったのが、後にクロスプラットフォームに対応したのでXAMPPになったそうです。

ちなみに、Mac用のXAMPPのことはMAMPPともいいます。
やることは同じです。

特に開発PCがWindowsの場合Linux系のOSではないので、ローカル環境に開発環境を揃えたい場合は手間がかかるので便利です。

サーバがLinux系のサーバであったり、MacOSの場合はそこまで必要性はないように感じます。

仮想環境とどう違うのか?

XAMPPとは、ローカル環境に必要なソフトウェアを一式揃えるソフトウェアです。

そのため、サーバの仮想環境を作成するソフトとは異なります。

サーバの仮想環境を作成するソフトには、有名どころではVagrant+Virtual Boxなどがありますので、仮想環境を作成する場合はそちらのほうがよいでしょう。

XAMPPはどちらかというと、一括インストーラー的なソフトというイメージですね。

しかし、厳密にいうと一括インストーラーというわけでもなく、例えばMacにはローカルにもともとphpが入っている場合はもともと入っているphpとは別にMAMPP用のphpもインストールされて、それらはインストールされても上書きされるわけでなく区別されます。
設定を変更することで、どちらのphpを使うかを選択できます。

AWSの勉強メモ(実践編)

AWSについて、実際に使ってみて試してみています。

AWSは無料で1年間の間ある程度使用できるので、無料期間中にいろいろ試してみるというかんじでやっています。

EC2サーバの作成

AWSの代表的なサービスであるAmazon EC2の使い方についてです。

AWSにログインして管理画面を開く

EC2を選択

インスタンスの作成を選択

利用するサーバの種類を選択する。
(ここでは無力枠のサーバから選択)
AWSではEC2サーバ作成時に、まずどのOSを使うかを選びます。
様々なOSの種類が準備されています。
Linux系のサーバやWindowsサーバ、

メモリなど、サーバのスペックを選択する画面が表示されるので、使いたい種類を選択する。
(ここでは無力枠のサーバから選択)

サーバスペック以外に、インスタンスの設定、ストレージの追加、タグの追加、セキュリティグループの設定を選択できる。

サーバを作成時にキーペアを設定する。
キーペアは、サーバにログインするのに必要となる鍵情報で、AWSが保有する公開鍵と、ユーザが保有する秘密鍵で構成される。
これはAWSの場合は必須となります。

以上でEC2インスタンスの作成が完了です。

サーバへの接続

macでは、

ssh -i 秘密鍵ファイルへのフルパス [email protected]インスタンスのIPアドレス

で作成したEC2インスタンスに接続できます。

秘密鍵ファイルはダウンロードした秘密鍵をローカル環境に保存しているフルパスです。

インスタンスの削除

インスタンスをチェックして、アクションからインスタンスの状態→削除を選択
terminatedを表示されたら削除されている

WordPressサーバを作る

インスタンスの作成から、最初のOSを選ぶところで、左メニューの「AWS Marketplace」を選び、WordPressを選択。

あとは通常のEC2インスタンスの作成手順と同じです。

作成したWordPressウェブサイトにアクセスする

コンソールからEC2インスタンスを選択すると、画面下にインスタンスのパブリックIPが選択されるので、コピーしてアドレスに入力すると、作成したWordPressサイトが表示される。

アドレス/admin または /wp-admin

にアクセスすると、管理画面のユーザID/PWが表示される。

ユーザ名はデフォルトは、「user」で、パスワードは

コンソールのEC2インスタンスを選択して、アクション→インスタンスの設定→システムログの取得でパスワードを書いてあるところがあるので確認できる。

株式投資についての勉強メモ

株式投資についての勉強メモです。

株価収益率(PER)

現在の株価が、一株あたり純利益の何倍なのかを表す指標。
利益に対してどれだけ株価があるかを表している。
高いほど割高、安いほど割安。

株価 / 1株あたり純利益

株価純資産倍率(PBR)

現在の株価が、一株あたり純資産の何倍なのかを表す指標。
利益に対してどれだけ株価があるかを表している。
高いほど割高、安いほど割安。

株価 / 一株あたりの純資産

配当利回り

一株あたりの年間配当額 / 一株購入価格 × 100

Twitter開発者アカウントに軽い気持ちで申請したらリジェクトされた

1開発者として、Twitterの開発者用アカウントを取得してTwitter APIの使い方の練習をしたみたいと思ったので、とりあえず開発者用のアカウントに登録しようと試みてみました。

やってみたいと思ったのは、とりあえず勉強がてらということで、特定のツイートをタイムラインで検索して、特定のワードを含むツイートがあった場合に自分に通知するというアプリ。

それで、このTwitterの開発者用のアカウント、以前は取得が誰でもすぐできたらしいのですが、厳格化されているらしく、使用目的やアプリの仕様について詳しくTwitterの審査チームに伝えないと申請が通らなくなっているらしいです。

とりあえず最初に審査が来たのですが、Twitterチームからの返答としては

——————————————–

以下の情報を追加でください

・ あなたの使用例では、政府や公共機関がTwitterのコンテンツや情報にアクセスします
・ あなたの製品ややサービスや政府や公共機関が使用する特殊な使用例です

——————————————–

という内容だったのですが、ユーザとして政府や公共機関は想定していないので、それらはユーザとして使用しないということで返答しました。

すると返答として要約すると、

———————————————–

もっと詳しい仕様やユースケースをくれ

———————————————–

という内容のメールが来たので、具体的な仕様や想定例について最初に書いていた内容を詳しく書いて返信しました。
すると

————————————————-

あなたのTwitterの開発者用アカウントは許可されませんでした。
関心を持ってくれてありがとうございました。

—————————————————-

という返事が・・・。
さらに開発者用のアカウントにアクセスして、アプリのページにアクセスすると

————————————————-

あなたはアプリを作成できません。
あなたの開発者アカウントはリジェクトまたは凍結されたのでアプリを作成できません。

————————————————-

と表示されました。

申請した内容に問題があったのかと思い、メールで、何が問題があったのか教えて欲しいと送ったのが返事がなく、かつ、別のプランで再申請は可能かと書いたところ、これも返事がありませんでした。

正直、これは不親切極まりないと思ったのですが、調べてみたところ、同じアカウントで再申請できる箇所が今のところ見当たらないので、申請したTwitterアカウントを開発者アカウントとして使用することはできないようで、別のTwitterアカウントを作成して、そのアカウントから再申請するしかないようです。

開発者に対してTwitterの運営が厳しくなっている昨今の事情に加えて、ポリシーや解説が全部英語なので、それらのハードルが高い開発者としては、なかなか苦労が強いられますね・・・。

WordPressのソースコードを読み込んでPHP勉強

良いプログラムを書くには、良くできたプログラムのソースコードを読むことだということで、まずはオープンソースソフトウェアのWordPressのソースコードを読むことで、良いコードの勉強をしてみます。

ちなみにWordPressはPHPで書かれているのでPHPの勉強になります。

関数定義の前にコメント

関数名の前にはコメントがついている
その関数が何をする関数なのか、どのバージョンからか、グローバル変数、引数、返り値の型と、それぞれの解説が入っている

インデントはタブスペース

インデントはタブスペース1つで作られている。
タブスペースは半角空白4つ

defineの前にコメント

defineでマジックナンバーを定義する前にコメントが書かれている

requireの前にコメント

requireで外部ファイルを読み込む前に一行コメントが書いてある

現在のファイルの書き方

dirname( __FILE__ ) .

これで現在の階層のファイルの場所が読みだせる

コメント

ファイルの先頭に、そのファイルが何についてのファイルかのコメントが書かれている
コメントはあらゆる処理の前に書かれていて、他人から見てその処理が何なのか分かりやすい

プログラムの処理の流れ

index.php
テーマを使用することの宣言

wp-blog-header.php
ワードプレスの環境とテンプレートの読み込み

wp-load.php
ライブラリの読み込み
——————-
マジックナンバーの設定
wp-config.php
設定情報の読み込み
===================
設定情報の読み込み
wp-setting.php
セッティングの読み込み
#######################
load.php
関数定義ファイル
default-constant.php
初期値が設定してある
plugin.php
関数が定義してある
“””””””””””””””””””””””
class-wp-hook.php
クラスとメソッドの定義
“””””””””””””””””””””””

#######################

===================

——————-

wp()
ワードプレスのクエリの実行

template-loader.php
テンプレートの読み込み

スマホサイトのデザイン、UI研究

スマートフォンサイトのデザインやUIを、世界でもよく見られていると思われるサイトを見ていってコメントしていって、自分のサイトの鑑識眼を高めたいと思います。

Apple

Appleのサイト

https://www.apple.com/jp/

ジョブズ時代のAppleのサイトは、スマホで見てもスマートフォンに対応していないことで有名でしたが、現在はスマホに対応しています。
レスポンシブデザインで同じコードでPCとスマホの両方に対応しています。

サイトデザインの特徴としては、PCでは横長のグローバルメニューが、スマホでは同一メニューで折りたたみのハンバーガーメニューになるようになっている。

フッターメニューのデザインはこんなかんじ

フッターメニュー

ECサイトのヘッダでは、アプリへのリンクが表示され、誘導される。
ハンバーガーメニューは左上で二本線、右上は手さげカバンタイプのカートアイコン。

Appleサイト-ECヘッダ

ボタンのデザイン

Apple-ボタンデザイン

カートでのボタンはフラットデザイン。上のボタンはグラデがあるのだが、統一されていない?

Appleのボタンデザイン2

コンテンツエリアは写真が多く、見出しには見出しっぽい装飾がない。
左右にある程度マージンと行間の余白あり。

Appleコンテンツエリア

テーブルはあまり使用していない。

要素は縦に並べているのが多い。

スマホでは横に並べると要素が圧迫されるので、極力横並びの要素を使っていない。
PCでは見出しから横に要素を並べる場合でも、スマホでは縦に並べるようにしているところが多い。

絶食(ファスティング)を1日やってみた減量結果と体験の考察

  • 2018年11月19日 5:16 PM
  • 雑記

ダイエットをしたいと思っている人は思いと思いますが、運動やカロリー制限、◯◯食ダイエットなど様々な種類があります。

その中でも最もシンプルかつ短期間で見たときに効果が大きいと思われるダイエット方法は絶食(ファスティング)です。

当たり前ですが、食べなければ体重は減少します。

当たり前ですが・・・。

しかし、絶食をするのはおいしいものを目の前にしても我慢する意思が必要になり、またリバウンドにも注意が必要です。

かくいう私も常にダイエットをしているつもりにはなっているのですが、実際にファスティングをやった経験はなかったので、ものは試しと1日やってみたので、減量効果と体験について書いてみたいと思います。

水分のみは補給して、水分以外の食べ物は1日の間全く口にしませんでした。

運動は犬の散歩以外していません。

減量結果

まず、結果から書くと1日で0.8kg減という結果でした。

1日絶食すると1kg以上は減ると思っていたのですが、あまり大きく減少しなかったのに少しショックを受けました。

しかし、ダイエットをしていて、例えば野菜だけ食べて炭水化物はパン1枚なんていうダイエットをしても、1kg以上体重は減ることがあります。

そのため、計測誤差や前日に食べたものの影響、運動量など様々な要因があると思うので、日によっては1kg以上減ったり人によっては3kg以上減るなんていう人もいるかもしれません。

またファスティングをする日があれば、結果を追記したいと思います。

体験としてはどうだったか

この日は、前日はしっかりと食事をとっていたのもあり、日中は、例えばテーブルの上に置かれたコロッケを見てぐっと我慢するというシーンもありましたが、それくらいで寝る時までそこまで食べたいという気持ちが押し寄せてくることはありませんでした。

しかし、夜寝てから朝起きるまでの間にグーっという苦しさというか、理由はよく分からないのですが、何も食べていないからか空腹のかんじがあって少し辛かったのですが、ある程度時間が経ってすぎるとおさまって普通の状態に戻りました。

次の日、朝起きてもどうしても何か食べたいというかんじがあるかと思ったのですがそれほどではなく、ただ1日何も食べなかったので何かは食べたほうがいいだろうというかんじできちんと食事を取りました。

Twitterから英文メールが来たので和訳

開発者用のTwitterアカウントに申し込みをしたところ、以下の英文メールが来で英語がよく分からなかったので和訳をします。

Thank you for your response.
返事ありがとうございました。

At this time, we still do not have enough specific information about your intended use case to complete review of your application. As a reminder, we previously requested additional information about:
今回は、私達はアプリケーションのレビューを完了するにあたって、あなたの利用目的に関する情報を十分に得られませんでした。
覚えておいてください、私達は前もって追加情報を要求しました。:

The core use case, intent, or business purpose for your use of the Twitter APIs
メインとなるユースケース、意図、またはTwitterのAPIを商業目的で使用する場合の目的。

Note that “business purpose” in this context includes uses not necessarily connected to a commercial business. We require information about the problem, user story, or overall goal your use of Twitter content is intended to address.
注意してください、この文脈でのビジネス目的は、広告ビジネスに接続するときに必ず必要になるものではありません。
私達は問題に対して、ユーザーストーリー、またはTwitterのコンテンツの使い方の全体のゴールが住所を意図しているかを必要としてます。

If you are a student, learning to code, or just getting started with the Twitter APIs, please provide details about potential projects or areas of focus.
もしあなたが学生であれば、コードを学習する、または単にTwitterAPIを使いだしてみたい場合、潜在的なプロジェクトのまたはどのエリアにフォーカスするかの詳細を提供してください。

If you intend to analyze Tweets, Twitter users, or their content, share details about the analyses you plan to conduct and the methods or techniques
もしあなたがつぶやきやTwitterユーザ、またはそれらのコンンツを分析することを意図してるのであれば、分析の詳細として実装の方法と計画や技術をシェアしてください。

Note that “analyze” in this context includes any form of processing performed on Twitter content. Please provide as detailed and exhaustive an explanation as possible of your intended use case.
注意してください、ここでの分析の文脈はTwitterのコンテンツにおける動作の挙動を含んでいます。詳細と意図しているユースケースを可能な限り詳細に説明してください。

If your use involves Tweeting, Retweeting, or liking content, share how you will interact with Twitter users or their content.
あなたのケースはツイート、リツイートやコンテンツへのリンクに関わり、あなたがTwitterのユーザやそれらのコンテンツに作用するかをシェアしてください。

If you’ll display Twitter content off of Twitter, explain how and where Tweets and Twitter content will be displayed to users of your product or service, including whether Tweets and Twitter content will be displayed at row level or aggregated
もしあなたはTwitterのコンテンツを表示する場合、つぶやきとTwitterのコンテンツがあなたの製品またはサービス(つぶやきとTwitterのコンテンツが行のレベルまたは集合であるとしても)のユーザに対してどう表示されるかどうかを説明してください。

Where possible, please share links to illustrations and/or sample work products. Note that we can’t view attachments.
可能であれば、イラストや製品のサンプルをシェアしてください。注意として添付ファイルは見ることができません。

To provide this information to Twitter, reply to this email. Failure to provide the necessary information will result in the rejection of your application.
Twitterへこの情報を提供する場合、このメールに返信してください。必要な情報を提供することに失敗するとあなたのアプリケーションの拒絶の結果になります。

Thank you for your interest in building on Twitter.
Twitterの制作に対するあなたの興味に感謝します。

Xcode/Swiftの勉強メモ〜ラベルが入力フィールド、ボタンで切り替わる〜

Xcode/Swiftでアプリを作成する勉強メモです。

作るアプリの仕様

テキストラベル、入力テキストフィールド、ボタン

この3つのパーツがあって

・ テキストフィールドに文字を入力することで、テキストラベルが入力した文字列に変更される。
・ ボタンを押すと、テキストラベルがデフォルトのテキストに切り替わる

というシンプルな仕様です。

実装の流れ

ストーリーボードにそれぞれのパーツを設置する

ストーリーボードを選択すると、画面にパーツが設置できるので、テキストフィールド、ラベル、ボタンをそれぞれ設置します。

設置するには、View→Libraries→Show Libraryで一覧が表示される他、ストーリーボード右上のLibraryのメニューアイコンからも表示されます。

ラベル、フィールド、ボタンのパーツをそれぞれ設置して位置や大きさを調整します。

ViewConrtollerにプログラムを記述する

ストーリーボードはUI的な部分になりますが、ViewControllerはプログラムの実装部分になります。

ViewConrtollerクラスにUIパーツを結びつける

ViewConrtollerクラスの内部に、ストーリーボードのUIパーツをControl+ドラッグして、アウトレットを作成します。

画面を分割して、片方にストーリーボードを表示し、片方にコードを表示することで片方からドラッグしてコードとUIを連結することが可能です。

それぞれ以下のように名称をつけます

ラベル:mealNameLabel
テキストフィールド:nameTextField
ボタン:UIで設置してメソッド名SetDefaultLabelText

メソッドSetDefaultLabelText内には、以下のコードを追加します。

mealNameLabel.text = “Default Text”

この時点でコンパイルしてテストして見ると、ボタンを押すとラベルの名称が「Default Text」に切り替わるプログラムが実行されます。

テキスト入力部分を実装

それでは、テキストを入力することで、ラベルが切り替わる部分を実装します。

まずは、

class ViewController: UIViewController {

となっているのを

class ViewController: UIViewController, UITextFieldDelegate {

と、 , UITextFieldDelegate を追加します。

これは、クラスがコンパイラに UITextFieldDelegate でもあると伝えています。

次に、 viewDidLoad() メソッドに、

nameTextField.delegate = self

を追加します。

これは、ロードされたときに、テキストフィールドが自身のdelegateであるとしています。

textFieldShouldReturn、textFieldDidEndEditingメソッドを実装

UITextFieldDelegateには8つのメソッドが用意されていますが、そのうちの2つをここでは使用します。

textFieldShouldReturn は、 テキストフィールドが改行された場合に自動的に実行されるメソッドです。

ここでは以下の記述を追加します。

textField.resignFirstResponder()
return true

これは、テキストフィールドを入力してリターンキーを押したときに、ファーストレスポンダを終了するということで、具体的には入力キーボードを閉じます。
この処理を入れないと、リターンキーを押してもキーボードが閉じず入力を終えることができません。

textFieldDidEndEditing は、テキストフィールドの編集が終わったときに呼び出されるメソッドです。

ここでは

mealNameLabel.text = textField.text

を追加します。

これは、ラベルにテキストの入力を反映させる処理になります。

以上を実装すると、仕様を満たしたアプリが完成します。

delegateとは何か

このサンプルで、UITextFieldDelegateというのがでてきたのですが、その概念がよく分かりませんでした。

調べてみたところ、deleateとは委譲とか代理人という意味で、まず ViewContrllerクラスに、UITextFieldDelegateクラスを継承することでUITextFieldDelegateで定義されているメソッドが利用可能になるのですが、それだけではtextfieldで利用可能にならず、

nameTextField.delegate = self

のような宣言が viewDidLoadで必要になるということだったのですが、このあたりは分かるような分からないようなかんじでした。

表示された画像をタップすることでスマホから画像をアップロードできるアプリ

まずは、ストーリーボードに、オブジェクトライブラリから、「imag view」を選択して配置する。

左ナビのメニューから「Assets.xcassets」を選択し、「+」ボタンを選択して「New Image Set」を選択し、画像をドラッグドロップでアップロードする。

ストーリーボーそに戻って配置したimage viewを選択し、Attributeインスペクタメニューから「image」の項目を、先程アップした画像を選択する。これでデフォルトの画像が設定される。

次にタップジェスチャを設定する。

オブジェクトライブラリから「tap gesture」を選択し、image viewの上にドラッグアンドドロップする。
上のメニューにタップジェスチャアイコンができ、image viewオブジェクトとタップジェスチャが紐付けられる。

次に、ViewControllerにimage viewをコントロールドラッグし、アウトレットとして接続する。

タップジェスチャアイコンをVIewControllerにドラッグドロップし、タイプを「UITapGestureRecognizer」に設定する。
メソッドの中に実行する内容を追加する。
内容としては、キーボードを隠し、フォトライブラリの画面に画面遷移を行うというもの

ViewContorollerに UIImagePickerControllerDelegate, UINavigationControllerDelegate をスーパークラスとして追加

準備されている関数として、imagePickerControllerDidCancel、imagePickerControllerを追加。

関数は準備されているもので、内容が空になっているので、実行内容をそれぞれ追加する。

関数はスーパークラス「UIImagePickerControllerDelegate」の中にそれぞれ定義されている。

imagePickerControllerDidCancel
ユーザがフォトライブラリをキャンセルしたときに自動的に実行される。
ユーザがフォトライブラリでキャンセルしたときにフォトライブラリを消すというもの

imagePickerController
ユーザがフォトライブラリで画像を選択したときに自動的に実行される。
ユーザが選択したオリジナル画像をimage viewに設定し、フォトライブラリを消す

最後に、左メニューから「info.plist」を選択し、一番下の項目に「+」を選択し、「Privacy-Photo Library Usage」を選択し、Valueとして「Allows you to add ptors to your meals」とコメントを追加。
これは、iOS10から必要になった機能で、プライバシーを求める場合にユーザに対して文面を表示する機能で、ないと実行できません。
この場合はフォトライブラリにアクセスするので、必要になってきます。

LINEモバイルを使ってみて分かった注意が必要な点

ラインモバイル

父親の携帯電話を以前使っていたソフトバンクの携帯電話から、LINEモバイルの携帯電話に変更してみたのですが、変更してみて分かった注意が必要な点を書いておきます。

1.ソフトバンク回線では海外で音声通話が使えない

LINEモバイルでは、docomo回線とソフトバンク回線が選べるのですが、ソフトバンク回線にしていると、海外に行った場合に音声通話が利用できません。
オプションでも使えないので、海外旅行に行って音声通話を使いたいと思っている人は注意が必要です。
なお、docomo回線の場合はオプションで海外での音声通話ができるので、海外で音声通話が必要な人はdocomo回線を選んでおくとよいでしょう。

2.国内通話10分以内無料に注意

LINEモバイルでは、国内通話10分以内無料というオプションがあるので、電話をよくする人はオプションでつける人が多いかと思いますが、国内通話10分以内無料にオプションに加入していても、電話を普通に電話をしていると通話料金を普通に取られます。
音声通話の10分以内無料を有効にしたい場合は、いつでも電話のアプリをダウンロードして、そこか電話をかける必要があります。

また、このいつでも電話のアプリの使い勝手が微妙な点がいくつかあります。

・ 連絡先のグループ分け機能が利用できない
・ 着信履歴からかけ直しができない

という2点です。
正直、この2点だけ考えてみてもいつでも電話アプリの使い勝手があまりよくないので、ここも注意が必要な点として考慮しておいたほうがよいでしょう。

オブジェクト指向について

オブジェクト指向プログラムは、特定の属性とメソッドを持ったクラスを定義して利用する仕組みのことです。

オブジェクト指向のメリット

ポリモルフィズム

クラスの継承の概念を利用することで、同じ名称のメソッド(関数)で、異なる挙動をすることができます。
オブジェクト指向を概念を使っていない場合、例えば車の「走る」メソッドと、バイクの「走る」メソッドを作る場合、それぞれ別名の関数を定義しないといけません。
オブジェクト指向を使っている場合、走るメソッドは名称としては1つでも、それぞれ車クラスから、バイクのスーパークラスを定義することで、同じメソッド名で異なる挙動をさせることができます。
何のメリットがあるかというと、結果的に定義するメソッドの数は同じですが、メソッド名は1つで済むのでよりシンプルです。(そのかわり、複数のクラス名は存在します)
これをポリモルフィズムといいます。

カプセル化

カプセル化とは、外部から見たときにその内容が分からないことです。
クラスを定義して、そのメソッドを呼び出すだけなので、プログラムのその部分を見たときにはシンプルです。
そのため、複数の人で作業する場合、作業する人は自分が担当する箇所の修正に集中できます。

まとめ

オブジェクト指向は、共通した性質を持っているものの意味が違う複数の機能やふるまいを実装する場合に便利です。

プログラムを実装する場合に、前段階で、作成するこの複数の機能は、この部分は共通してこの部分は異なっていると、そのようなことが分かっている場合、共通している性質をスーパークラスとして定義し、異なる部分をサブクラスとして定義することで、実装や修正にかかるコストを削減できます。

また、プログラムが全体としてまとまりとして分かれるため、分かりやすくなるメリットもあります。

オブジェクト指向を使ってプログラムを実装する場合、実装前に設計の段階である程度クラスを定義したり設計を考慮する必要があります。

パーミッションについて分かりにくいのでまとめた

  • 2018年10月23日 10:09 PM
  • Linux

linuxでサーバ上の作業を行っていると、必ずパーミッションという概念にぶつかる。

chmod 755 とか

chown とか

いろいろあって、何となくわかったようでわからないようなかんじのするあれだ

今一度パーミッションの概念についてまとめてみた。

まず、パーミッションで3桁の数字があるが、これは左から所有者、グループ、その他の順である。

所有者というのは分かりやすく、そのファイルやディレクトリを作成したユーザのことだ。(chownで変更は可能)

グループというのは分かりにくいが、そのファイルを所有しているグループのことだ。

linuxでは、ユーザはならず何らかのグループに属している。
グループには複数のユーザが所属している。
設定次第では、ユーザが複数のグループに所属する場合もある。

そのファイルのグループに対してのパーミッションということである。

分かりやすくいうと、1つのパソコンに複数のユーザがログインすることを想定したとして、それぞれに固有のユーザIDとパスワードでログインしていると想定する。
そのときに、グループに読み出し設定を与えていると、同じグループに所属しているユーザであれば閲覧が可能で、グループ以外のユーザであればアクセスできないと言った挙動が可能だ。

グループの概念は、個人PCや個人で管理しているサーバの場合はあまり必要がない概念だが、複数のユーザが異なるID/PWでアクセスするPCやサーバの場合理解しておくことが必要がある。

その他は、それ以外のユーザで、所有者でもなく、グループでもないユーザだ。

また、7という数字は、2進数の3桁で表されていて

読み出し 書き込み 実行

で、

7:111:全て可能
6:110:読み書き可能
5:101:読み実行可能
4:100:読みだけ可能
3:011:書き込み実行可能
2:010:書き込みのみ可能
1:001:実行のみ可能
0:000:全て不可

といったかんじだ。

ファイルやディレクトリは、作成時のユーザとグループが与えられるが、それぞれchownコマンドで変更が可能となっている。

ホーム

フィード

ページの上部に戻る