ドドスコblog

MacOSをクリーンインストールできない時の対処法

なぜやったか

今までの開発環境の残骸や必要のないファイルの山が邪魔になったからです。 削除のする作業に手間をかけたくないのと、重要なものはクラウドサービスに保存してあるので、クリーンインストールをしました。

クリーンインストールする前の環境

  • MacOS Maojava
  • PCの詳細情報↓初めてのApple製品で奮発して15インチを買いましたが、他のエンジニアさんのPC見てるとほとんどが13インチで浮いてる感が否めない... support.apple.com

つまずきポイント

  • OSインストールがいつまでたっても終わらない
    • インストール完了まで6分と表示されてるのに、半日経ってインストールできませんでしたとエラー表示される。

解決方法

  • Apple公式サイトの手順書通りに作業を進めた

Mac を売却、譲渡、下取りに出す前にやっておくべきこと - Apple サポート
Mac のディスクを消去する方法 - Apple サポート
macOS 復元から macOS を再インストールする方法 - Apple サポート

  • 最後のリンクの「macOS 復元から起動する」項目が問題で起動時にcommand (⌘) + Rを入力することが推奨されていますが、Option + ⌘ + Rを入力しましょう。(公式はOption-⌘ + Rと表記してますが、Option + ⌘ + Rです。マイナスってどういう意味なの ...)
  • command (⌘) + RではmacOS Sierraをインストールしますが、自分の環境ではOption + ⌘ + RでMacOS Maojavaをインストールした方がよかったみたいです。

AWS lambdaでAPI作成について簡単な復習

今回はPython3.6を使用

簡単な設計

  • API Gatewayにlambda関数を紐付け
  • DBはDynamoDB(それ以外使うのか?)

IAMについて

権限、アクセス制限ができる。
今回は二つの権限を使用した。

  • AWSLambdaBasicExecutionRole
    • ログを作成する Amazon CloudWatch Logs アクションのアクセス権限のみを付与します。
  • AmazonDynamoDBFullAccess
    • DynamoDBへのアクセス権限

タグ

AWS リソースに付けるラベルで、1 つのキーとオプションの 1 つの値で構成する。
AWS リソースを目的、所有者、環境などさまざまな方法で分類することができます。
ググって出てきた画面遷移まで丁寧に解説してるサイトにものってない画面。(リファレンスにものってなかったような)
基本無視でいい。この画面が出てきたら未入力で次の画面に進もう。

lambdaについて

lambda_handlerってなに?

C言語でいうmain関数みたいなもの lambda関数が呼び出されたら最初に動作するメソッド
これを軸にして処理を書いていく

event引数ってなに?

lambda_handlerに第一引数でevent引数があります。
APIが受けるパラメータはこのevent引数に入ります。 テストイベントはeventの中身を設定できます。 初期は下みたいになってる。

{
  "key1": "value1",
  "key2": "value2",
  "key3": "value3"
}

API Gateway

複雑なAPIカプセル化 クライアントはAPI Gatewayを介してAPIを呼び込む 欠点はAPI Gatwayがボトルネックになる可能性がある。 API Gatewayには使用するHTTPメソッドを設定し、それらに紐づけるlambda関数を設定する。
また、URLパラメータの設定もする。

不具合の解決方法

エラーメッセージを見るのは当たり前として、それでもわからない場合はAPI Gatewayとlambdaのどちらに問題があるか確かめる。
lambda関数編集画面の右上にテストボタンがあるがその左に APIが受けるJSONを設定するボタンがある。
そこでAPIに渡そうした値を再現し、テストをする。 エラーが出ればlambda関数自体に問題があり、なければAPI Gatewayに問題があると思います。
lambdaの問題はtypoAPI Gatewayの問題は、値を正しく受け取れていないか出力するように設定していない。
HTTPメソッドにlambda関数が正しく紐づいていないなどが考えられる。

Laravel5.5 apiを作ったけどjsonデータが文字化けする

LaravelでAPIを作ってみたらjsonの中身が文字化けしていた。

{"id":1,"name":"\u682a\u5f0f\u4f1a\u793e \u6749\u5c71"}

原因

unicode で日本語がエスケープされる。

解決方法

unicodeエスケープされないようにする

