CakePHPのFlashComponentについて

CakePHPのFlashComponentについての解説です。

公式サイトでは以下のページに解説があります。

フラッシュ

公式サイトの解説が分かりにくいので、自分流の解釈ですが、FlashComponentは、特定のメッセージをサイトで表示するのに使います。

Sessionに表示するデータを保存して、画面遷移後に表示することが可能です。

普通にエラーメッセージを表示する場合と比較すると、表示するメッセージを保存して、画面遷移後の表示に使う事ができる特徴があります。

使い方

Controllerで以下の定義

public function initialize() {

parent::initialize();
$this->loadComponent(‘Flash’); // Include the FlashComponent

}

表示したいデータを以下のように使う。

//成功した場合出力。リダイレクト後のページで表示される

successやerrorなどのテンプレートは、/sec/Template/Element/Flash以下にあるので追加や編集も可能。

$this->Flash->success(__(‘Your article has been saved.’));

$this->Flash->error(__(‘Unable to add your article.’));

テンプレートの以下の記述の場所にFlashメッセージが表示される

<?= $this->Flash->render() ?>

CakePHPのLoadComponentについて

CakePHPのLoadComponentについての解説です。

LoadComponentメソッドは、Controller内で実行することができ、あらかじめCakePHPの準備されているComponentを呼び出すことができます。

Componentとは、機能のようなもので、メソッドのかたまりのようなものです。

一般的なプログラムでのライブラリ読み込みのようなものと考えればよいでしょう。

Componentをコントローラで使用する場合は、initializeメソッドの中でLoadComponentを使って該当のComponentを呼び出します。

読み込むことができるComponentには以下の種類があるので、詳細は以下のそれぞれの記事を参照とのことです。

CakePHPのaddBehaviorについて

CakePHPのaddBehaviorメソッドについての解説です。

CakePHPのチュートリアルを進めていると、Tableクラスで以下のような記述があります。

class ArticlesTable extends Table
{
    public function initialize(array $config)
    {
        $this->addBehavior('Timestamp');
    }
}

上記の意味がわからなかったのですが、調べてみると以下のような記述がありました。

デフォルトの設定は以下のようになっています:

  • 新しく Entity を保存するとき、 created と modified に現在の日時を設定します。
  • Entity を更新したとき、 modified に現在の日時を設定します。

上記のように宣言することで、対象のテーブルの項目「created」と「modified」が、データが作成されたときにタイムスタンプが更新されるようになる他、データが更新されたときにmodifiedの項目が自動で更新されるようになるということです。

AWSで何も使ってないのに課金される問題に対処

AWSの試用期間中で無料期間中にいろいろと試しているのですが、インスタンスを使用後に削除したのに、請求で料金がチャージされているのが謎でした。

ダッシュボードで利用状況を確認しても、利用しているEC2インスタンスは存在していないのに、EC2インスタンスに対して料金がチャージされていっているのです。

原因について調べていたところ、原因が判明しました。

AWSのダッシュボードの右上で、AWSのロケーション(米国東部とかいろいろある)を変更できますが、現在のロケーションでなく、別のロケーションに存在していました。

そのため、現在のダッシュボードに利用しているリソースが存在していないけど料金がチャージされているという場合、ロケーションを1つずつ変更しつつチェックして確認することで見つかる場合もあると思います。

Laravelとcakephpの違い

phpのフレームワークであるLaravelとcakephpの違いについてのメモです。

共通点

MVCアーキテクチャ(Model-View-Controller)

違い

テンプレート記法

Laravelはbladeテンプレートで、cakephpは.ctpとなっていて、テンプレートの記法が異なっています。

Laravelのほうが独自な記法なかんじで、cakephpは普通のphpの構文に近い(htmlとphpのミックス)感じです。

コマンドラインインターフェース(CLI)

コマンドラインインターフェースが、Laravelはartisan、cakephpはbakeとなっていて、コマンドが違います。意味としてはほとんど同じです。

URL規則、ルーティング

Laravelは、サイトのURLとそれに対応して実行されるコントローラーはroute.phpで管理されますが、Cakephpは基本的には命名規則で決定され、ルーティングはおまけといったかんじです。

Vue.jsで、v-forディレクティブの:keyの意味

Vue.jsで、Vueオブジェクトのデータをループさせるときに、v-forディレクティブを使用します。

<li :v-for=”変数 in Vueオブジェクトのデータ名”>{{ 変数.データ名 }}</li>

上記のような感じで使いますが、いろいろなサイトでコードのサンプルを見ていて、上記のような書き方だけのときもあれば

<li :v-for=”変数 in Vueオブジェクトのデータ名” :key=”変数.id”>{{ 変数.データ名 }}</li>

のように、:keyがついている場合とついていない場合があります。

何のために :key がついているのか調べてみたのですが、Vueの機能でDOMを書き換えた時に、keyを指定していないと、順番が変わってしまうことがあるそうで、つけておくことで並び順を保持できるそうです。

ajaxについての勉強メモ

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

ajaxとは

ajaxとは、javascritを使って、ページを非同期に更新する仕組みのことです。

とはいえ、ajaxという言葉を使わなくても、javascriptは、普通にスクリプトを実行することで、イベント発生時(マウスオーバーやクリック時など)、ページの内容を書き換えることは可能です。

では、ajaxとはその通常のjavascriptの仕組みと何が違うのでしょうか。

