エンジニアと英語の表現力

エンジニアにとって、英語力は必須。
これは間違いないだろう。

英語でも、リスニング、リーディング、ライティングがある。特に重要なのはreadingかと思っていたが、どうやら考えが甘すぎた。。
– listening
– reading
– writing

本当に重要なのは、英語の表現力。
高いレベルの仕事をするには、説得力のある説明や、よりスムーズに仕事をできるような英語力が必須。
とはいえ、これは直ぐには身につかないし、何をやるのがベストか?

案1:英語でブログを書く
案2:英語のサービスを作る
案3:海外に移住する

どうするか??
英語が重要なのは絶対に間違いない。
案1を1年~2年くらい目標にやってみるか。。

システム開発における基本設計とは何か?

基本設計とは何か?よく基本設計、詳細設計と言葉が独り歩きしていますが、具体的に基本設計とは何を指しているのか?

だいたいこんなところか?
– システムの要求定義/課題整理
– 全体概要
– 機能一覧
– 業務フロー
– 画面設計
– 画面フロー
– データベース設計

特に要求定義と課題整理が肝か。

フォーマットは?? もう少しフォーマルにするなら
1. 業務フロー(Excel)
2. システム構成図(Excel)
3. ER図(OBER)
4. テーブル定義書(OBER)
5. 設計書記述様式(Excel)
6. 基本設計書(Excel)
7. 画面遷移図
8. 画面レイアウト

少しソフトウェア開発っぽくなってきましたね。
順番としては、基本設計書、業務フロー、システム構成図から順番に作っていくイメージでしょうか。。

S3へのアップロード

if(file_exists($_FILES['upfile']['tmp_name'])){
	$ext = substr($_FILES['upfile']['name'], strrpos($_FILES['upfile']['name'],'.') + 1);
	echo $ext."<br>";
	if(strtolower($ext) !== 'png' && strtolower($ext) !== 'jpg' && strtolower($ext) !== 'jpeg' && strtolower($ext) !== 'gif'){
		echo '画像以外のファイルが指定されています。画像ファイル(png/jpg/jpeg/gif)を指定して下さい';
		exit();
	}

	$tmpname = str_replace('/tmp/', '', $_FILES['upfile']['tmp_name']);
	echo $tmpname;
	// $new_filename = 'profiles/'.$id.'-'.time().'-'.$tmpname.'.'.$ext;



$s3clinet = S3Client::factory([
		'credentials' => [
		'key' => env('AWS_ACCESS_KEY_ID'),
		'secret' => env('AWS_SECRET_ACCESS_KEY'),
		],
		'region' => 'northeast-1',
		'version' => 'latest',
]);

$bucket = getenv('zeus-image')?: die('no zeus-image config var in found in env!');

$image = fopen($_FILES['upfile']['tmp_name'],'rb');

// 画像アップロード
$result = $s3client->putObject([
		'ACL' => 'public-read',
		'Bucket' => $bucket,
		'Key' => $new_filename,
		'Body' => $image,
		'ContentType' => mime_content_type($_FILES['upfile']['tmp_name']),
]);

}

これでいいのか?いや、良くない、アップロードされてない。。
require ‘vendor/autoload.php’;を足せばよい?? なんかちゃうなー。。

php fopenの’rb’とは?

tmpファイルのアップロードで、以下の様に書いていた。

$image = fopen($_FILES['upfile']['tmp_name'],'rb');

ところで、この’rb’って何? 一瞬、rubyの拡張子に見えたんだが、絶対違うよな。。
‘b’は強制的にバイナリモードにします。
fopen(‘file’,’r’): 読み込みのみで開く。ファイルポインタはファイルの先頭におく。
fopen(‘file’,’r+’): 読み書き可能な状態で開く。ファイルポインタはファイルの先頭におく。
‘b’は強制的にバイナリモードにする。

よって fopen(‘file’,’r’); は、読み込みのみで開く。強制的にバイナリモードにする。

バイナリモードで開くってことね♪

phpでアップロードした画像のファイル名を取得しよう

まずformでアップロード機能をサクッと作ります。

