exit('IN');

本を読んで得た学びとか

【CodeWars】1/31 ~ 2/6に解いた問題たち

記事の内容

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

Alphabet war

www.codewars.com

コード

function alphabetWar(fight)
{
  const left = {
    w: 4,
    p: 3,
    b: 2,
    s: 1
  }
  
  const right = {
    m: 4,
    q: 3,
    d: 2,
    z: 1
  }
  
  const alphabetArray = fight.split('');
  let leftValue = 0;
  let rightValue = 0;
  
  alphabetArray.forEach(alphabet => {
    if (alphabet in left) {
      leftValue += left[alphabet];
    } else if (alphabet in right) {
      rightValue += right[alphabet];
    }  
  })
  
  if (leftValue === rightValue) {
    return "Let's fight again!"; 
  } else if (leftValue > rightValue) {
    return "Left side wins!";
  } else {
    return "Right side wins!";
  }
}

おそらくかなりひどい。
他の人の解答を見ると、map()やreduce()などを使うと短く書けるみたい。

Convert a Boolean to a String

問題の概要 booleanを文字列にして返却する。

www.codewars.com

コード

function booleanToString(b){
  return b.toString();
}

booleanにtoStringが使えるとは思わなかった。
Object.prototype.toString()なので、何にでも使えるのか。

My head is at the wrong end!

問題の概要 配列の先頭と末尾を入れ替えた配列を返却する。

www.codewars.com

コード

function fixTheMeerkat(arr) {
  return arr.reverse();
}

Do I get a bonus?

問題の概要 bool値によって給料の額を10倍にして返却。

www.codewars.com

コード

const bonusTime = (salary, bonus) => bonus === true ? `£${salary * 10}` : `£${salary}`;

FIXME: Get Full Name

問題の概要 クラスのメソッドを修正して適切な出力がされるようにする。

www.codewars.com

コード(1回目)

class Dinglemouse{
  
  
  constructor( firstName, lastName){
    this.first = firstName;
    this.last = lastName;
  }
  
  getFullName(){
    if (!this.first && !this.last) {
      return '';
    } else if (!this.first && this.last) {
      return this.last;
    } else if (this.first && !this.last) {
      return this.first;
    } else {
      return `${this.first} ${this.last}`;
    }
    
  }
  
}

引数から渡ってきた2つの変数名に悩んだ末に、firstとlastというよくわからない名前をつけてしまった。
条件分岐は書きたくなかったが、上手いやり方を思いつかなかったので仕方なく。

コード(2回目)

class Dinglemouse{

  constructor( firstName, lastName ){
    this._firstName = firstName;
    this._lastName = lastName;
  }
  
  getFullName(){
    return `${this._firstName} ${this._lastName}`.trim();
  }
  
}

他の人の解答を見てやり直し。
trimは思いつかなかった。

Number to digit tiers

問題の概要 n桁の数値を1~n桁目までそれぞれ区切って配列に格納する。

www.codewars.com

コード

const createArrayOfTiers = num => {
  const numString = num.toString();
  let result = [];
  
  for (let i = 1; i <= numString.length; i++) {
    result.push(numString.substr(0, i));
  }
  
  return result;
}

https://www.codewars.com/kata/586bca7fa44cfc833e00005c

【CodeWars】1/24 ~ 1/30に解いた問題たち

記事の内容

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

get character from ASCII Value

問題の概要 受け取った数字をASCIIでの値に変換する。

www.codewars.com

コード

function getChar(c) {
  return String.fromCharCode(c)
}

Can we divide it?

問題の概要 変数numberが変数a, bでそれぞれ割り切れるかどうか。

www.codewars.com

コード

function isDivideBy(number, a, b) {
  return number % a === 0 && number  % b === 0 ? true : false;
}

今回はa, b2つと決まっていたが、何個あるかわからない場合はevery()とかを使う感じかな。

Limit string length - 1

問題の概要 文字列の指定された位置から「…」に置き換える。

www.codewars.com

コード

function solution(string,limit){
  
  if (string.length <= limit) {
    return string;
  }
  
  let result = string.substr(0, limit);
  return result + "...";
}

Love vs friendship

問題の概要

コード

1回目

function wordsToMarks(string){
  const alphabets = {
    a: 1,
    b: 2,
    c: 3,
    d: 4,
    e: 5,
    f: 6,
    g: 7,
    h: 8,
    i: 9,
    j: 10,
    k: 11,
    l: 12,
    m: 13,
    n: 14,
    o: 15,
    p: 16,
    q: 17,
    r: 18,
    s: 19,
    t: 20,
    u: 21,
    v: 22,
    w: 23,
    x: 24,
    y: 25,
    z: 26
  }
  
  const charArray = string.split('');
  let stringValue = 0;
  
  charArray.forEach(char => {
    stringValue += alphabets[char];
  })
  
  return stringValue;
}

特に何も考えずに実装。 ひどいことになった。 わかりやすいかもしれないけど…。

2回目

function wordsToMarks(string) {
  let stringValue = 0;
  for (let i = 0; i < string.length; i++)
    stringValue += string.charCodeAt(i) - 96;
  return stringValue;
}

他の人がString.prototype.charCodeAt()を使っていたので、真似てみた。
周りが文字コードを知っているならこれを使ってもいいかもしれない。

Incorrect division method

問題の概要 割り算の答えが返ってくるようにコードを修正する。(コメントアウトの部分)

www.codewars.com

コード

// const solve = (x, y) => x // y;

const solve = function(x, y) {
  return x / y;
}

問題が簡単だったので、下に関数式を書いてみた。

[Code Golf] Return Odd No Matter What

問題の概要 12文字以下で処理を書く。(関数の名前は除く)

www.codewars.com

コード

const alwaysOdd=n=>n%2?n:n-1

Averages of numbers

問題の概要

配列の隣り合う要素の平均を配列で返す。

www.codewars.com

コード

const averages = numbers => {
  
  let result = [];
  
  if (numbers === null) {
    return result;
  }
  
  for (let i = 0; i < numbers.length; i++) {
    if (i !== numbers.length -1) {
      result.push((numbers[i] + numbers[i + 1]) / 2);
    }
  }
  
  return result;
}

空の配列のlengthプロパティにアクセスしようとすると、エラーが返ってくるのはあまり納得が行かない。
0が返ってきたらいいのに。

【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チカまでやったけれど放置気味です。
楽器を作れればいいなとは思うものの、そこまでのモチベーションはありませんでした。
また気が向いた時にでも挑戦します。

まとめ

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

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


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