それは、ウェブページから、動的に現在のページでない他のページからのリソースを要求し、その結果をページに反映できるという点です。

たとえば特定の要素をマウスでクリックしたときに、ajaxの仕組みを使って、phpファイルを実行し、その帰ってきた結果を解析してページ内に反映させることができます。

この仕組みを実現するためにjavascirptに実装されているAPIの機能がajaxです。

そのことを、例えばフォームをサブミットしたりページをリロードしたりせずに実行できる仕組みと考えればよいでしょう。

javascriptの$(function(){})の意味について解説

javascriptのソースコードを見ていると、よく以下のような記述があります。

$(function(){})

これを、javascript初心者の人が見ると

???

となりますが、この意味について解説したいと思います。

まず、javascriptでは、関数をオブジェクトとして定義することができ、そのまま関数名を定義せずに変数に代入してオブジェクトにすることができる。

この事は知っている人が多いと思います。

また、javascriptは、即時関数という機能があって、定義した関数をその場ですぐに実行することができます。

これは、

(function() { 実行内容 } ())

このような書き方をします。

上記のような書き方をすることで、実行内容をその場で実行することができるわけです。

しかし、 タイトルにある

$(function(){ 実行内容 })

は、上記の記述とも微妙に違います。

これは、jQueryを使用している場合の記述です。

ページのDOMツリーの読み込みが完了した後に、実行内容を実行するということで、javascirptの通常の即時関数と似ていますが、JQuery使用時固有のものです。

Airbnbのホストをしてみた感想

  • 2019年5月25日 5:58 PM
  • 雑記

最近、Airbnbのホストをやってみています。

開始して一ヶ月ほど経ったので、注意が必要な点や感想など、気がついた点について書いてみます。

これからAirbnbのホストをやってみようという方の参考になれば幸いです。

注意が必要な点

初期コストはかなりかかる

空き家があれば、すぐに誰でもAirbnbのホストができる・・・

軽く考えがちですが、初期投資としてのコストは思った以上に多くかかります。

まず、宿泊所としての条件を満たすために、防火、防犯など最低限の設備が整っていないといけません。

特に防火対策は、部屋ごとに火災検知器を設置したり、家屋の改修が必要となるので、工事費用として、家の規模にもよりますが、数十万必要になる場合があります。

場合によっては、50万から100万を超える場合もあるでしょう。

この初期投資で断念する方も多いのではないかと思います。

他にも、ただの空き家でなく宿泊所の条件を満たそうと思った場合にはいろいろなアメニティや電気製品、家具なども設置したり、壊れている場所を改修する必要があるので、諸々を入れると100万以上はかかる場合が多いのではないかと思います。

ちなみにうちの場合は250万ほど初期投資でかかりました・・・。

民泊が可能な場所かあらかじめ確認しておく

民泊を開始するには、必要な改修工事を行う必要がありますが、それらの準備を開始する前に、自治体に該当の家屋で民泊が可能かどうかを確認しておくとよいでしょう。

場所によっては、法律によって民泊ができなかったり、制限されている区域もあるので、まず最初に家屋のある自治体に確認しておくとよいでしょう。

民泊をしていてよかった点

国際交流ができる

民泊を利用する方には、旅行の宿泊先を求めている人が多いので、外国人観光客が多いです。

特にアジア系の中国人や台湾の観光客が多いので、グローバルな国際交流の体験をすることができます。

立地はそこまでよくないが、思ったより予約が多い

開始する前は、お客が来るかどうか不安も多かったのですが、いざ蓋を開けてみるとお客さんが非常に多かったです。

当方の民泊は、最寄り駅がローカル線の駅で、そこから徒歩で20分ほどかかる場所になります。

そのため、そんな場所にお客さんが来るかどうか不安もあったのですが、蓋を開けてみると結構なペースで予約が入っています。

駐車場があるので、車で運転する人は日本人であればそのままこれますし、外国人の観光客の場合、送迎すると言っておけば駅まで来てくれる人が多いです。

これは、ふたを開ける前は立地の面で不安があったのですが、開業してみると安心した点です。

Laravelでマスタデータ(key-valueデータ)をどう管理するか

Laravelで、フォームを作る時に、例えば選択ボックスがあって、そこから値を取り出したい場合があります。

例えば、性別[男、女]とか、都道府県[北海道〜沖縄]とか、カテゴリ[〜、〜]とか色々と考えられます。

それらのデータは、しょっちゅう変更があるもので、複雑なものであればデータベースにテーブルを作ってそこから引っ張ってくる方法もあるのですが、例えば男、女のような小さいデータセットであれば、わざわざそれをするほどでもないというか、いちいちテーブルを追加してデータをセットするというのが、Laravelの場合マイグレーションを通さないといけなかったりと色々と面倒です。

その場合に便利なやり方ですが、configに追加するのが楽です。

以下のページにやり方が書いてありました。

Laravelで都道府県のプルダウンメニューを作ってみる

一応手順についてメモしておきます

1.config以下に好きなファイル名で作成

都道府県であれば、per.phpのようなファイル名をconfig以下に作成して保存します。

return array(
  '1' => '北海道', 
  '2' => '青森県', 
省略
  '46' => '鹿児島県', 
  '47' => '沖縄県'
);

ちなみに、configのキャッシュが残っていると反映されないので、ファイルアップ後は以下のコマンドが実行必要です。

php artisan config:cache

