信頼はずっと、挑戦はもっと。

お問い合わせ
TEL:03-3496-3888

BLOG コアテックの社員ブログ (毎週月曜~金曜更新中)

LIST OF ARTICLES

記事一覧

  • 画像:ブログサムネイル

    テクログ

    競技プログラミングを体験しました

    今日はAtCoderという競技プログラミングができるサイトの話です先輩上司がAtCoderをやっていることから以前からAtCoder存在は知っていたのですが、どこか難しいイメージがしていて、今までノータッチでした。ある日、たまたまYoutubeで特集されている動画を見つけました。https://www.youtube.com/watch?v=WGNQrH0AV2k内容としては、『プログラミング初心者の人がやってみた』という内容です。AtCoderにはBeginner Contest なるものがあり、プログラム上級者でなくても受験しやすいコンテストがあることを、そこで知りました。入社から1年たったし、力試しでやってみるか!とBeginner Contestを受けてみました(言語はPHPを選択しました)結果は以下の通りです。A問題B問題は簡単に解けましたがC問題で苦戦しました。C問題も4割ほど正解できたのですが、そこでタイムアップでした(画像ではC問題を提出したかったのに間違ってA問題として提出してしまってます。終わってから気付きました、、w )Youtubeの人はC問題まで解けたいたようなので、「ぐぬぬ、初心者に負けてしまった」と悔しい内容となりました。また受けてみようと思います

  • テクログ

    PHP技術者認定試験奮闘記

    お久しぶりです。JSです。コアテックにはテックリードという役割がありますが、この役割に就くには資格が必須となります。将来的にはテックリードを目指すために、PHP技術者認定試験に挑戦することにしました。ちなみに資格試験を受けるのは8年前位の基本情報技術者試験以来です。PHP5技術者認定上級・準上級試験の基本事項について説明します。問題数は60問で試験時間は2時間で、選択式です。5割以上から7割未満の正解で準上級合格、7割以上の正解で上級合格になります。準上級がITスキル標準(ITSS)のレベル2(基本情報技術者試験と同レベル)、上級がレベル3(応用情報技術者試験と同レベル)で、上級の合格率は10%以下です。合格率は10%と難しそうですが、自分のスペックです。・文系で未経験でこの業界に入る・運転免許の筆記試験に1回落ち、2回目で合格・基本情報技術者試験は就職してから2年目に受け1回落ち、2回目で合格・漢検2級は高校時代に一発合格諦めの悪さと運だけで10年この業界で働いているので、スペックは低いエンジニアです。PHPの経験は7~8年ですが、このスペックで上級試験に合格できるのでしょうか。年末にこの2冊の本を買い、勉強を開始しました。・徹底攻略 PHP5 技術者認定 [上級] 試験問題集 [PJ0-200]対応 (日本語)https://www.amazon.co.jp/exec/obidos/ASIN/4844334670/atopinn-22/・プログラミングPHP 第3版https://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0PHP-%E7%AC%AC3%E7%89%88-Kevin-Tatroe/dp/48731166862月下旬に試験を受けますが、それまでに勉強したことです。・過去問を解き、解答の解説をテキストにまとめる・一通り過去問を解き終わったら、毎日解解答の解説をテキストにまとめたものを読み、その後過去問を解く2月下旬に試験を受けるまで、過去問を解いた回数は2回です。一発で上級に合格は難しいと考えていたので、2月下旬の試験は準上級合格が目標でした。試験を終えたときの感触は5割から6割程度は正解してそうな感じでした。結果は60問中35問の正解し、約6割程度の正解率で準上級に合格できました。感想としては知らない言葉が結構出てくる、正しいものを選ぶより間違っているものを選ぶ問題が多いという印象でした。上級に合格にするには後7問正解数を増やさないといけないので、どうするか考えました。・過去問と似たような問題があったが、曖昧に覚えていたため3~4問間違えているので、過去問の類似問題は間違えないようにする・プログラミングPHPに載っているソースコードが出ているので、プログラミングPHPを読む必要がある・試験で出てきた知らない言葉は調べる3月下旬に試験を受けますが、1回目の試験後から3月下旬の試験までに勉強したことです。・試験で出てきた知らない言葉は調べ、テキストにまとめる・毎日解解答の解説をテキストにまとめたものを読み、その後プログラミングPHPを読む・直前に過去問を解くプログラミングPHPは2回読み、過去問を解いた回数は1回です。3月下旬に試験を受けましたが、結果は60問中42問正解し、ちょうど7割正解で上級に合格できました。PHP技術者認定試験には「この問題を後で見直す」機能があり、今回は恐らく不正解の問題にはこれにチェックを入れ、何問程度間違っているか確認してました。解答提出直前には恐らく不正解の数が20~21問でしたので、その通りだと惜しくも不合格、運がよければ合格という状況でした。不合格だと思っていたので、合格したときは驚きました。最後は運の良さで上級に合格できましたが、在宅勤務で通勤がなくなり、それにより勉強時間が確保できたことが一番大きかったと思います。在宅勤務を導入した会社の方々にはこの場をお借りして感謝申し上げます。ちなみに2021年の秋からPHP8技術者認定上級試験が始まるそうです。皆さんも、是非資格試験に挑戦してみてください。

  • テクログ

    画像認識システムを作ってみた

    お久しぶりです。JGです。夏頃に突然、画像認識システムを作りたいと思い、実際に作ってみました。画像認識システムは難しい、機械学習なのでPythonで作成するイメージがありました。しかし、調べたところGoogleのCloud Vision Apiを使えば、様々な言語(PHP,Python,Ruby)等で、簡単に実現できることがわかりました。こちらのApiの料金ですが、登録してから3カ月は無料で使えます。下記のURLの手順を参考に、環境を構築し、サンプルコードを参考にすれば、okです。https://cloud.google.com/vision/docs/quickstart-client-libraries?hl=ja#client-libraries-install-php但し、APIの戻り値が英語なので、日本語にするためにはクライアント ライブラリをインストールする際に、下記を追加する必要があります。composer require google/cloud-vision composer require google/cloud-translate //これを追加 下記ソースの$file_nameに認識したい画像のファイル名を指定すれば動くはずです。ちなみに調査から実装完了まで3時間程度でき、画像認識システムが簡単にでき驚きました。興味がある方は、是非試してみてください。<?php   require_once(dirname(__FILE__).'/vendor/autoload.php');   use Google\Cloud\Vision\V1\ImageAnnotatorClient;   use Google\Cloud\Translate\TranslateClient;          $image_annotator = new ImageAnnotatorClient();   $file_name = ''; //認識したい画像を指定   $image = file_get_contents($file_name);   $response = $image_annotator->labelDetection($image);   $labels = $response->getLabelAnnotations();   if ($labels) {     echo("認識成功:" . PHP_EOL);     $translate = new TranslateClient();     foreach ($labels as $label) {           $text =$label->getDescription();               //英語を日本語に変換            $result = $translate->translate($text, [                'target' => 'ja'            ]);            echo ($result['text'] . PHP_EOL);       }   } else {        echo('認識失敗' . PHP_EOL);   }

  • 画像:ブログサムネイル

    テクログ

    オブジェクト指向は因数分解だ!!

    どうも!先月に入社二年目を迎え、とうとうパイセンと化したわいです。自粛期間中ということで、かなり暇なので長編に挑みます。暇な人はぜひ最後まで読んでみてください。「うわあ、暇だあ…」ってより実感すると思います。今回、またもやプログラミングを他の概念にこじつけるシリーズです。この一年間、新人プログラマーとしていろいろ苦戦しました。その中のひとつが、『オブジェクト指向とは』の理解です。オブジェクト指向に関する記事はたくさんあります。それこそ、「オブジェクト指向はもう古い」とされていたりします。ただ温故知新という言葉があるように、オブジェクト指向について学ぶことは決して意味のないことではないと思います。むしろ、プログラミングをする上での基本的な考え方が詰まっているように思えます。詳しく、そして正確に知りたい場合は、他の記事をおすすめします。https://www.google.com/search?q=%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91%E3%81%A8%E3%81%AF今回はオブジェクト指向のイメージを掴むために少しでもお役に立てればと思い、あえて変な角度からアプローチしてみます。その名も、「オブジェクト指向は因数分解だ!!」です。因数分解とは、「足し算・引き算で表されている数式をかけ算の形に変形する」ことです。例えば、cx^2+acx+bcx+abc = (x+a)(x+b)c となります。(中学数学でやりましたね?)ここで、下図のようなWebページについて考えてみましょう。(私自身、最初に車の例えを見たときピンとこなかったので…)犬の情報は、売られている犬がリストで表示されているとします。猫も同様です。店舗の情報は、住所、電話番号などが表示されているとしましょう。(ちなみに、私はペットショップに行くと悲しい気持ちになるので、基本的に中には入りません)かなり簡略化しているのでわかりやすいと思いますが、ペットショップのWebサイト = 犬の情報 × 猫の情報 × 店舗の情報という式が成り立つはずです。複雑なWebサイトでもこのように各パーツの組み合わせで成り立っています。これを先ほどの因数分解と合わせて考えてみます。ペットショップのWebサイト= cx^2+acx+bcx+abc (一見複雑だが…)=  (x+a)  ×  (x+b)  ×  c = 犬の情報 × 猫の情報 × 店舗の情報このようにWebサイトを因数分解することができました。「だから、なんだ?」という話なのですが、ここでオブジェクト指向について考えたいと思います。なぜわざわざ小難しいオブジェクト指向で書くかというと、それは変更に対して柔軟に対応するためです。どういうことかというと、「爬虫類も売ることにしたから、サイトに爬虫類の情報も表示したい」や、「犬を売るのをやめて、鳥を売ることにしたから変えてくれ」などという要望に、瞬時にそしてバグを出すことなく対応することがオブジェクト指向を用いると容易になるということです。適切にオブジェクト指向を使えば、似たような機能の追加が容易になり(再利用性)、たった一か所の変更のために他のパーツにバグが出ていないかページ全体をテストし直す必要がありません(疎結合性)。しかし、このオブジェクト指向の難しいところはどのように機能(クラス)を分割するかというところにあると思います。大雑把に分割しても効力は発揮しないし、かといって細かすぎても保守が大変になります。ここで、今回私が提案するのは「因数分解のように考えてみたら意外と上手くいくんじゃね?w」ってやつです。まず、「犬の情報」を「鳥の情報」に変えるということを因数分解で見てみましょう。これは、仮に a → d とすることで実現するとします。そうすると、ペットショップのWebサイト=  (x+d)  ×  (x+b)  ×  c = 鳥の情報 × 猫の情報 × 店舗の情報となり、(x+b)やc の値に何ら影響を与えることなく変更することが出来ました。ここで勘のいい人は、「おめえさん、x を変えたら『猫の情報 (x+b)』に影響を与えるだら?」と思うかもしれません。そうです。そして、この x がオブジェクト指向の要です。「犬の情報」も「猫の情報」も、『売られている動物がリストで表示される』という共通点があります。この共通点を規格として、インターフェースや抽象クラスにまとめ上げることで再利用性が高まり、さらに各々のクラスの役割がはっきりします。そして、ここで注意しないといけないのがなんでもかんでもこの x にまとめてしまうことです。各ペットの情報欄に年齢や性別のほかに、仮に「1日に〇回散歩に行かないといけない」という項目があったとします。これを x にまとめてしまうと『犬の情報 (x+a)』ではいいんですが、関係のない『猫の情報 (x+b)』に影響を与えてしまいます。だから、この場合は各ペットの情報欄の項目までは共通化せず、『売られている動物がリストで表示される』という根本機能だけを共通化することがいいように思えます。(犬と猫だけだと差異がわかりにくいですが、変わった動物を追加するとなると変な項目も増えそうです)かといって、ペットショップのWebサイトということなので、『売られている動物がリストで表示される』という機能の共通化を疑う必要はないでしょう。それだと、オブジェクト指向の意味がなくなります。次に、f(a) = x+a とすると、ペットショップのWebサイト=  f(a)  ×  f(b)  ×  c = 犬の情報 × 猫の情報 × 店舗の情報となり、 犬(a)  や  猫(b)  を f に与えるだけで欲しい情報が得られるということです。この f こそが、『売られている動物をリストで表示する』という機能であり、インターフェースです。この『動物』という抽象に対してプログラミングしていくことが、ポリモーフィズムです。最後に、カプセル化について考えます。f はインターフェースや抽象クラスで、 f(a) は『売られている犬をリストで表示する』という具象クラスです。実際にペットショップのWebサイトを構築する際は、この f(a) を使います。そして、この f(a) を利用するとき、『売られている犬をリストで表示する』という具象クラスであるということだけを知っていればよくて、f(a) = x+a だという具体的な中身を知っている必要は全くありません。実は、『売られている犬を「人気順に」リストで表示する』ということをやっていて、中身が f(a) = 3x+1+a と多少複雑になっているかもしれません。ただ、このように具体的な中身を知らずとも、 f(a) を使えばWebサイトは構築できます。クラスを外部から利用するとき、 f(a) のような簡素な見た目で提供し、影響範囲をクラス内にとどめておくことをカプセル化といいます。いかがでしたか?「オブジェクト指向は因数分解だ!!」理論は。あなたのソース、c(x^2+ax+bx+ab) や x^2(1+a/x)(1+b/x)c になっていないでしょうか?「うわあ、暇だあ…」最後まで読んでくださり、私としてはうれしい限りですが、相当お暇なんですね。なにか自粛期間にできる趣味をお探しになることをお勧めします。以上、わいでした。健闘を祈る!!

  • テクログ

    LINE Notify APIを試してみました

    初めまして。1月からお世話になっておりますJGです。最近LINE Notify APIを使い、毎朝自分のLINEに通知させました。それについて触れたいと思います。下記URLからLineIDでログインし、必要事項を入力します。その後、アクセストークン発行をクリックし、発行されたトークンをコピーして保存してください。https://notify-bot.line.me/ja/天気予報を取得する処理は下記のlivedoorを使用しました。http://weather.livedoor.com/weather_hacks/webservicePHPで処理を書き、作成したものをHerokuに上げ、毎朝通知するようにHerokuのスケジューラを設定しました。下記ソースのTOKENに、LINEのアクセストークンを指定すれば動きます。自分の住んでいる東京と出身地の神奈川の天気を通知するために、$city_listを下記のように指定しています。興味がある方は、是非試してみてください。<?php define('TOKEN', ''); define('MESSAGE_NOTIFY_API_URL', 'https://notify-api.line.me/api/notify'); define('WEATHER_API_URL', 'http://weather.livedoor.com/forecast/webservice/json/v1?city='); $city_list = [   130010,   140010,   140020 ]; foreach ($city_list as $city) {   //天気予報を取得   $weather_data = get_weather_data($city);   if (empty($weather_data)) {     $msg = "天気予報取得失敗です。";   } else {     //通知メッセージを作成     $msg = create_message($weather_data);   }   //通知   send_msg($msg); }   function get_weather_data($city) {   $ch = curl_init();   curl_setopt($ch, CURLOPT_URL, WEATHER_API_URL.$city);   curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');   curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);   $response = curl_exec($ch);   $http_code = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);   if ($http_code != 200) {     return false;   }   if (curl_error($ch)) {     return false;   }   $weather_data = json_decode($response, true);   curl_close($ch);   return $weather_data; } function create_message($arr) {   $msg = '';   $title = $arr['title'] ?? '';   $msg .= $title."\n\n";   for ($i = 0; $i < 2; $i++) {     $date = $arr['forecasts'][$i]['date'] ?? '';     $date_label = $arr['forecasts'][$i]['dateLabel'] ?? '';     $weather = $arr['forecasts'][$i]['image']['title'] ?? '';     $min = $arr['forecasts'][$i]['temperature']['min']['celsius'] ?? '';     $max = $arr['forecasts'][$i]['temperature']['max']['celsius'] ?? '';     $msg .= $date_label.'('.$date.')'."\n";     $msg .= '天気: '.$weather."\n";     $msg .= '最高気温: '.$max."\n";     $msg .= '最低気温: '.$min;     if ($i < 1) {       $msg .= "\n\n";     }   }   return $msg; } function send_msg($msg) {   $post_data = http_build_query(['message' => $msg]);   $ch = curl_init(MESSAGE_NOTIFY_API_URL);   curl_setopt($ch, CURLOPT_POST, true);   curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);   curl_setopt($ch, CURLOPT_HTTPHEADER, [     'Content-Type: application/x-www-form-urlencoded',     'Authorization: Bearer '.TOKEN,     'Content-Length: '.strlen($post_data)   ]);   curl_exec($ch);   $http_code = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);   if ($http_code != 200) {     return false;   }   if (curl_error($ch)) {     return false;   }   curl_close($ch);   return true; }

  • テクログ

    cURLのメモリリーク

    こんにちは、kaiです。最近新作ゲームをプレイ中に自宅PCのメモリ使用率が95%まで上がったことがあって(windows defenderの問題でした)、メモリリークって怖いな…と思う今日この頃ですが、それに関連して今回は担当していた案件で遭遇した問題について紹介します。取得したURLにPHPのcURL関数を用いてアクセスするプログラムを作成したところ、実行中、時間を追うごとにサーバーのメモリ消費量が増大していく現象が発生しました。プログラム側ではスタックし続けるような処理を実装していないので、調査したところ、curlの古いバージョンにはキャッシュを蓄積し続けるバグが存在しておりプログラム実行中にはメモリが解放されずに消費されていくことが分かりました。そこで暫定の対応ではありますが、curl利用部分を個別のプログラムとして切り出し、そこにURLを分割して渡すことでメモリ消費を抑える形に改修しました。追々バージョンアップや別の方法に変えたいところですね…まだ記事作成時点でテスト中ですが、結果や追加対応などはまた報告できればと。外部要因の不具合はなかなか出くわさなかったので個人的には良い経験になったと思います。ではまた。・参考URLhttps://qiita.com/digitalpeak/items/4b39fdcb8fae7d09f406https://blog.eviry.com/entry/2019/07/23/160715_1