exit('IN');

本を読んで得た学びとか

【CodeWars】1/17 ~ 1/23に解いた問題たち

記事の内容

1/17 ~ 1/23にCodeWarsで解いた問題です。
JavaScriptを使用しています。
朝解いているので、すぐ解ける簡単な問題ばかりです。

Super Duper Easy

問題の概要 引数が数字なら計算して返却。文字列ならErrorを出す。

www.codewars.com

コード

function problem(x){
  return typeof x === "number" ? x * 50 + 6 : "Error";
}

The falling speed of petals

問題の概要 花弁の落ちる速度が与えられるので、何秒で地面に到達するかを返却。

www.codewars.com

コード

function sakuraFall(v) {
  return v > 0 ? 400 / v : 0;
}

String matchup

問題の概要 配列の要素がもう片方の配列に何回登場するかをカウントする。

www.codewars.com

コード

function solve(a,b){
  let count = 0;
  let result = [];
  
  for (let i= 0; i < b.length; i++){
    count = 0;
    for (let j= 0; j < a.length; j++) {
      if (b[i] === a[j]) {
        count++;
      }
    }
    result.push(count);
  }
  
  return result;
}

ゴリ押しでいってしまった…。
他の人の解答を見る感じmapとfilterを使うのが良いみたい。

Calculate BMI

問題の概要 BMIを計算して値に応じた出力をする。

www.codewars.com

コード

function bmi(weight, height) {
  const bmi = weight / height ** 2;
  let judge = '';
  
  if (bmi > 30) {
    judge = "Obese";
  } else if (bmi > 25.0){
    judge = "Overweight";
  } else if (bmi > 18.5) {
    judge = "Normal";
  } else {
    judge = "Underweight";
  }
  
  return judge;
  
}

単純な条件が多くなるとswitchの方がいいかもしれない。
ただ、MDNをみた感じswitch文に不等号を使ってる例がないので推奨された書き方ではないのかも?

他に、return の位置をどうするか。
各分岐でreturnしてもいいが、1箇所でreturnする方が個人的にわかりやすい気がする。

Are arrow functions odd?

問題の概要 array.filterを用いて奇数の配列を作成する。

www.codewars.com

コード

function odds( values ){
  return values.filter( value => value % 2 !== 0 );
}

まだfilterのような=>の使い方がわかってない。。

Take the Derivative

問題の概要

簡単な数値の計算をして、文字列として返却する。 www.codewars.com

コード

function derive(coefficient,exponent) {
  return `${coefficient*exponent}x^${exponent-1}`
}

個人的には変数の展開には、+を使って連結するよりも↑で記述する方が楽かも。

Polish alphabet

問題の概要 文字列に含まれるポーランド語アルファベットを置換する。

www.codewars.com

コード

const polish = {
  ą: 'a',
  ć: 'c',
  ę: 'e',
  ł: 'l',
  ń: 'n',
  ó: 'o',
  ś: 's',
  ź: 'z',
  ż: 'z'
};

function correctPolishLetters (str) {
  let result = '';
  let regex = '';
  Object.keys(polish).forEach(function (key) {
    regex = new RegExp(`${key}`, 'g');
    str = str.replace(regex, polish[key]);
  });
  
  return str;
}

replaceAll()を使ったら「is not a function」とでた。
MDNにはメソッドとして記載されているけど、実行環境によっては使えない感じだろうか。
結局replaceに()グローバルフラグをつけるとreplaceAll()と同様のことができた。

【CodeWars】1/10 ~ 1/16に解いた問題たち

記事の内容

1/10 ~ 1/16にCodeWarsで解いた問題です。
JavaScriptを使用しています。
朝解いているので、すぐ解ける簡単な問題ばかりです。

1/10 N-th Power

問題の概要 配列のN番目の要素のN乗を返却する。

www.codewars.com

コード

function index(array, n){
  return array[n] ? Math.pow(array[n], n) : -1
}

1/11 Four/Seven

問題の概要 4なら7, 7なら4を返却する。
ただし、ifやswitchを使用せずに。

www.codewars.com

コード

function fourSeven(n){
  const obj = {
    4: 7,
    7: 4
  }
  return obj[n] || 0;
}

1/12 Find Multiples of a Number

問題の概要

limit以下の数字の配列を作る。 www.codewars.com

コード

function findMultiples(integer, limit) {
  let multiples_array = [integer];
  let sum = integer;
  
  while (sum + integer <= limit) {
    sum += integer;
    multiples_array.push(sum);
  }
  
  return multiples_array;
  
}