上記の例では、pref.phpには一つしか配列が定義されていないですが、
複数定義したい場合は以下のように多次元配列でも設定が可能です。

return [
    "sex" => [
        "1" => "男",
        "2" => "女",
    ]
];

上記のように設定しても、後で問題なくアクセスできます。

コントローラーで取得→テンプレートに表示、または直接bladeに表示

作成したファイルは、config(ファイル名)で、いつでも参照して取得可能です。

コントローラーで取得してからテンプレートに表示する方法

public function sample() {
  $prefs = config('pref');
  return view('sample')->with(['prefs' => $prefs]);
}

直接テンプレートに記述する

以下のように直接取得することも可能です。

<select name="_pref">
  @foreach(config('pref') as $index => $name)
    <option value="{{ $index }}" @if(old('_pref') == $index) selected @endif>$name</option>
  @endforeach
</select>

多次元配列の場合は以下のようなかんじです。

例えば、config/common.phpに

return [
    "sex" => [
        "1" => "男",
        "2" => "女",
    ]
];

上記のような定義を例えばcommon.phpにした場合、以下のように記述できます。

<select name="sex">
    @foreach(config('common.sex') as $index => $value)
        <option value='{{ $index }}' @if(old('sex') == $index) selected @endif >{{ $value }}</option>
    @endforeach
</select>

 

Javascriptのクロージャについて解説

Javascriptのクロージャについての解説です。

Javascirptのクロージャとは何か

Javascriptのクロージャとは何か。

私の理解では

関数の中で関数を定義したもの

という理解です。
(あくまで私の理解です)

まず、基本的なところで

・ 関数を定義すると、関数内で定義した変数は関数外部から参照できない

という性質があります。
これはほとんどの人が知っていると思います。

例えば

function func() {
  var value = 1;
  console.log(value);
}
func(); // 1
console.log(value); // undefined

上記のようなプログラムの場合、関数を実行した場合、実行結果は
1になりますが、関数内の変数を出力した場合、
参照できていません。

function func() {
  var value = 1;

  function innerFunc() {
    value++;
  }
  innerFunc();
  console.log(value); // 2
}
func();

上記のようなプログラムの場合、関数の内部でinnerFuncという関数を定義して関数内で実行しています。
このinnerFUncをクロージャといいます。

innerFunc内では、外側の関数(エンクロージャ)で定義している
変数valueを呼び出していますが、その値を参照できているだけでなく、
更新することができます。

つまり、javascriptでは、関数の中で定義された関数の仕様は通常の
関数と、その外側の領域と違い、その関数内部で変数を参照したり、更新
したりできるのです。

このような仕組みを利用して、関数を定義する際に使用することがありますので、
性質として覚えておくと良いでしょう。

どのようなときに使うのか?

上記のクロージャの仕組みを使うと、関数内の変数の値を維持したまま、
その関数内の値を更新するプログラムをかけたりします。

例えば、関数内で定義した変数を、その関数内の関数を定義して返すような
関数にすることで、関数の外で変数を定義して更新したりしなくても、
関数を実行する度に関数を実行できたりするわけです。

書き方によってはクロージャを使わなくても実装できる場合もありますが、
コードがよりシンプルになったり、便利なケースがあるようです。
(未だにそういう場面に遭遇したことがないので分からない・・・)

JavascriptのSymbolについて解説

JavascrotのSymbol機能は、もともとJavascriptに存在していた機能ではありません。

ECMAScript6 (ES6, ES2015) で導入された機能です。

使い方

var a = Symbol();

このように使うことができます。

こうすることで、aには他の値を被らない値(具体的な数値ではない)が、自動生成されて代入されます。

例えば

var a = Symbol();
var b = Symbol();

上記のように定義しても、aとbの値は異なった値になります。

値の型はtypeofをすると「symbol」と表示される、独自の型となっています。

何のために存在しているのか

何故このような機能が追加されたのかというと、
自分でユニークな値を設定したつもりでも、他の値と予期しない形で衝突することが
あるため、そのような状況を防ぐためです。

PHPの無名関数(クロージャ)について

PHPの無名関数(クロージャ)についてのまとめです。

無名関数とは

無名関数とは、関数規則に沿って命名を必要とせず定義できる関数です。

function(引数) {
処理内容;
}

といった形で使用できます。

例えば

$func = function(引数) {
処理内容
}

といった形で定義した場合、この$funcは、ラムダ関数とも呼ばれます。

$a = $func(引数);

このような形式で、使用する場所で呼んで使用できます。

無名関数を使用するメリット

無名関数は概念的には関数と同じなので、無名関数にせず関数として定義して呼び出しても同じなのですが、
普通の関数を定義無名関数を使用することにより、その場限りで呼び出す処理の場合は、関数名を他の関数名と衝突しないで済む、プログラム全体が複雑にならないといったメリットがあります。

無名関数内の処理に外部の変数を使用したい場合

プログラムによっては、無名関数の中で使用するプログラムに、無名関数の外の変数を使用したい場合があります。

無名関数は関数なので、引数にしている変数以外の外部の変数は内部の処理には適用されません。

しかし、use文を使うことでその問題は解決できます。

$func = function(引数A) use(変数B) {
処理内容;
}

このように無名関数を使用することで、処理内容で引数Aだけでなく外部の変数Bも使用できます。

Laravelのbladeテンプレートで配列の要素の存在を判定する方法

