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

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

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

LIST OF ARTICLES

記事一覧

  • テクログ

    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; }
  • テクログ

    RESTAPIの社内勉強会

    つい昨日RESTAPIの勉強会があり参加しました!チャットボット導入の際に開発したとのことで導入の際に注意したことや必要になったことなど実際の業務で使ったポイントだったので具体的で分かりやすかったです。RESTの発表会とのことでしたが個人的には認証まわりの話がかなりためになりました。アクセストークンを使用した認証についてもある程度理解が深まったし業務時間中の勉強会だったのでいい息抜きになったしでかなり有意義な勉強会だったと思います!発表者の方ありがとうございますSPAなども増えてるのでWEBサイト開発でもRESTAPIの知識は必要になりますね個人的にも勉強するようにします!クライアント側の話もあったらまた勉強会参加したいです
  • テクログ

    CSS設計

    結構最近ブログ記事を書いた気がしたのですが2回目の執筆回がやってきました、ひこです。今回は名前だけは知っていたのですが実践していなかったcss設計について、仕事で使う機会があったので書きます。cssは書けば動く、というシンプルな言語なので気軽に学習・実践が可能ですが、その分クラスの命名規則など個人差が出やすいです。チーム開発では人によって命名方法が違うとどんどんコードがぐちゃぐちゃになって補修性が悪くなるので、一定の法則で命名してチーム内で理解しやすく保守しやすいhtmlを書こうというようなものです。既存のコードの改修などだといきなり途中からcss設計を導入する=命名方法が異なるコードの作成なので難しい部分もあるのですが、「新規ページである」「比較的シンプルなデザイン」「繰り返し使うオブジェクトが多い」などから勉強もかねて導入してみました。導入したcss設計は「BEM」と「flocss」を使い分けるような形です。いきなり複数のcss設計が入ったのは色々理由がありますが、私の計画性の無さとかで、誠に申し訳ないと思っています。_:(´ཀ`」 ∠):_具体的な命名は以下のような形です。<nav class="nav__gloval>   <ul class="p-boxFlex nav__gloval__list">     <li class="nav__gloval__item">       <a class="nav__gloval__link" href="">リンク</a>     </li>   </ul> </nav> 「nav__~~」はBEMのBlock Element modifierの命名方法ですね。「p-boxFlex」はflocssのprojectになっています。本で読みつつ学習を進めているのでBEMやflocssとは違うのかもしれませんがこれには理由があります。flocssの命名規則では最小単位のcompornent「c-」があるのですが、素直に最小要素を「c-~~」と命名しているとcompornentの個所が膨大になり、css設計で管理しづらくなる為、繰り返し利用するcompornentのみ「c-」を付け、他はBEMで書いています。また、はじめから何でもcompornent、projectと設定していくと、再利用性のない要素までflocssの命名規則にあてはめられ、無駄に種類が増えてしまう為です。これらは私の経験値不足によるところも大きいかと思うので、どんどん改良していけるかと思っています。まだまだcss設計初級者な私が今回感じたメリットですが、これをブラッシュアップしていくとクラス名のコピペだけでページを作成していけそうな気がします。また、知名度のある設計思想なので学習コストが低い(ネットで記事など探しやすい)点も良いと思いました。まだ試したことが無い方はcss設計はじめてみるのもいかがでしょうか。
  • テクログ

    AWS CLI等でEC2に紐づいているパブリックIPアドレスがEIPか否かを見分ける

    नमस्ते! आप कैसे(कैसी) हैं?ナマステー!こんにちは。インフラ担当のまつやです。前日までに新たに起動したEC2があり、それが監視が必要なものであるならば自動でZabbixに登録するスクリプトを毎日動かしています。aws cli等でインスタンスの情報を取得して以下の情報を抜き出します。Reservations[].Instances[].NetworkInterfaces[].Association[].PublicIp これでパブリックIPの付与されたインスタンスをピックアップし、別条件でZabbixのホストに登録するか否かを判定し、Zabbixに登録がなければ登録しています。しかし最近、自動でZabbixにホスト登録されたはずのEC2が見つからないという事象が発生しました。上記で抜き出したパブリックIPが見つからない・・・どのEC2にも紐づいていないし、EIPを検索しても見つかりません。色々調べた結果、どうやらAuto ScalingグループのEC2インスタンスがスケールアウトしてローンチする際、予約しておいたEIPに紐づけされる前に、動的に割り当てられるパブリックIPアドレスを検知してZabbixのホストとして登録してしまっていることが分かりました。その後予約してあったEIPが紐づけられたために、一時的に割り当てられていたパブリックIPは解放されたのでどこを探しても見つからないわけです。ということは、動的に割り当てられるパブリックIPと、EIPを区別することができればZabbixに登録するか否かを判定することができそうです。aws ec2 describe-instancesでインスタンスリストを取得して探していると、それらしいものがありました。Reservations[].Instances[].NetworkInterfaces[].Association[].IpOwnerId {   "Reservations": [     {       "Groups": [],       "Instances": [         {    中略               "NetworkInterfaces": [                          {                                 "Association": {                                        "IpOwnerId": "XXXXXXXXXXXX",                                        "PublicDnsName": "ec2-XXX-XXX-XX-XXXX.ap-northeast-1.compute.amazonaws.com",                                        "PublicIp": "XXX.XXX.XXX.XXX"                                 }, IPの所有者のIDですね。この値がAWSアカウントのIDになっていればEIP,amazonになっていれば動的に割り当てられるパブリックIPということになります。これによって、IpOwnerIdがamazonである場合はZabbixホストに登録しないという処理をスクリプトに入れることができました。それではまた!फिर मिलेंगे!
  • テクログ

    Cloudwatch eventsでcronを使って 日か、曜日を指定するとき

    ひなっちです。Cloudwatch eventsでcronなんですが、地味に忘れて、ハマるんです。なぜか?普段、Linuxのcronタブに書いてる書き方とすこしちがうからです。Parameter ScheduleExpression is not valid. ↑これcron的には書き方正しいはずなのになーと今回、自分が少しはまったのが毎週金曜日、10時(JST)で処理を動かす場合でした。これを、そのまま素直にcronで書くと0 1 * * FRI * こうです。が、正解は0 1 ? * FRI * こうです。これ、ちゃんとマニュアルにも書いてあるんです。cron 式の日フィールドと曜日フィールドを同時に指定することはできません。一方のフィールドに値 (または *) を指定する場合、もう一方のフィールドで ? (疑問符) を使用する必要があります。https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/events/ScheduledEvents.html#CronExpressionsほんと地味ーーーにはまるし、普段cronタブに慣れ親しんでいるとマニュアル読むほどのものじゃない気もして、辿りつくまでに時間がかかりました。。。。では!
  • テクログ

    素敵だら! Linux コマンド ~wget~

    こんにちはうなぎです。IT開発者にとって避けては通れない数ある Linux コマンドのうちから、厳選してご紹介する不定期コーナー“素敵だら! Linux コマンド”。年明け第一回目は「wget」!※つらいので今回から1コマンドずつ紹介することにしました。■wgetwget は何かをダウンロードしたいときに使うコマンド。ページを画像やCSSなども丸ごとダウンロードしたり、簡易的なクローリングもできちゃうパワフルなダウンローダーです。まずは通常の使い方から。wget http://example.com/ とすると、対象のページHTMLが `index.html` としてダウンロードされます。保存名を指定したいときにはwget http://example.com/ -O test.html `-O` オプションを使います。Linux で wget を使用するシーンとしては、.zip や .tar などの圧縮されたソースデータをダウンロードすることが多いのではないでしょうか。データが置いてあるホスティングサーバー上ではアクセスによる負荷を分散させるために、ダウンロードURLをミラーサイトにリダイレクトさせていることがあります。wget --trust-server-names https://sourceforge.net/projects/notepadplusplus.mirror/files/latest/download そんな時は、`--trust-server-names` を使えば正常にダウンロードできます。他にもWEB魚拓のように、あるサイトのページをまるっとダウンロードしたいときは、wget -k -p -w 3 http://abehiroshi.la.coocan.jp/ とすると、他のページや画像なども一緒にまとめてダウンロードしてくれます。`-k`  `--convert-links`ダウンロードしたHTMLやCSSのリンクを、ローカル内の相対パスに変換します。`-p` `--page-requisites`ページの表示に必要なファイルをすべてダウンロードします。`-w` `--wait`再帰的にダウンロードするとき、指定した秒数分間隔をあけて実行します。クローラー、スパイダー、すべてそうですが、再帰的なアクセス・ダウンロードするときには、必ず数秒の間隔をあけるなど、サーバーへの負荷を考慮してください!!!以上、2020年一発目は wget でした!