forで書いてもよかったかも。

1/13 Parse nice int from char problem

問題の概要 文字列の先頭にある数字をNumber型で返却する。

www.codewars.com

コード

function getAge(inputString){
  let ans = inputString.match(/^[\d]/);
  return Number(ans[0]);
}

2回目

function getAge(inputString){
  return parseInt(inputString);
}

1/14 Sum of Minimums!

問題の概要 各配列の最小の要素の合計を返却する。

www.codewars.com

コード

function sumOfMinimums(arrs) {
  let sum = 0;
  arrs.forEach ((arr) => {
    sum += Math.min(...arr);
  })
  
  return sum;
}

1/15 Lario and Muigi Pipe Problem

問題の概要 nからmまでの数字が入った配列の抜け落ちている要素を補完して返却する。

www.codewars.com

コード

function pipeFix(numbers){
  return range(numbers[0], numbers[numbers.length -1], 1);
}

const range = (start, stop, step) => Array.from({ length: (stop - start) / step + 1}, (_, i) => start + (i * step));

1/16 Write out expression!

問題の概要

www.codewars.com

計算式を文字の計算にする。

コード

function expressionOut(expr) {
  
  const formula = expr.split(' ');
  let result = OPERATORS[formula[1]] ? `${NUMBERS[formula[0]]} ${OPERATORS[formula[1]]}${NUMBERS[formula[2]]}` : "That's not an operator!";
  return result;
}
  
const NUMBERS = {
  '1': 'One',
  '2': 'Two',
  '3': 'Three',
  '4': 'Four',
  '5': 'Five',
  '6': 'Six',
  '7': 'Seven',
  '8': 'Eight',
  '9': 'Nine',
  '10': 'Ten'
};

【CodeWars】1/3 ~ 1/9に解いた問題たち

記事の内容

1/3 ~ 1/9にCodeWarsで解いた問題です。
JavaScriptを使用しています。
朝解いているので、すぐ解ける簡単な問題ばかりです。

1/3 USD => CNY

問題の概要 ドルから人民元に変換する。 www.codewars.com

コード

function usdcny(usd) {
  let cny = usd * 6.75
  cny = cny.toFixed(2)
  return `${cny} Chinese Yuan`
}

JavaScript第一段。

1/4 Sum The Strings

問題の概要 2つのString型の数字の和をString型で返却する。

www.codewars.com

コード

function sumStr(a,b) {
  return String(Number(a)+Number(b));
}

1/5 Check the exam

問題の概要 2つの配列の要素の一致・不一致でスコアを算出する。

www.codewars.com

コード

function checkExam(answer, submit) {
  let score = 0;
  for (let i = 0; i < submit.length; i++) {
    if (submit[i]) {
      score += submit[i] === answer[i] ? 4 : -1;
    }
  }
  return score < 0 ? 0: score;
}

Best Practiceに選ばれた解答はarray.reduce()を使ってた。

1/6 Unique numbers

問題の概要 配列の重複を削除した新しい配列を返却する。 www.codewars.com

コード

function uniqueNumbers(numbersArray) {
  let uniqueArray = numbersArray.filter(function (x, i, self) {
                      return self.indexOf(x) === i;
  });
  
  return uniqueArray;
}

JavaScriptにはPHPのarray_unique()みたいなものは無かった…。

1/7 NBA full 48 minutes average

問題の概要 外挿を求めて返却する。

www.codewars.com

コード

function pointsPer48(ppg, mpg) {
  if (ppg === 0 || mpg === 0) { return 0;} 
  let ans = ppg / mpg * 48;
  return Number(ans.toFixed(1));
}

恥ずかしながら、外挿って言葉を初めて知った。 既知のデータから範囲外の予測をすることらしい。

1/8 Multiplication table for number

問題の概要 1 ~ 10 * 与えられた数を改行して出力する。

www.codewars.com

コード

function multiTable(number) {
  let result = '';
  for (let count = 1; count <= 10; count++) {
    if (count === 10) {
      result +=  `${count} * ${number} = ${count * number}`; 
    } else {
      result +=  `${count} * ${number} = ${count * number}\n`;
    }
  }
  return result;
}

ifじゃなくて、参考演算子で書けばよかったかも。

1/9 CSV representation of array

問題の概要 配列を結合する。

www.codewars.com

コード

1回目

function toCsvText(array) {
  let csv = '';
  
  for (const innerArray of array) {
    csv += innerArray.join();
    if (innerArray !== array.slice(-1)[0]) {
      csv += '\n';
    } 
  }
  
  return csv;
}