Laravelのbladeテンプレートで、配列をforeachなどの構文でループで回すことはよくありますが、配列の要素が存在するかどうかをテンプレート上に記述したい場合があります。

その場合、以下のように記述できます。

@if(!$posts->isEmpty())

        

        @else

            

検索条件に合致する内容がありませんでした

@endif

上記の場合は、配列postsが空かどうかを判定し、空出ない場合はループ処理を記載しています。

配列にない場合はelse後の処理に記載しています。

ブラクラ中学生逮捕は何が問題なのかを分かりやすく解説

ブラクラサイトへのURLを掲示板サイトに書き込んだ罪で13歳中学生を含む3名が補導された事件を受けて、Twitterでも様々な議論がされました。

不正プログラム書き込み疑い補導 | NHKニュース

この事件について、自分も最初は何のことかよく分からなかったのですが、調べると警察の対応に問題があると感じたので、どういうことか分かりやすく解説してみます。

まず、問題となったのは、そもそも逮捕された人がそのサイトを作ったわけではないようなのですが、掲示板サイトにそのサイトURLを書き込んだということだけらしいのですが、そのサイトのソースコードが上記のようです。

このスクリプトがどのような動作をするかの解説

このスクリプトについてですが、サイトに埋め込んで実際に動作させてみると分かるのですが、ほとんど迷惑な動作をするものでありません。

単に指定されたメッセージが表示されて「OK」を押すことで次のメッセージが表示される。そこで「OK」を押すと、次のメッセージが表示されます。
これがずっと続くわけです。

一見すると確かに迷惑そうに見えますが、処理としては「メッセージが表示される」というだけのものです。

しかも、昔よくあったブラクラのように、無限に出てきてコンピュータがクラッシュするというものでもなく、「OK」を押さないと次のメッセージが表示されないので、コンピュータに対してクラッシュさせたり、フリーズさせたりといったこともありません。

つまり、「OK」を押さずにそのページを閉じると処理は終了するので、処理を終了するのも極めて簡単です。

つまり、実際に掲示板に書き込まれたURLを踏んでそのページに誘導されても、実害はほとんどないわけです。

昔あったようなブラクラは、そもそも今回の件はメッセージを表示するだけなのでブラクラにも該当しませんが、仮に今同様のブラクラのようなプログラムが実装されていても、最近のブラウザではそういった無限ループのプログラムには対応されていて実行されることはないようです。

つまり、逮捕した警察側に、そういった今回のプログラムがどういった動作をするかの知識が欠如しているために逮捕や家宅捜索にまでつながっているという見方ができます。

どう考えても、今回の件はウイルスに感染するでもなく、コンピュータがクラッシュするわけでもなく、これで逮捕されるのであれば、ちょっとしたジョークで逮捕されてしまうような事態になってしまうでしょう。

ブラクラ中学生逮捕事件に、javascriptの産みの親が降臨して言及

ブラクラサイトへのURLを掲示板サイトに書き込んだ罪で13歳中学生を含む3名が補導された事件を受けて、Twitterでも様々な議論がされました。

不正プログラム書き込み疑い補導 | NHKニュース

この件は、海外でも言及されて話題になっています。

そのやり取りが興味深かったので書いておきます。
(翻訳は微妙な部分を結構含んでるのですいません・・・)

まず、Googleで働いている日本人の方の投稿。

日本の警察は、たった数行のプログラムを実行するサイトへのリンクを投稿した人々を、「不正なプログラム」として逮捕しました。

信じられません。

これだと、多くのウェブサイトはFBIの統合任務部隊かなにかによって調査を受ける必要があるでしょう。
(冗談はおいておいて、日本の警察に、私はウェブブラウザ/セキュリティーについて解説を差し上げますので、ご連絡ください)

ここは、BrendanEich(Javascriptを作った人)の出番でしょう。

ここで本当にBrendanEichが降臨。

Netscape4ですら、Chromeの10年前にJSの無限ループの問題に対処していたよ。

Netscape2、3でも同じように対処するブランチコールバックがありましたが、しかし、それはいたって簡単です。

私達のJSであるNN4(SpiderMonkeyの最初にリリース!)ではそのスレッドで、knobchouck氏の功績により、1996年の秋にJSチームは2倍の規模に成長しました。

そうですねBrendan、私は知っています(泣)
広範な問題として、日本の警察は何に基づいて彼らを逮捕したのでしょうか…?
私は彼らの基準が何なのか理解できません。
昨年CoinhiveをWeb開発環境にインストールしたのも逮捕されました。
これは警告です。

ああ、CoinhiveからMoneoのマイニングですね、Moneroは法的処置としては有名ではありません。

日本の警察はMoneroが何かについての知識を持っていません。
彼らは逮捕した人々を「コンピュータへの訪問者を予期しないことに誘導していて、害を及ぼしている」としています。彼らのうちの何人かは政府とこの問題について法定で争っています。

わー。それが今年日本の日本ならば、専門家の助けが必要になるでしょうね。

彼らはコンピュータウイルスの法律に基づいて逮捕しているのかもしれませんが、無限ループとコインハイブの問題は別問題ですね。
それは注意が必要な傾向です。

Bootstrap4で、table-responsiveで横スクロールが出ないのに対処

Bootstrap4で、横長のtableにtable-responsiveクラスを適用して、はみ出させずに横スクロールさせようと思っていたのですが、何故かtable-responsiveを適用してもtableが横に飛び出したままで横スクロールが出現しませんでした。