問題の文字化けjsonレスポンス

return response()->json(
    ['name' => 'Tanaka']
);

jsonレスポンスを文字化けしないように変更

return response()->json(
    ['name' => 'Tanaka'],
    200,
    [],
    JSON_UNESCAPED_UNICODE
);

MySQL 8.0でmigrationエラーが発生した時の解決方法

ローカル環境ではMySQL5.6を使っていたのですが、 サーバーにデプロイ時に、MySQL8.0が出たと聞いて面白がって導入して痛い目をみました。 いつものようにphp artisan migrateでテーブルを作成しようとしたら

lluminate\Database\QueryException  : SQLSTATE[HY000] [2054] The server requested authentication method unknown to the client

と表示され、未知の認証方法を要求されたときて困惑しました。

これはLaravel側の問題でした。 MySQL8.0からはユーザー作成時のデフォルトの認証設定で、 caching_sha2_passwordという方式を取り始めましたが、 Laravel5.5ではそれには対応していないので、未知の認証方法であるとエラーが出たみたいです。

解決方法としましては、 * MySQLのバージョンを下げる。 * MySQL8.0のユーザーの認証方法をLarvelでも対応できるものに変更する。

今回は後者で解決しました。 まず、MySQLの/etc/my.cnfにデフォルトの認証方法を変更する処理を加えます。

default_authentication_plugin=mysql_native_password

そして、mysqlを再起動すれば変更は反映されます。

service mysqld restart

もしユーザーを作成済みでしたら、削除してもう一度作り直せば、解決できます。

結論

今回は認証だけだったので問題解決に時間はかかりませんでしたが、 ローカルと違う環境にむやみに挑戦するのはやめましょう。

Laravel Bladeで改行する方法

inputタグやtextareaに文字列を出力すると改行はされますが、 それ以外のアンカーなどに出力すると改行されずに表示されます。 解決策として

<a>{!! nl2br(e($form->event_info)) !!}</a>

と書きます。 このアンカーに使われている三つの機能を解説します。

データのエスケープ
{!! !!}

Bladeの基本として{{}}内に変数を置いて変数の中身を表示すると学びましたが、{!! !!}も同じ機能を持っています。 違いはデータをエスケープするかどうかです。

aaaaと表示される。改行され下に空白ができる。
<a>{!! 'aaaa</br>' !!}</a>
aaaa</br>と表示される。
<a>{{ 'aaaa</br>' }}</a>
改行文字の前にbrタグを挿入する
nl2br()

アンカーは改行を認識せずに表示するため、改行コードがある文字列を一列に表示してしまいますが、 nl2br()を使うと改行コードの前にbrタグが挿入され改行されます。

htmlタグ無効化?
e()

これはLaravelのヘルパー関数で、文字列のhtmlタグを無効化する?機能があります。 変なhtmlを生成されてデザイン崩れを防ぐ為に存在すると思います。

The e function runs PHP's htmlspecialchars function with the double_encode option set to false:

ヘルパ関数 5.1 Laravel

qiita.com

datetime-localに初期値を設定しても値が反映されない時の解決法。

今回の内容はHTMLに関するものです。

datetime-localというHTMLのタグがありますが、サーバーサイドでvalueに初期値を設定しても反映されなかった話です。 ブラウザでソースを見ても

<input type="datetime-local" value="2016-12-23 02:00:00">

というように値は設定されていますが、ブラウザに値は反映されませんでした。 ブラウザで値を入力したものと、サーバー側で初期値を設定したものをくらべても

{{--サーバー側で値を設定、表示されない--}}
<input type="datetime-local" value="2016-12-23 02:00:00">
{{--ブラウザで値を設定、表示される--}}
<input type="datetime-local" value="2016-12-23 02:00:00">

ソースは同じなのに値は反映されません。 調べたところ日付と時間の間に"T"をおく必要があるみたいでした。

{{--valueにはLaravelのBladeの機能を使っています。--}}
<input type="datetime-local" value="{{str_replace(" ", "T", $event->open_day)}}">

datetime-localはブラウザごとに動きがかなり違うみたいでjqueryのtimepickerなどのスクリプトで入力欄を作った方がいいみたいです。

developer.mozilla.org