2回目

function toCsvText(array) {
  return array.join('\n');
}

難しく考えすぎてた。 ただ、JavaScriptでの配列の結合の仕方や配列の最後の要素の取得など学べたのでよかった。

毎日簡単な問題を解くのもいいけど、2~3日かけて難しめの問題を解くのもアリな気がする。

Apacheのアクセスログを調べる

Apahceのログを見ようと思ったけど、場所がわからなかったので。

ApacheMacに初めからインストールされている物を使用しています。

起動とかその辺はこちらを参照

qiita.com

httpd.confからログの出力場所を調べる

まず、httpd.confからログファイルを出力している場所を調べます。

vi /private/etc/apache2/httpd.conf

ノーマルモードでは「/access_log」のように「スラッシュ+検索文字列」で検索ができます。(nで移動可)

350行目付近にアクセスログの出力場所の記述がありました。

f:id:masablog0405:20210102173756p:plain
httpd.conf

どうやら、/private/var/log/apache2/access_log にあるようです。

tail -f /private/var/log/apache2/access_log 

f:id:masablog0405:20210102174212p:plain
access_log

ありました!

2020年(9月~)でやってみたこと

2020年(9月~)でやってみたこと

2020年(といっても後半)に取り組んだことの振り返りです。

やったこと

CakePHPの学習

CakePHPの基本的な使い方については身についたものの、仕組みを理解して適切に使えているかというと微妙なところです。
オレオレフレームワークを作るなどして深い部分を理解できるようにしたいです。

CodeWarsを毎日解く

9月の途中から毎日CodeWarsで問題を解いていました。 (簡単な問題ばかりですが…) 朝起きたらコードを書く習慣が身につきました。
業務でPHPを使っているので、PHPで問題を解いてます。
100日行ったら別の言語で解く予定です。

Sign in | Codewars

基本情報の勉強

情報系の出ではないため、情報処理の基礎を身につけたいと思い勉強をしました。
結局コロナで延期やら頻尿やらで受けないことにしましたが、学習の価値は十分にあったと思います。
基本的な知識や概念を知っているかどうかで、情報の吸収量が違うような気がします。

AWS認定資格の勉強

一番簡単なクラウドラクティショナーを取りました。
業務で役立っているとはいえませんが、短期間でとれるため、気分転換の勉強としては良かったです。
ただ、プログラマとして取るならもう一つ上のレベルでも良かったかもしれません…。

Arduino

Arduinoを買ってLチカまでやったけれど放置気味です。
楽器を作れればいいなとは思うものの、そこまでのモチベーションはありませんでした。
また気が向いた時にでも挑戦します。

まとめ

本当にちょっとでもいいので業務時間外で毎日コードを書けたのは良かったと思います。
簡単な問題ばかり解いていますが、知らなかった組み込み関数を使ったり、他のすごい方々の解答を見て学んだりできるので、やってて飽きません。

また、基本情報など基礎知識の習得に時間を割いたことも個人的には良かったです。
業務ですぐ使える知識ではないので、勉強することの不安はありました。
しかし、物事を深く学ぼうとすると基礎的な知識が必要になってくるのでやってて良かったと感じます。


本当は業務などを含めて全体的に良かったことやわるかったことを振り返るつもりが全く異なる記事になってしまいました…。
ただ、あまり業務のことを書くのも少し怖いので、これぐらいでいいのかもしれませんが。

【CodeWars】11/8~11/14に解いた問題たち

記事の概要

僕が1週間に解いたCodeWarsのまとめです。
PHP 7.0を使用しています。

Form The Largest

レベル

7kyu

概要

与えられた数字の最も大きい組み合わせを返す。

書いたコード

ソート系の戻り値がbooleanではなく、ソート後の配列だったら一行で書けるのに。

function maxNumber($n) {
  $num_array = [];
  
  $num_array = str_split($n);
  rsort($num_array);
  return (int)implode('', $num_array);
}