書いていたコードは以下のような内容です。

-----

これで行けるはずなのですが・・・・

そしていろいろ試してみたのですが、原因がわかりました。

 ← 親要素のこれが原因
-----

原因としては、div class=”table-responsive”の親要素に、class=”row”が入っていました。

これを削除することで動作するようになりました。

修正後

 ← class="row"を削除
-----

TinyMCEを特定のtextareaに対して無効にする方法

TinyMCEを、特定のフォームに対して無効にする方法についての解説です。

TinyMCEは、簡単に入力欄にWYSIWYGを導入できるので便利ですが、
デフォルトの設定だと全てのtextareaにWYSIWYGが導入されてしまうため、WYSIWYGがついてほしくない
textareaはどうしたらいいのか分からず少し調べました。

TinyMCEのバージョンによって設定方法が異なると思うので、自分が使っているバージョン(4系)についてです。

TinyMCEを導入する際に、ヘッダの部分に以下のような記述があると思います。

tinymce.init({
            selector: "textarea",
            branding: false,

この箇所を、以下のように書き換えます

tinymce.init({
            selector: "textarea#mce",
            branding: false,

こうすることで、「textarea id=”mce”」となっているtextareaのみがTinyMCEの対象になります。

ちなみに、classでもいけます。

tinymce.init({
            selector: "textarea.mce",
            branding: false,

idだと、1つのテキストエリアしか対象にできないので、複数のテキストエリアを対象にしたい場合は、クラスで定義するのが有効です。

Laravelで「composer require doctrine/dbal」を実行でエラー「Installation failed, reverting ./composer.json to its original content.」の対処法

Laravelのマイグレーションで、カラム変更の機能を使う場合に、以下のエラーが発生しました

Changing columns for table “table” requires Doctrine DBAL; install “doctrine/dbal”.

テーブルのカラム変更をするにはdoctrine/dbalをインストールしろということ
公式サイトを確認したところ

composer require doctrine/dbal

をしないとエラーになるということで、実行。

すると、ここでもエラー

Installation failed, reverting ./composer.json to its original content.

インストールに失敗したので、composer.jsonを元に戻しましたということ。
もうちょっとエラーの内容を詳細に見てみます。

Your requirements could not be resolved to an installable set of packages.
あなたの要求は、インストール可能なパッケージのセットに対して解決できません

Problem 1
– The requested package laravel/framework (locked at v5.8.2, required as 5.7.*) is satisfiable by laravel/framework[v5.8.2] but these conflict with your requirements or minimum-stability.

要求されたパッケージはLaravel5.8.2系を必要としているので、あなたのLaravelのバージョンに対しては対応できません

ということ。

というわけで、Laravelnバージョンを5.8系にアップすることで解決できました。

まずは、composer.jsonを編集します。

“require”: {
“php”: “^7.1.3”,
“doctrine/dbal”: “^2.9”,
“fideloper/proxy”: “^4.0”,
//ここを変更
“laravel/framework”: “5.7.*”,→”laravel/framework”: “5.8.*”,
“laravel/tinker”: “^1.0”
},

ここが5.7系になっていたので、5.8系に変更します。

その後、composer update

これで、Laravelのバージョンが5.8系に変更され、その後

composer require doctrine/dbal

これで無事インストールできました。

Laravel5でフォームにWYSIWYGエディタを利用する

Laravel5のフォームを作っていて、textareaの入力欄にWYSIWYGエディタを導入してWordPressっぽくするというのを
試していたのですが、以下の記事を参考にして実装することができました。

Laravel5にWYSIWYGエディタを実装する方法 | Qiita

詳しくは上記の記事を参考にしていただければ簡単に実装できます。

手順としては、

1・TinyMCE をダウンロードして、サーバへアップロード

2・jbimages をダウンロードして、TinyMCEのpluginsフォルダへアップロード
(configファイルの画像の保存パスの変更と、該当フォルダに書き込み権限をつける必要あり)

3・実装するサイトのヘッダにjsファイルのincludeと、javascriptのコードを追記する

これだけで、至って簡単に実装することができました。

ただ、上記のQiitaの記事が若干古くなっていました。

この記事執筆時点(2019年3月)では、TinyMCEの最新バージョンが5系となっていたのですが、jbimagesは4系にしか対応していないので、TinyMCEの4系をサイトからダウンロードして使用する必要があります。(5系では動作しませんでしたが、将来的には対応しているかもしれません)

4系での設定方法は、以下のページに解説がありました。

JustBoil.me TinyMCE Images Plugin — A simple solution for uploading images in TinyMCE

Bootstrap4で、テーブルのtdの横幅を設定する方法

Bootstrap4で、テーブルのtdの横幅を設定する方法についての解説です。

Bootstrap3までは、テーブルのtdに、グリッドのクラスをつけることで横幅がグリッドシステムを使って設定できていたのですが、Bootstrap4からはできなくなったみたいです。

bootstrap3でできていた

これが、bootstrap4ではできなくなっているので、スタイルで横幅を指定する必要があるようです。

参考
How to set up fixed width for td? | strackoverflow

何故Bootstrap4でできなくなってしまったのか分かりませんが、直書きで指定するっていうのも嫌ですが、仕方ないですね。
もっとシンプルに書けるいい方法がないもんなのでしょうか。

Laravelの認証機能(auth)で新規ユーザ登録をできなくする

Laravelの認証機能で、ユーザ登録をできなくする方法についての解説です。

Laravelには、標準でAuth(認証機能)がついているので、標準で入っている認証機能を導入するのは非常に簡単です。

しかし、この標準のAuth機能は、Authをかけているページをログインページにリダイレクトし、そこでメールアドレスとパスワードを入力すればログインすることがでできるのですが、新規登録への導線がついているので、管理者だけログインできればよくて、それ以外のユーザの新規登録を受け付けていない場合があると思います。

そのような場合でも、routesの設定を変更することで簡単に対応することが可能です。

php artisan:make auth

をすることで、routesのweb.phpに以下の2行が追加されていると思います。

Auth::routes();

Route::get('/home', '[email protected]')->name('home');

これを、以下のように変更すればOKです。

//ここを変更
Auth::routes(['register' => false]);

Route::get('/home', '[email protected]')->name('home');

これをすることで、ログイン画面にRegisterと表示されている部分が消え、登録ができなくなる他、登録URLにアクセスしても404 not foundになります。

合わせてRegisterControllerを削除するように、Laravel公式サイトには書いてありますが、特にその対応をしなくても機能しなくなっていたので問題ありませんでしたが、一応削除しておくと良いと思います。

bootstrap4で、h1のフォントサイズを変更する方法

boostrrap4で、h1のフォントサイズを変更する方法についての解説です。

何故h1のフォントサイズ変更が必要か

boostrap4で、h1のフォントサイズがデフォルトでh1のままだと大きすぎると思っていました。

大きすぎる

これを調整する方法なのですが、クラス名のh1からh6を指定することで調整できるのです。

クラスでh6を指定してやるとだいぶ小さくできました。

大きすぎる

h1で指定されているけど大きさはh6の大きさ

クラスはh1からh6まで指定できるので、好みの大きさを指定すると良いです。

Google Analyticsで、ランディングページのページタイトルを見る方法

Google Analyticsで、ランディングページのページタイトルを見る方法についての解説です。

Google Analyticsで、ランディングページのページタイトルを見るには

Google Analyticsで、普通の全体のページビューでタイトルを見る方法は簡単で、

行動→サイトコンテンツ→すべてのページを見に行ったときに

プライマリディメンション:ページの右に「ページタイトル」というタブがあるので、そこをクリックするとページビューをページのタイトルごとに見ることができます。

これは非常に便利で、何故かと言うと、URLを見ても実際にどのページかというのはひと目でわからないので、タイトル名で表示してくれたほうが分かりやすいからです。

一方で、ランディングページ(ユーザがアクセスする際に入り口となったページ)をページタイトルで見ようとすると、、、
(ランディングページは、行動→サイトコンテンツ→ランディングページで見ることができます)

ページビューごとにあったタブメニューがないのです。

これは不便で、ランディングページでは、ページのタイトルでは見れないので、URLごとにサイトでいちいちチェックしないといけないと思っていたので不便でした。

しかし、解決策がありました。

セカンダリディメンションでタイトルを出せる

ランディングページの「セカンダリディメンション」を出して、検索項目を書くことができる欄に

「タイトル」

と入れて検索すると

「ページタイトル」

という項目があるので、そこをクリックすると、ページURLの隣に、ページURLに対応するページタイトルが表示されるようになります。

私の場合は、このことにずっと気が付きませんでしたので、分かってページ解析の際にとても助かりました。

確定申告時の控除について自分用まとめ

  • 2019年2月25日 7:14 PM
  • 雑記

毎年個人事業主として確定申告を行っているのですが、毎年どのような税金に対してどういった控除が適用されるのか忘れるのでメモとして書いておきます。

所得税

自分の場合は以下の計算です。

総売上から以下のものを引く

経費(変動)
所得税基礎控除(38万固定)
青色申告控除(65万)
生命保険控除(上限5万)
社会保険控除(国民年金)
社会保険控除(国民健康保険)

というわけで、まず青色申告をしているので、青色申告で65万、所得控除で38万、年金で大体20万、保険料も最低10万近くは払うので、何もしていなくても130万くらいは控除されるので、130万以上は年間収入がないと、所得税は発生しないことになります。

収入が少ない人には優しいですね。

また、使った経費も売上から引いたものが総所得になりますので、経費はまめにつけておく必要があります。

また、他から支払われた給料がある場合は、源泉徴収票を貰ってきちんと入力しておくと、源泉税を余計に払っている場合、あとで還付申請を行うことができます。

年間に通院してかかった医療費が10万円以上ある場合は、医療控除がこれに加えて発生します。

自治体に払っている住民税(市民・県民税)は控除対象にならないので、領収書の添付も不要です。

所得税の計算方法は累進課税制度なので、所得が多いほど税率も高くなる仕組みになっています。

市民県民税・住民税

市民税・住民税は、地区によって計算方法が異なるので、自分が所属している自治体の計算方法を調べる必要があります。

私の場合は以下の通りでした。

均等割 5000円

均等割は全員必ず払わないといけないので、無収入でも、その地区に住んでいる限り払わないといけません。

所得割

総売上から以下のものを引く

経費(変動)
青色申告控除(65万円)
基礎控除(33万円固定)
生命保険控除(上限3万5000円)
社会保険控除(国民年金)
社会保険控除(国民健康保険)

所得税と計算が似ていますが、基礎控除の金額、生命保険控除の金額が少し異なるのに注意が必要です。

所得税と同じく、青色申告と基礎控除で100万くらい、年金(20万)、保険料(10万)を加えるとやはり大体130万くらいはいくので、130万くらいは売上がない限りはこちらも所得割が発生しないので、均等割分だけの支払いが必要となります。

所得税・県民税は、所得から控除を引いたものに対して10%でした。

国民健康保険料

健康保険料も、住んでいる自治体によって計算方法が異なります。
私の住んでいる自治体では以下の通りでした。

賦課標準額の計算

総売上から以下のものを引く
経費(変動)
青色申告控除(65万円)
基礎控除(33万円固定)

医療給付費分

賦課標準額×8.58パーセント
均等割 27000円
平等割 20400円

後期高齢者支援金分保険料

賦課標準額×2.13パーセント
均等割 7,200円
平等割 4.800円

国民健康保険料は、所得税と市民・住民税と違い、生命保険、社会保険の控除がありません。
シンプルに売上-経費-青色申告控除-基礎控除となっています。

ただこれも、青色申告の場合、65万円の控除と基礎控除の33万円があるので、100万円以上は収入がない場合、確実に払わないといけない均等割、平等割のみが対象となります。

私の住んでいる自治体の場合は、均等割、平等割だけで 59,400円なので、最低でも年間6万円程度は国民健康保険に加入する限りは支払わないといけません。

計算方法と税率から比較して、ある程度の収入になるまでは健康保険料が一番多くなる仕組みになっています。

ただし、健康保険料には上限(77万円)があるので、収入が増えてくると、健康保険料より住民税・県民税や所得税のほうが多くなるような仕組みになっています。

mineo+iPhoneで「データ通信機能を起動できませんでした」の対処法

  • 2019年2月20日 8:16 PM
  • iPhone

iPhoneとmineoで、Wi-Fi-なしでインターネットに接続しようとすると「データ通信機能を起動できませんでした」と表示される問題の対応についての解説です。

問題について

iPhone7(SIMフリー)に、mineo(Dプラン)のSIMカードを入れて設定した後、Wi-Fiなしでインターネットに接続しようとすると「データ通信機能を起動できませんでした」と表示されてインターネットにつながらない。

iPhone+mineoで「データ通信機能を起動できませんでした」の対応

対処法

以下の2つの方法のいずれかで対応できると思います。

ネットワーク設定をリセットして再度接続

iPhoneの設定→一般→リセット→ネットワーク設定のリセット

で一旦ネットワーク設定をリセット

設定→一般→プロファイルで、入っているプロファイルを削除

自分が利用しているプランのmineoのプロファイルを再度インストール

ネットワーク設定(iOS端末)|各種設定|ご利用時の各種設定|初期設定と各種設定|mineoユーザーサポート

モバイル通信のデータ通信設定の見直し

設定→モバイル通信→通信のオプション→4Gをオンにする→データ通信のみに設定
(音声通話とデータになっている場合はデータ通信のみに変更)

私の場合は上記をすることで解決しました。

モバイル通信のデータ通信設定をデータ通信のみにすると電話ができなくなるのではないかと不安に思うかもしれませんが、関係ありません。
4Gでの「音声+データ通信」というのは、「VoLTE通信」なので、データ通信のみにしても、データ通信が4Gになるだけで、音声通話は3G帯域で行えるので問題ありません。あくまで4Gを音声通話で使うことで、音声がよりクリアになるというだけの話です。

ちなみに、私の場合は、最初はデータ通信のみにすることでネットにつながるようになるのですが、後で再度「音声+データ通信」にしてみたところ、問題なく設定することができました。

そのため、結局のところmineoDプランの場合音声+データ通信でもできたので、そこが原因だったのかどうかは確かではありません(調べると、iPhone7とmineoDプランはどちらもVoLTEに対応しているということでしたので動作はするはずです)が、私の場合そこをデータ通信のみに切り替えることでネットにつながるようになったので、最初のネットワーク設定のリセットとプロファイルの削除と再インストールを行っても駄目だった方は一度試してみる価値はあるかもしれません。

Macのfirst aidでフリーズする対処方法

Macのディスクユーティリティで、first aidという機能があります。

これは、Macのディスクのエラーチェックをしてエラーがある場合は修復をする機能です。

しかし、この機能を使用していると、Macが固まってしまう現象に遭遇します。

この対処法について書きたいと思います。

フリーズしたように見えるのは正常動作

実は、first aid実行時に、Macがフリーズした「ように見える」のは正常な動作です。

first aidのキャプチャ画像

実行時に上記のような説明文が表示されますが、説明文に

「First Aidにより、起動ボリュームが一時的にロックされます。実行中はアプリケーションが応答しなくなります。」

と書いてあります。

そのため、First Aidを実行中にはしばらく他のアプリケーションをクリックしても応答しなくなるため、フリーズしたように見えますが、そのまま放置しておくと、時間はかかりますが実行が終了すると、きちんと操作できるようになります。

数時間放っておいてもそのままフリーズしたような状態のままの場合、本当にMacに何かエラーが発生している可能性がありますが、大抵は数十分程度放置していると実行結果がきちんと返ってくるはずです。

Laravelのファイル、フォルダのパーミッション設定

Laravelのファイルとフォルダのパーミッション設定についてです。

下記の記事が参考になりました。

Laravelのパーミッションを適切に設定 | Qiita

ディレクトリに対して権限を変更
sudo find laravel-root-directory -type d -exec chmod 750 {} \;

ディレクトリは750なので、所有者は全部可能、グループは読み実行可能、その他はできない設定

ファイルに対して権限を変更
sudo find laravel-root-directory -type f -exec chmod 640 {} \;

ファイルは640なので、所有者は読み、上書き可能、グループは読みのみ可能、その他はできない設定

最後にストレージとキャッシュの権限を変更
sudo chmod -R 770 laravel-root-directory/storage/ laravel-root-directory/bootstrap/cache/

ストレージ、キャッシュフォルダは所有者、グループは全部可能。その他はできない設定。

webサーバーのApacheをインストールすると作成されるwww-dataをグループに追加する
sudo chown -R myusername:www-data laravel-root-directory

これは、上記はwww-dataグループになっていますが、自分の環境(CentOS、nginx)では、httpdのグループがwwwだったので、以下の設定で上手くいきました。

sudo chown -R myusername:www laravel-root-directory

グループ「www」がphpを自分の環境の場合実行しているので、phpファイルは読み出しのみの設定で問題ありませんでした。
phpファイルの実行権限は、所有者、グループとも読みのみで問題ないんですね。
実行権限が必要なのかなとイメージ的には思っていたのですが。

例えばPerlなんかはCGIで755にするのが一般的でしたが、755ってのは所有者は全部できて、グループユーザが読み、実行権限があるということですもんね・・・。

使っているPHPはPHP-fpmなので、モジュール版ではなくてCGI版なのですが、同じCGIでもPerlとPHP-FPMではパーミッションが違うと、これはややこしい話です・・・。

Laravelで、404エラー permission deneidに対処

LaravelをCentOS、nginx環境にインストールしたのですが、初期設定完了後にサイトへアクセスすると、404エラーが発生しました。

エラーログを確認すると

permisson denied

が発生

phpファイルへのアクセスが拒否されているようです。

該当のエラーが起きているファイルやディレクトリを

chmod 777 エラーが起きているファイル

にしています。

結果、そこから先のファイルがさらにエラー

プロジェクトフォルダとファイルを全て777にしたらいけるんでしょうけど、それはそれでセキュリティに不安が残ります。

そもそも、nginx環境のphpのサイトで、プロセスを実行しているユーザってどのユーザなのでしょうか。

ps コマンドでプロセスを監視してみます。

すると

httpd php-fpm

となっていたので、ユーザ「httpd」が実行しているようです。

ユーザ「http」が属しているグループはどこなのでしょうか。

groups httpd

httpd : www

ということで、httpdユーザは、グループ「www」に所属していました。

プロジェクトフォルダのオーナーをwwwに変更してみます。

chown -R ユーザ名:www プロジェクトフォルダ名

これで、該当のフォルダのオーナーのグループが「www」になりました。

これで、サイトにアクセスするとエラーが消えて無事にサイトが表示されました。

php -vで表示されるphpバージョンと、phpinfo()で表示されるバージョンが違う対処

サーバはkusanagiを利用しているのですが、

phpinfo();

で表示されるphpのバージョンは7系なのに、

サーバにログインして、コマンドラインで

php -v

で表示されるのは、5系というよくわからない事象に遭遇して困ってしまいました。

これで何故困るかというと、Composerをアップデートしたときに、以下のようなエラーが出たからです

このComposerのアップデートには、phpの7系が必要だよ

みたいなエラーです。

しかし、phpinfo()で確認すると使っているPHPのバージョンは7系で、サーバにログインしてコマンドラインで実行している
Composerは5系のPHPを見ているようだという謎です。

調べてみると、KusanagiのPHPは、Webサーバで実行しているのはPHP-fpmというCGI版のPHPで、コマンドラインで実行しているのは、apache経由でモジュール版のphp5系で実行しているとかとういったかんじの現象のようでした。

Kusanagiのサーバでは、rootでサーバにログインして

kuasanagi php7

を実行することでphp7の実行環境に切り替わるようですが、apacheのモジュール版はphp7になっていない??

というよく分からない感じです。

さらに調べると、Kusanagiではサーバにログインして

yum update

で、モジュール版もPHP7に切り替わるといったことが書いてあったので、試してみると、

yum updateでエラー

で、これはサーバのPythonのバージョンを3系に上げていたので、Python2系で書かれているyumがエラーを起こしている様子
これは、いろいろとぐぐることで対応方法が出てきたので、yumのソースで、Pythonのパスが書いてあるところを、
サーバに残っているPython2系へのパスに何箇所か変更します。

これで yum update が実行できました。

これで、満を持して

php -v

を実行。すると、またも

php 5.6〜〜〜

と。え、php7に変わってない・・・?

いったん諦めてから翌日サーバにログインして

php -v

をもう一度実行してみると

PHP 7.3.1 (cli)

と、無事アップデートしてました。

よく分からないですが、yum updateしてからサーバに反映されるのに
時間が必要だった?みたいで、apacheを再起動することで反映されたのか、
よく分かりませんが、何にせよ時間経過で反映されました。

よく分かりませんが、Composerで実行していたPHPは、モジュール版というよりも、CLI版
というPHPのようで、確かにphp -vをすると

PHP バージョン(cli)

と、cliを後についています。
ここのCLI版のバージョンが影響していたようですが、何にせよ今回のケースでは
yum update で無事解決したようです。

この後、

Composer update

を実行すると、無事エラーにならずアップデートを行うことができました。

ホーム

フィード

ページの上部に戻る