開発用 MacBook Air 環境構築メモ(2017年7月版)

 開発用 MacBook Air さん再インストールの覚書2017年7月版。
 次の私はもっとうまくやってくれるでしょう。

  • Mac について
  • Mac 基本設定
    • システム環境設定
      • caps キーと command キーへ割り当て。
      • スクロールの方向の「ナチュラル」のチェックボックスを外す。
      • キーボードの入力ソースに「日本語」を追加する。
      • キーボードの入力中に「自動変換」「ライブ変換」「推測候補」のチェックを外す。
      • セキュリティとプライバシーでパスワード要求を「すぐに」にする。
      • セキュリティとプライバシーでファイヤーウォールの設定を「入」にする。
  • アプリインストー
  • コンソール 設定
  • Git 設定
    • バージョン
    • git config 設定
  • Homebrew インストー
  • Web サーバー
    • Apache インストー
    • バージョン
    • 起動場所確認
    • 起動停止など
    • 開発用ディレクトリ設定
    • httpd.conf 設定
    • httpd-vhosts.conf 設定
    • バーチャルホスト 設定
    • 再起動
  • Perl 環境構築
  • PHP 環境構築
    • PHP 7.1 インストー
    • Web サーバー 連携設定
  • DB 環境構築
    • MySQL インストー
    • バージョン確認
    • 起動停止コマンド
    • セキュリティ設定
    • ログイン
    • my.cnf 設定
続きを読む

Perl ファイル入出力 チートシート

 自分用の覚え書き。
 ファイル入出力はロックの仕方、出力ディレクトリの作成、入力ファイルの存在確認と、忘れるものが山積み。

ファイル入出力

#!/usr/local/bin/perl
=pod
ファイル入出力の基本。
=cut
use strict;
use warnings;

# perl モジュール
# Fcntl は使えない場合もあるため、レンタルサーバーの場合はチェックすること。
use Fcntl qw/:flock/; # perl 5
use Encode qw/decode_utf8 encode_utf8/; # perl v5.7.3

# ファイル出力
my $output_path = "./test/";
my $output_file = $output_path ."test-file.txt";
# 出力ディレクトリがなければ作成
if (! -d $output_path) {
  mkdir($output_path);
}
# 追記
open my $fh, '>>', $output_file or die "Can't open file $output_file : $!";
flock($fh, LOCK_EX);
print $fh encode_utf8("output test!\n");
flock($fh, LOCK_NB);
close $fh or die "Can't close file $output_file: $!";

# ファイル入力
my $input_file = $output_file;
# 入力ファイルが存在しない場合はエラー
if (! -f $input_file){
  die "Not found $input_file";
}
print "--- input_all ---", "\n";
&input_all($input_file);
print "--- input_line ---", "\n";
&input_line($input_file);

# ファイルの中身を一度に取得
sub input_all {
  my ($input_file) = @_;

  # $/ は入力レコード区切り文字。デフォルトは改行。
  # undef を指定することにより、一度に読み込むことが可能になる。
  open my $fh, '<', $input_file or die "Can't open file $input_file : $!";
  my $input = do { local $/; <$fh> };
  close $fh or die "Can't close file $input_file: $!";

  chomp $input;
  print $input, "\n";
}

# ファイルの中身を一行ずつ取得
sub input_line {
  my ($input_file) = @_;

  open my $fh, '<', $input_file or die "Can't open file $input_file : $!";
  while (my $line = <$fh>) {
    chomp $line;
    print $line, "\n";
  }
  close $fh or die "Can't close file $input_file: $!";
}

Perl 基本チートシート

 自分用の覚え書き。

条件分岐

#!/usr/local/bin/perl
=pod
条件分岐の基本。
=cut
use strict;
use warnings;

my $number;
&test($number);

$number = 100;
&test($number);

$number = 99999;
&test($number);

sub test {
  my ($num) = @_;

  # defined は定義されているかの確認。
  # else if は言語によって書き方が異なるので覚えにくい。
  if (!defined $num) {
    print "Not defined num.", "\n";
  }
  elsif ($num == 100) {
    print "num=$num", "\n";
  }
  else {
    print "num=$num", "\n";
  }
}

配列

#!/usr/local/bin/perl
=pod
配列の基本。
=cut
use strict;
use warnings;

# 定義
my @array = ();
my $ref_array = [];