Tidy Number (Special Numbers Series #9)

レベル

7kyu

概要

与えられた数字の並びが小→大になっているか調べる。

書いたコード

function tidyNumber($n) {
  $num_array = [];
  $sorted_num = 0;
  
  $num_array = str_split($n);
  sort($num_array);
  $sorted_num = implode('', $num_array);
  return $n == $sorted_num ? true : false;
}

Remove anchor from URL

レベル

7kyu

概要

与えられた文字列(URL)の#以下を除去して返す。

書いたコード

explodeやstrtokで解いている人もいた。

function replaceAll($string) {
  return preg_replace('/#\w*/', '', $string);
}

Row Weights

レベル

7kyu

概要

与えられた配列の数値を交互に別々の変数に足し合わせる。

書いたコード

function rowWeights($arr) {
  $row1 = 0;
  $row2 = 0;
  
  foreach ($arr as $key => $value) {
    $key % 2 == 0 ? $row1+= $value : $row2+= $value;
  }
  return [$row1, $row2];
}

Get the mean of an array

レベル

8kyu

概要

配列の要素の平均値を少数切り捨てで返却する。

書いたコード

function get_average($a) {
  return floor(array_sum($a)/count($a));
}

Maximum Product

レベル

7kyu

概要

配列の隣接する要素同士の掛け算の結果が最も大きいものを返却する。

書いたコード

function adjacentElementsProduct($array) {
  for  ($i = 0; $i < count($array) -1; $i++) {
    if ($max < $array[$i] * $array[$i + 1]) {
      $max = $array[$i] * $array[$i + 1];
    }
  }
  return $max;
}

Is n divisible by x and y?

レベル

8kyu

概要

nをxとyで割り切れるかどうかを調べる。

書いたコード

// return $n % $x == 0 && $n % $y == 0 ? true : false;

if ($n % $x == 0 && $n % $y == 0) {return true;}
  return false;

【CodeWars】11/1~11/7に解いた問題たち

記事の概要

僕が1週間に解いたCodeWarsのまとめです。
PHP 7.0を使用しています。

Reverse words(11/1)

レベル

7kyu

概要

与えられた文字列の単語を逆にして返す。

書いたコード

1回目

function reverseWords($str) {
  $words = [];
  $words = explode(' ', $str);
  foreach($words as &$word) {
    $word = strrev($word);
  }
  return implode(' ', $words);
}

2回目

function reverseWords($str) {
  implode(' ', array_map('strrev', explode(' ', $str)));
}

Substituting Variables Into Strings: Padded Numbers(11/2)

レベル

7kyu

概要

与えられた数字が5桁になるように0で埋める。

書いたコード

sprintfを使って終わり。
最初はprintfを使おうとしていたけど、printfは返り値がintになるから使えなかった。

function solution($value){
  return sprintf("Value is %05d",$value);
};

Cryptanalysis Word Patterns(11/3)

レベル

7kyu

概要

与えられた文字列に番号を割り当てる。同じ文字には同じ番号。

書いたコード

やはりforeachのネストは読み辛い。
foreachの箇所をstr_replaceで書ければだいぶ短くできそう。

function wordPattern($word) {
  $chars = [];
  $alphabet_orders = [];
  $pattern = [];
  
  $chars = str_split(strtolower($word));
  $alphabet_orders = array_flip(array_values(array_unique($chars)));
  foreach($chars as $char) {
    foreach($alphabet_orders as $alphabet => $order) {
      if ($char == $alphabet) {
        $pattern[] = $order;        
      }
    }
  } 
  return implode('.', $pattern); 
}

Fix string case(11/4)

レベル

7kyu

概要

文字列中に含まれる大文字と小文字の数に応じて文字列を変換する。

書いたコード

相変わらずforeachのなかにifを入れてしまっている。
大文字小文字の判定を正規表現でやればもっと簡潔にできた。

function solve($s) {
  $char_array = [];
  $count_upper = 0;
  $count_lower = 0;
  
  $char_array = str_split($s);
  foreach($char_array as $char) {
    if (ctype_upper($char)) {
      $count_upper++;
    } else {
      $count_lower++;    
    }
  }
  return $count_upper > $count_lower ? strtoupper($s) : strtolower($s);
}

String repeat(11/5)

レベル

8kyu

概要

与えられた文字列を指定の数だけ繰り返す。

書いたコード

function repeatStr($n, $str)
{
  return str_repeat($str, $n);
}

Calculate average(11/6)

レベル

8kyu

概要

int型配列の要素の平均を出す。

書いたコード

一発で配列の平均を計算する関数はない?

function find_average($array) {
  return array_sum($array) / count($array);
}

Nth power rules them all!(11/7)

レベル

7kyu

概要

int型の配列の各要素を利用して計算する。

書いたコード

function modified_sum(array $array, int $n): int {
  $answer = 0;
  foreach($array as $num) {
    $answer += $num ** $n;
  }
  return $answer - array_sum($array);
}