<?php
if(file_exists($_FILES&#91;'upfile'&#93;&#91;'tmp_name'&#93;)){
	$ext = substr($_FILES&#91;'upfile'&#93;&#91;'name'&#93;, strrpos($_FILES&#91;'upfile'&#93;&#91;'name'&#93;,'.') + 1);
	echo $ext."<br>";
	if(strtolower($ext) !== 'png' && strtolower($ext) !== 'jpg' && strtolower($ext) !== 'jpeg' && strtolower($ext) !== 'gif'){
		echo '画像以外のファイルが指定されています。画像ファイル(png/jpg/jpeg/gif)を指定して下さい';
		exit();
	}

	$tmpname = str_replace('/tmp/', '', $_FILES['upfile']['tmp_name']);
	echo $tmpname;
	// $new_filename = 'profiles/'.$id.'-'.time().'-'.$tmpname.'.'.$ext;
}

?>
<div id="content">
<h2>画像管理</h2>
<hr>
<form action="#" method="POST" enctype="multipart/form-data">
<div id="drag-drop-area">
 <div class="drag-drop-inside">
  <p class="drag-drop-info">ここにファイルをアップロード</p>
  <p>または</p>
  <!-- <input type="file" value="ファイルを選択" name="image"> -->
  <p class="drag-drop-buttons"><input id="fileInput" type="file" value="ファイルを選択" name="upfile"></p>
      <input type="submit" value="送信">
   </div>
  </div>
</form>

アップロード前

アップロード後

うん、上手くいってるようです。
さて、s3をやりましょう。ここまで長かった。

jpgとjpegの違いは何か?

.jpgと.jpegは同じなのか? 二つとも同じJPEGに見えるが、正確には違うようだ。

MS-DOSではファイルの拡張子が3文字までという制約があった
そういえば、.jpegより.jpgの方が良く見ますね。
しかし、現在のosでは4文字も利用できるため、jpegも対応している。

jpgの略は、Joint Photographic Experts Groupで、4文字の拡張子もOKになったので、jpegが追加された?たったそれだけの理由?

Acrobatにてファイルから直接PDF変換を行える形式: .jpg
PDF以外に保存が行える形式: .jpg/.jpeg

.jpgの方がより多くの機能に対応しているようです。

うーん、ITの世界も極めて天才的な設計がある一方で、こういうイマイチよくわからない経緯もあるんですな。

phpのstrtolowerとは?

strtolower — 文字列を小文字にする

読んで字の如く、という感じですね。
サンプル

echo strtolower("Jpeg");

jpeg

想定通りです。裏側のアルゴリズムを想像すると、ワクワクしますね。
jsやjava、pythonなどでもあるようです。

phpのstrrposで日本語を扱う時

strrpos: 文字列の中に、ある部分の文字列が最後に現れる場所を探す
int strrpos(string $haystack, string $needle)

echo strrpos("あいうえお", "う");

6?
あれ?どういうことだ?

echo strrpos("phpengineer", "h");

1

あれ、半角英数字だと上手くいく。日本語だと駄目なのか?

echo strrpos("日本語で試します", "で");

9

あ、わかった、これはバイト数でカウントしてるんだな。
日本語は一文字3バイトだから、012, 345, 678, 9
で、9ということだろう。

試しに4バイトの漢字を入れてみましょう。
「𡈽」を使ってみます。
参考: UTF-8で4バイトになる文字 https://www.softel.co.jp/blogs/tech/archives/596

echo strrpos("𡈽は4バイトです", "は");

4
あ、やっぱりそうですね。
なるほどー

.gitignoreとは

.gitignoreとは、リポジトリで、意図的に追跡対象から外したいファイルを設定するためのファイル。

例として、.gitignoreの中身を見てみましょう。
.envはもちろんの事、/node_modules、homestead.json|yml、/vendorなども含まれていますね。

/node_modules
/public/hot
/public/storage
/storage/*.key
/vendor
/.idea
/.vscode
/.vagrant
Homestead.json
Homestead.yaml
npm-debug.log
yarn-error.log
.env
.phpunit.result.cache

git rm –cachedで追跡対象から外して、そのファイルを.gitignoreに加えればよいでしょう。

composerでaws/aws-sdk-phpインストール時にエラー

aws-sdk-phpを入れようとします。

composer.json

"require": {
    "aws/aws-sdk-php": "3.*",
}
[vagrant@localhost app]$ php composer.phar install aws/aws-sdk-php


  [Seld\JsonLint\ParsingException]
  "./composer.json" does not contain valid JSON
  Parse error on line 1:
    "aws/aws-sd
  --------^
  Expected one of: 'EOF', '}', ',', ']'

あれ? JSONが違う

{
	"require": {
    "aws/aws-sdk-php": "3.*"
	}
}

再度インストールします。上手くいきそうです。

[vagrant@localhost app]$ php composer.phar install
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 7 installs, 0 updates, 0 removals
– Installing mtdowling/jmespath.php (2.4.0): Loading from cache
– Installing ralouphie/getallheaders (2.0.5): Downloading (100%)
– Installing psr/http-message (1.0.1): Loading from cache
– Installing guzzlehttp/psr7 (1.5.2): Downloading (100%)
– Installing guzzlehttp/promises (v1.3.1): Loading from cache
– Installing guzzlehttp/guzzle (6.3.3): Loading from cache
– Installing aws/aws-sdk-php (3.82.6): Downloading (100%)
guzzlehttp/guzzle suggests installing psr/log (Required for using the Log middleware)
aws/aws-sdk-php suggests installing doctrine/cache (To use the DoctrineCacheAdapter)
aws/aws-sdk-php suggests installing aws/aws-php-sns-message-validator (To validate incoming SNS notifications)
Writing lock file
Generating autoload files