# 追加
# リファレンスでは push の使用不可。
$array[0] = "test1";
$array[1] = "test2";
push (@array, "test3");

$ref_array->[0] = "rtest1";
$ref_array->[1] = "rtest2";

# 参照
# まずこの改行の書き方をよく忘れる。
print $array[0], "\n";
print $ref_array->[0], "\n";

# 結合
print join('/', @array), "\n";
print join('&', @{$ref_array}), "\n";

# 要素数
my $length = @array;
my $length2 = scalar(@array);
my $ref_length = @{$ref_array};
my $ref_length2 = scalar(@{$ref_array});
print "length=$length", "\n";
print "length2=$length2", "\n";
print "ref_length=$ref_length", "\n";
print "ref_length2=$ref_length2", "\n";

# ループ
foreach my $value(@array) {
  print "foreach array: value=$value", "\n";
}
foreach my $value(@{$ref_array}) {
  print "foreach ref_array: value=$value", "\n";
}
# $#array 最後要素のインデックス
# 配列の(要素数-1)はこれでもいけるが、# がちょっと気持ち悪い。
# $i <= (要素数-1) の書き方もあまり好きではない。
for (my $i = 0; $i <= $#array; $i++) {
  print "for array: value[$i]=", $array[$i], "\n";
}
for (my $i = 0; $i <= $#{$ref_array}; $i++) {
  print "for ref_array: value[$i]=", $ref_array->[$i], "\n";
}
# scalar の方が好み。
for (my $i = 0; $i < scalar(@array); $i++) {
  print "for array scalar: value[$i]=", $array[$i], "\n";
}
for (my $i = 0; $i < scalar(@{$ref_array}); $i++) {
  print "for ref_array scalar: value[$i]=", $ref_array->[$i], "\n";
}

# スライス
my @array_select = @array[0, 2];
foreach my $value(@array_select) {
  print "array_select: value=$value", "\n";
}

連想配列

#!/usr/local/bin/perl
=pod
連想配列の基本。
=cut
use strict;
use warnings;

# 定義
# key => value を括弧内に記載することで初期値格納も可能。
my %hash = ();
my $ref_hash = {};

# 追加
$hash{num1} = 1;
$hash{num2} = 2;
$hash{flg} = 0;
$hash{test_key} = "100key";
$ref_hash->{rnum1} = 200;
$ref_hash->{rnum2} = 11;
$ref_hash->{rtest_key} = "200key";

# キー存在確認
if (exists $hash{test_key}) {
  print "hash{test_key}=$hash{test_key}", "\n";
}
if (exists $ref_hash->{rtest_key}) {
  print "ref_hash->{rtest_key}=$ref_hash->{rtest_key}", "\n";
}

# 全てのキーを取り出す
my @input_keys = keys %hash;
my @input_rkeys = keys %{$ref_hash};

# 全ての値を取り出す
my @input_values = values %hash;
my @input_rvalues = values %{$ref_hash};

# ループ
while (my ($key, $value) = each(%hash)){
  print "while each hash: ", "key=", $key, " value=", $value, "\n";
}
while (my ($key, $value) = each(%{$ref_hash})){
  print "while each ref_hash: ", "key=", $key, " value=", $value, "\n";
}
# value の昇順でソートしてループ
# 降順の場合は、 a と b が逆になる。
# 数値の場合は、 cmp の代わりに <=> を使用する。
foreach my $key (sort {$hash{$a} cmp $hash{$b}} keys %hash){
  print "sort hash: ", "key=", $key, " value=", $hash{$key}, "\n";
}
foreach my $key (sort {${$ref_hash}{$a} cmp ${$ref_hash}{$b}} keys %{$ref_hash} ){
  print "sort ref_hash: ", "key=", $key, " value=", $ref_hash->{$key}, "\n";
}

# スライス
my @hash_select = @hash{'num1', 'flg'};
foreach my $value(@hash_select) {
  print "hash_select: value=$value", "\n";
}

応用

#!/usr/local/bin/perl
=pod
連想配列と配列の応用。
key ごとにソートした value のリストを取得して一気に結合。
=cut
use strict;
use warnings;

my %fruits = (
  key3 => "苺",
  key1 => "林檎",
  key5 => "バナナ",
  key4 => "サクランボ",
  key2 => "杏子",
);

my @fruitslist = map { $fruits{$_} } (sort keys %fruits);
print join('...', @fruitslist), "\n";