Quantcast
Channel: 初心者タグが付けられた新着記事 - Qiita
Viewing all 21495 articles
Browse latest View live

Laravel セッションを使って一時的に値を保存しよう!

$
0
0

目的

  • Larvelでセッションを使う方法は理解したらとても便利だったため忘れない様にまとめる
  • DBは使用せずとにかくセッションを開く部分だけを紹介する

考え方

  • 「値に名前をつけて保存する」と「値が必要な時に名前を指定して取得する」の処理を利用するだ毛である。
  • 各クライアントのセッションIDという物と値の名前がそれぞれリンクして保存される。(これは値保存の概念として知っておいて欲しいが、セッションIDがクライアントに勝手に割り振られるため知らなくても実装できる)

書き方の例

  • 値に名前をつけて保存する方法を下記に記載する。

    session()->put('セッションに入れる値の名前',セッションに入れる値);
  • セッションに入れた値を取り出す方法を下記に記載する。

    取り出した値を格納する変数=session()->get('セッションに入れた値の名前')

より具体的な例

  • 「Hello world」という文字列のセッションに入れてみる。
  • セッションに入れる際の値につける名前はstrとする。
  • セッションから値を受け取る時に格納する変数は$out_putとする。
  • 任意のコントローラに下記を記載する。

    session()->put('str','Hello world');
  • 別のコントローラに下記を記載する。

    $out_put=session()->get('str');
  • 上記の実行後、$out_putには文字列「Hello world」が入っている。

    • コントローラの変数をビューで表示する方法はこちら

2020年版 初心者向け プログラミング入門ガイド

$
0
0

こちらの記事は、Aphinya Dechalert氏により2019年 12月に公開された『 The 2020 Starter Guide To Breaking Into Programming for Beginners』の和訳です。
本記事は原著者から許可を得た上で記事を公開しています。

プログラミングは、取っ掛かりが難しい分野かもしれません。特に、この業界が初めての方にとっては、どこから始めたらよいかもわからないかもしれません。

ほんの10年ほど前までは、インターネットとそのリソース関連のコードは、現在のサイズと比べると、ほんの欠片程度のものでした。より多くの開発者がエコシステムへの貢献に時間を費やすにつれて、私たちの情報の相互接続性は過去10年間で計り知れないほど成長しました。

これは驚くべきことですが、圧倒されることもありえます。

ここでは、小難しいことは置いておき、とりあえずプログラミングを始めることに焦点をあてたガイドを提示します。

以下は、このガイドをナビゲートするのに役立つコンテンツを要約したものです。PCのブラウザを使用している場合は、「ctrl」 + 「f」の検索機能を使用して移動できます。

# top
#1:まず目標を決める
#2:開発者になることの良い部分と悪い部分
#3:予算
#4:開発作業のさまざまな部分
#5:最初のポートフォリオの構築
#6:求人への応募
#7 :ここから先は?

#1:まず目標を決める

これがあなたのキャリアとなります。

キャリアに関して多くの人が見落としがちなことは、それが人生において不可欠なものである、ということです。これを実行することに、かなりの時間を費やすことになるでしょう。

目標を決めることで、必要なものを重点的に学習できるようになります。-正直、難解で気が遠くなるようなコードも存在するので。

プログラミングを身につけることで得られるかもしれない報酬に魅力を感じる人もいれば、プログラミングによる課題解決を身につけたい人もいるでしょう。私の場合、アイディアを具現化したかったのでプログラミングを始めました。私はいつもアイデアにあふれており、プログラミングは自分のゴールを達成するためのツールであり架け橋となるものです。

目標があれば、どういった理由、どういった成果のためにコーディングをしているのか、を定期的に思い出すことにも役立ちます。なぜなら、自身の仕事や上司、同僚、あるいは自分においても、本来の道から脱線することが往々にしてあるからです。

だから、目標を常に忘れないでください。-何を目的として開発の旅を始めたのか?なぜこの分野で学び、成長するために時間を投資することを決めたのか?

#2:開発者になることの良い部分と悪い部分

どんなキャリアを選択するにしても、良い部分と悪い部分は存在します。開発者も例外ではありません。

メリット、デメリットのリストと、開発者として活躍するために考慮すべきことを以下に記載します。

メリット:

  • 報酬- 資金が潤沢にある会社で働いていない場合には数年はかかりますが、開発の世界では「6桁の給料」は神話ではありません。 ※訳注-「6桁の給料」: 1,000万円プレイヤー、数千万円レベルの年収
  • リモートワークも可能- 毎日、一日中オフィスにいる必要はありません。多くの企業は、リモートワークのアイデアに取り組んでいます。(「オフィスデイ」で定例会議などを行う)
  • 世界で通用するスキル- あなたが持つノウハウは国境を越え、あなたが望むほとんどの場所に持っていくができます。国を移動しても、学んだことが通用します。
  • 高い需要- 米国労働統計局によると、開発関係職の需要見通しは、2014年から2024年の間に17%成長すると予測されています。これは、他のセクターの平均成長率である7%と比較すると非常に高い値です。

デメリット:

  • 競合相手- 正直、何かを始めるときにそれが簡単であればあるほど、他の人も同じことをする可能性が高くなります。プログラミングの技術が他の人にとって、よりアクセスしやすくなるにつれて、競争レベルと競争相手は比例して増加します。
  • ストレス- 開発者になると、定期的に訪れる締め切り、意味をなさないバグ、他人から引き継いだコード、粗末なフレームワークと実装、深夜のデプロイメント、刻々と変化する環境についていくために止めることのできない継続的な学習の純粋なストレスなどがあります。
  • 長時間労働の可能性- 家に帰っても仕事は止みません。あなたにつきまとうことが往々にしてあります。そんなとき遅れないように仕事を処理するために、学習の時間は一旦横に置いておく必要があります。新人開発者にとっては、労働時間が長くてつらい場合があります。
  • 座りがちなライフスタイル- あなたの大半の時間は画面越しに過ぎていきます。これは、あなたがほとんど動いて​​いないことを意味し、長期的には健康に害となる場合もあります。

考慮すべきこと:

  • 自身の性格- こだわりの強さは、開発者として成功すること、優れたコード作成のプロセスに必要なものです。特に学習プロセス中では、かなりの忍耐力が要求されます。また学習方法も重要です。多くのデジタル学習リソースがあり、それらの多くはリアルな人間関係と切り離され、自分のペースで行います。自分一人でも自発的に学習することがあまり得意でない場合、この分野で活躍するのは難しいかもしれません。
  • 社会および家庭における義務- 地下室の世捨て人になることは無いかもしれませんが、コードを学習し、コードを実装する作業には多くの時間を費やします。注意しておかなければ、完全に孤立してしまう可能性があります。家族や友人は最初は理解できないかもしれませんが、あなたのキャリアに関して全員が同じ理解である必要があります。一部のパートナーは、あなたが、チュートリアルでNodeパッケージのバージョンが言及されていないため全然コンパイルできないコードにストレスを感じているのを見るよりも、あなたと映画を一緒に見る方が好きなのです。
  • コミットメントの能力- プログラミンを趣味から本格的なキャリアの選択肢に転換するとき、スキルと専門知識をずっと追求し続けるという、人生の長旅にもコミットすることになります。使える時間の中であなたがコミットできるものが何であるかを明確にし、積極的にその整合性を保つ必要があります。できなかった場合に、あなたの人生は邪魔され、遅れをとってしまうリスクがあるからです。あなたの人生の他の部分を邪魔されることの無いよう、スキルの向上にどれだけコミットできるかを明確にしてください。
  • あなたが期待すること- すべての人が「6桁の給料」で始まるわけではありません。ほとんどの場合、駆け出し開発者向けの報酬は、約45,000〜55,000ドルというのが一般的です。この額は、どの国で働いているか、どのような会社で働き続けるかによって様々です。スタートアップでは予算が少ない傾向にありますが、ビジネス内容次第では、報酬が加速度的に上がっていくチャンスもあります。

#3:予算

コードの学習は投資です。時間に加えて、金銭的な要素の必要性などいくつかの考慮すべき事項があります。

ハードウェア

これは多くの初心者が尋ねる質問ですが、実際には誰も適切に答えられません。物事の壮大な計画では、7コアチップを搭載したものなら何でも問題無いでしょう。当時2012年に購入した私の「Dell XPS i7」は、2019年の5月まで非常によく働いてくれました。現在、私はほとんどのコーディング作業で「ASUS Ryzen 7」のラップトップを使用しています。

過去、仕事場で数多くの作業用ラップトップを与えられてきました。5コアチップは、複数の画面とコンソールを実行しているときにラグが生じ、3つ以上開いた場合にはクラッシュしてしまう傾向があります。

メインの開発マシンとしてラップトップを選択する場合、「Android Studio」などの一部のプログラムはバッテリーを消耗し、RAMに大きな負荷がかかります。

開発マシンに大金を費やす必要はありません。私が最近見たものだと、マシン全体の厚さが薄くなるにつれて価格が上がる傾向があります。サイズに左右されず、代わりに実際のスペックを確認してください。7コア、1TBのストレージ、最小16GのRAMのラップトップであれば手頃な価格で入手でき、ほとんどのことを問題なくコーディングできます。
訳注:ここで記載している「5コア」、「7コア」などは “5-core”, “7-core” の直訳であり、おそらく 「Intel Core i5」や「Intel Core i7」のことを指していると思われます。

ソフトウェア

ほとんどの開発関連のソフトウェアは無料でオープンソースです。例えば、「Visual Studio Code」は、無料のコミュニティ主導の拡張機能を備えた、最も人気のあるコードエディターの1つです。

Windows vs Mac のOS論争については、コードで何を達成しようとしているかに大きく依存します。Apple のモバイルアプリ開発を始めたい場合は、Apple のコンピューターが必要になるでしょう。ただし、Windows マシンはそれ以外の開発作業をカバーできます。

コース

開発者になるために、コンピューターサイエンスの学位の取得を考えることがよくあります。過去10年程の間で、この業界は生涯に渡る長年の学習者に対応するため、変容し、変化してきました。そして、従来の学位取得のような学習手段の代替としてブートキャンプやオンラインコースのようなものが誕生しました。

コンピューターサイエンスの学位の取得自体が間違っているわけではありませんが、今日では第一歩を踏み出すために存在する数多くの方法の1つであることを忘れないでください。

プログラミングのキャリアを始めるのに役立ついくつかの場所を以下に記載します。

Udacity Nano Degree

Udacity には、この分野でこれから学習を始めることを目的とした多数のコースが含まれており、よりすぐりのチューターが評価した実際のプロジェクトもあります。コースの構造は、自習型と時間指定型の組み合わせです。

「Nanodegree」の費用は、あなたが入学したコースを完了するために、いかに早く、いかに積極的であるかによります。これは、Udacity が毎月のサブスクリプションベースで課金されるためであり、予想学習時間の枠でコースを完了するモチベーションになるため、ある意味では良いことです。

Coursera

Coursera は、無料のプラットフォームであり、従来の大学でのコンピュータサイエンス学位取得の約半分の価格で認定学位を得ることや、認定証明書を得ることもできます。

コースは世界中の大学によって運営され、多くの場合、開始日は決まっており、キャンパスに通って取得するものと同品質の内容となっています。

EdX

EdX は、ハーバード、プリンストン、ブラウン大学などのアイビーリーグメンバーの参加を含む、オンライン学習プラットフォームです。他のメンバーには、IBM、Microsoft、AWS などのベンダーが含まれます。

利用可能なコースは多くの場合、オープンで自己ペースで無料であり、有料で正式に認定を受けるオプションもあります。MicroMastersと呼ばれる利用可能な短いトラックがあります 。これらのトラックには、特定の主題またはトピックに関する詳細な知識を提供するために、いくつかの厳選されたコースが含まれていることがよくあります。

#4:開発作業のさまざまな部分

一般的に「プログラマー」で連想するのは、ただのコーディングのことで、これ以上のものがあることを気にかけない。プログラミングの世界で遭遇するであろうさまざまな分野と、開発者として働き続けるかもしれない場所の概要を次に示します。

フロントエンド

フロントエンドはあなたが見るものです。それはインターフェイスであり、一般的にコードにおいて、公開される対話の始まりです。

今日、多くの開発者、特に独学の初期段階ではフロントエンド開発から始まります。これは、そのほとんどが HTML、CSS、および何らかの形式の JavaScript に基づいているためです。

フロントエンドが簡単に始めやすいということは、多くの競合がいるということです。自分自身を差別化するために、デザイン、ユーザーエクスペリエンス、パターン、タイポグラフィなど、コーディング以外の関連トピックも探求する必要があります。

フロントエンドのコーディング手法を知るだけではもはや十分ではありません。少なくとも設計者と同じ言語で話せるようにする必要があるため、設計の理解は開発作業の不可欠な部分になっています。

バックエンド

フロントエンドは、データソースに接続されていなければほとんど役に立ちません。バックエンドは、データをどのように保存、取得、フォーマットするかを決めて処理するブリッジとして機能します。

バックエンドとしては、上記の機能以外には特にありませんが、コードの肥大化、データ管理、セッションのための山ほどの方法論とアーキテクチャがあります。

バックエンド開発から始めると、フロントエンドを使いやすくする手段に過ぎないように思えるかもしれません。しかし、バックエンドの複雑さは、データとその永続化の方法を簡潔に処理する能力にあります。

インフラストラクチャとアーキテクチャ

最も単純な場合、コードを Degital Ocean droplet または AWS EC2 インスタンスのようなクラウドボックスに配置することは、簡単なタスクに感じるかもしれません。スケーラビリティ、プロセス自動化、ホスティング費用を手に負えない価格にまで膨らませない方法について考える必要がある場合には、複雑さが生じます。

多くの場合、インフラストラクチャの認定を取得すると、Google Cloud、Microsoft Azure、Amazon AWS などの特定のクラウド製品の専門家になります。学習の開始時にインフラストラクチャやアーキテクチャを選択する人は多くはないため、これらの認定の取得は給与を大幅に引き上げる可能性があります。

なぜか?それは、フロントエンドやバックエンドほど派手さがなく、目に見えづらいものではありますが、企業が成長の加速段階を経て、そこで既存のコードとデータが需要を満たし続ける必要がある場合に、依然として必要なコンポーネントだからです。

言語とフレームワーク

選択肢として多くの言語とフレームワークがあります。現在最も人気があるのは JavaScript です。

それ自体「純粋な」プログラミング言語ではない、という議論の余地はありますが、その適用性とさまざまな領域での使いやすさから、1つのことを知るだけでも、多くのことを実現できるようになります。多くのWebテクノロジーと実装は、今日ではJavaScriptに帰着されています。

モバイルアプリの開発やゲームベースの開発を始めることに興味がある場合は、 Java と C++ から始めることをお勧めします。それらには、バックエンドで前処理されたフロントエンドを実装できるフレームワークも付属しています。

#5:最初のポートフォリオの構築

特に過去ポートフォリオを作成したことがない方には、ポートフォリオに何を含めるべきかを判断するのは困難です。ポートフォリオを持っていれば、持っていない場合よりも仕事を早く見つけやすくなります。これは、履歴書でアピールしたことの裏付けとしてポートフォリオが役立つためです。

始めるためのヒントとアイデアをいくつか紹介します。

フロントエンドの実装

すべてにインターフェースが必要です。簡潔かつ分かりやすい方法で HTML、CSS、および JavaScript を組み込んだ実装で、フロントエンドのスキルをアピールしましょう。

Angularのようなフレームワークや、Reactのようなライブラリを使用してシングルページアプリケーションを実装できます。todo リストはチュートリアルのはじめによく使われるので、何度も作成されています。

24時間で起動できるフロントエンドアプリのアイデアをいくつか紹介します。これは、todoリストアプリで学んだアイデアをあなたの独自アプリとして再コーディングします。

  • 体重トラッカー
  • ノートアプリ
  • タイマーアプリ
  • 家計簿アプリ
  • 電卓アプリ
  • ウィッシュリストアプリ

ionic のようなフレームワークをラップすれば、モバイルアプリとしても機能します。

フロントエンドアプリを作成しているときは、誰かが書いたブートストラップや CSS に頼りすぎないようにしてください。迅速な開発のコンセプトには沿っていますが、初めてとりかかる場合は、自分がスキル範囲のどこにいるのかを適切に把握したいと思うでしょう。つまり、デザインとデザインコードの実装の多くを自分で行うことを意味します。

バックエンド実装

上記のアイデアをさらに一歩進め、それらのデータベースとバックエンドを実装しましょう。

これは、独自のデータ構造を作成し、APIを介してフロントエンドからアクセス可能な方法で、クエリおよび処理するやり方を考えることを意味します。それをクラウドで実行すれば、インフラストラクチャテクノロジーのハンズオン体験が可能です。- この経験は、履歴書に正当に書くことができます。

開発段階のバックエンドの多くは、あなたのローカルマシン上にあります。これは、非効率性を減らすために自動化されたプロセスフローを設定する能力と知識を意味します。手動で何かをしている場合、これは自動化できるか? と自問自答してみてください。

答えはおそらく「イエス」だけども自動化の方法がわからないという場合、ググってみましょう。

API を統合する

あなたのツールキットの一部としてバックエンドがない場合に、フロントエンドと連携する別の方法は、外部APIを統合することです。以下のような、いくつかのオープンで無料のAPIがあります。

RapidAPIには、彼らのプラットフォームでホストするための無料のAPIリストがあります。 eBayには、カテゴリの検索、出品、リストの表示に使用できるAPIもあります。

アメリカ国勢調査局には、人口統計、人口、および経済データなどの国勢調査を通じてコン​​パイルされた情報にアクセス可能な選定 API があります。この種のデータで検索クエリとグラフを使用して、多くの楽しみを得ることができます。

おもしろいことに、 Marvel Comicsにも API があり、Marvelの70年分のコミック関連データに関する情報にアクセスできます。私はこれを個人的に確認していませんが、この種のデータから何か壮大なものを構築できるように感じます。

#6:求人への応募

開発者の仕事に応募するのは、萎縮したり、長いプロセスとなるかもしれません。学習やコースを終えていることを要件とするような求人に応募したい場合は、プログラムの実施中に応募しておくのがベストです。

これは、選考、面接、および技術的テストのプロセスに、1〜3か月程かかることがあるためです。結果の連絡に時間がかかる会社もあります。

主なアドバイスは、できるだけ多くのポートフォリオを構築し、情報豊富な方法で履歴書を作成することですが、5ptフォントで端まで詰め込むようなことは避けてください。星やスキルの割合を使用しないでください(JavaScriptの85%のスキルを持っている、というような使い方です)。不必要にスペースを占有してしまいますし、雇用者はその数値を算出するために使用したメトリックに対して知らない可能性があるためです。

簡潔に情報を伝えましょう。関連する職務経験がない場合は、ポートフォリオを代用してください。あなたが専門とするスタックの範囲と、それをあなたの履歴書の大部分として強調しましょう。

しかし、求職プロセスのすべてにおいて最も重要なことは、落胆しないことです。他の雇用市場と同様に、業界に一旦入れば、そこから次に進むことも可能です。

#7:ここから先は?

コースを1つまたは2つ修了したら、自分でいくつかのアプリを作成しましょう。チュートリアルの指示手順に従わなくてもコーディングできるようになれば、実際の世界でもコードを作成する準備が整っています。

向上心を持ち続けることは、仕事以外の時間を必要とすることが多く、また非常に長い間自分が初心者のように感じ続けるでしょう。これを克服するには、新しい知識ポイントを収集する必要があります。-主題や言語における幅の広さと深さの両面で

知識が身につければ身につけるほど、プロジェクトは簡単になり、問題をその場で解決できるようになっていくでしょう。初心者なので、ミスを恐れず、できる限り多くのコードを作成するように努めてください。非効率性を認識したり、プロジェクトのどこで問題が発生する可能性があるかを予測するのに役立ちます。

翻訳協力

Original Author: Aphinya Dechalert
Thank you for letting us share your knowledge!

この記事は以下の方々のご協力により公開する事が出来ました。
改めて感謝致します。
選定担当: yumika tomita
翻訳担当: @upaldus
監査担当: takujio
公開担当: @upaldus

私たちと一緒に記事を作りませんか?

私たちは、海外の良質な記事を複数の優秀なエンジニアの方の協力を経て、日本語に翻訳し記事を公開しています。
活動に共感していただける方、良質な記事を多くの方に広めることに興味のある方は、ぜひご連絡ください。
Mailでタイトルを「参加希望」としたうえでメッセージをいただく、もしくはTwitterでメッセージをいただければ、選考のちお手伝いして頂ける部分についてご紹介させていただく事が可能です。
※ 頂いたメッセージには必ずご返信させて頂きます。

ご意見・ご感想をお待ちしております

今回の記事は、いかがだったでしょうか?
・こうしたら良かった、もっとこうして欲しい、こうした方が良いのではないか
・こういったところが良かった
などなど、率直なご意見を募集しております。
いただいたお声は、今後の記事の質向上に役立たせていただきますので、お気軽にコメント欄にてご投稿ください。Twitterでもご意見を受け付けております。
みなさまのメッセージをお待ちしております。

「テスターちゃん」で学ぶソフトウェアテスト①

$
0
0

「テスターちゃん」とは:thinking:

初心者(新人)向けに描かれたソフトウェアテストの漫画
作者さんも現役の方らしい
たまたまJSTQBについて調べていた時に見付けたブログの記事がきっかけで読むようになりました
JSTQBを取るメリット5選

元々(紙の本・電子書籍共に)同人誌として発売されているが、書籍版としても発売されることが決まっている
※因みに書籍版には同人誌版1~5巻までの内容が入る(大人の事情により書籍版には収録出来ない内容も一部あるとのこと)ため、同人誌版の1~5巻は紙・電子書籍共に販売を完了しているらしい
現在の同人誌版は英語版の1巻のみ購入可能となっている

実は自分が唯一通読した仕事関係の本:sweat:
とは言え、完結した作品ではないのですが

対象読者層は初心者や作者の方も言っているように開発側の人だが、しかしながら個人的にはバリバリ設計等もこなしている経験者や管理者側の人間が読んでも新たな発見が出来ると思う
むしろそう言った立場の人が初心を忘れないように積極的に読むべきでは?

これから「テスターちゃん」を読んで学んだことをまとめて行こうと思います

QAとは何か

QA=Quality Assurance
日本語で言うと品質保証のこと
プロダクトがユーザーにとって満足の出来る品質に至っていることを保証する

テストとは何ぞや

プロダクト(アプリ・Web等)を実際に動かして問題がないことを確認する

テストの確認の基本

1.バグの確認

テストとは、バグを含めて出来るものが出来ないこと、あるものがないこと=意図しない動きを確認する

ソフトウェの動きは以下の4つ

・入力
・計算
・出力
・データ保存

そこに注目する

2.性能の確認

ユーザーに影響のあるバグが見付からなくなったとしてもそのプロダクトが大丈夫だとは限らない
Ex)とても挙動が遅い、とか
なので、性能の確認も必要である

性能系は基本部分が多いので、早めに確認する
→作り直しになる可能性がある

3.ユーザー視点での確認

ユーザーとしてそのプロダクトが使い易いかも見る必要がある

企画通りでも使ってみて改善した方がいいことも確認する
ユーザーは絶対こう使うと言う思い込みもあるので、それに縛られないことが必要

気付くのって大変

QAが最後の砦と言われているのは、開発・企画が気付かなかったことに気付いて食い止めるから

とは言え、何かおかしいと言うのに気付くのは大変なこと

・プログラムの間違い易いところ
・端末のくせ
・データがどうやって保存されるのか……等

結構幅広い知識が必要となってくるようだ

マイヤーズの三角形

課題

以下のプログラムで、テストケースを全て述べよ

【プログラム】
 1.このプログラムは、3つの整数を入力出来る
 2.この3つの値は、それぞれ三角形の3辺の長さを表すものとする
 3.プログラムは三角形が以下のどれかを決めるメッセージを印字する
  ・不等辺三角形
  ・二等辺三角形
  ・正三角形

確認してみる

出来ること

正常系確認
・不等辺三角形になるか
・二等辺三角形になるか
・正三角形になるか

出来ないこと

異常な入力値
・0を入力
 →全部の辺が0の場合
 →どれかの辺が0の場合
・マイナス値
 →全部の辺がマイナス値の場合
 →どれかの辺がマイナス値の場合
・小数点を用いた値
 →全部の辺が数点を用いた値の場合
 →どれかの辺が数点を用いた値の場合
・整数以外での確認
 →文字(かな・カナ・漢字・記号・絵文字等)
・入力しない(空欄にする)

【見落とし易い?】
・A+B<Cの場合
 →ちゃんとした整数でも1つの辺が他の辺の合計より長い場合は三角形にならない

マイヤーズの三角形のまとめ

・まず正常値は必要
・二等辺三角形はそれぞれの辺についても確認する
・三角形の性質(テスト対象)をわかっていないと出ないテスト観点がある
 →盲点となっているところがあるかも
 →しっかり頭を回転させて考える必要がある

続く

一つの記事で同人誌版1巻まとめようとしましたが、結構内容が濃いので、巻数を気にせずまとめていきます:sweat_smile:

PythonでABC159を解きたかった

$
0
0

はじめに

今回は問題が簡単だったのでA~Cは解けましたが、Dまで解けるべきでした。

A問題

問題

考えたこと
偶数を作るには、偶数+偶数、奇数+奇数しかないのでNとMのそれぞれで$_nC _r$、$_mC _r$しています。コンビネーションの計算は自分で実装してもいいですが、scipyにあるのでそれを使いました。

fromscipy.miscimportcombn,m=map(int,input().split())ans=comb(n,2,exact=True)+comb(m,2,exact=True)#exact=Trueで整数値が返される
print(ans)

B問題

問題

考えたこと
回文の問題が苦手でA解いた後に放置していました。Sが回文であるのなら、s.reverse()==sになることを利用して解きました。強い回文の条件はsをスライスして、上と同じことをしました。n

s=list(str(input()))checker=0n=len(s)new_s=list(reversed(s))ifs==new_s:checker+=1split_s=s[0:(n-1)//2]new_s=list(reversed(split_s))ifnew_s==split_s:checker+=1split_s=s[(n+2)//2:n]new_s=list(reversed(split_s))ifnew_s==split_s:checker+=1ifchecker==3:print('Yes')else:print('No')

C問題

問題

考えたこと
体積が最大になるのは、立方体になるときなので$(L/3)^3$で終わり。精度が怖かったけどなにもしなくても通った。

l=int(input())print((l/3)**3)

D問題

問題
1WA、4TLE

考えたこと
解けなかった
for文で$A_i$を抜いたAでコンビネーションを計算しようとしたけど、TLEが出て死んだ。

fromscipy.miscimportcombn=int(input())a=list(map(int,input().split()))a_s=set(a)foriinrange(n):l=a[i]a[i]='X'ans=0forjina_s:ans+=comb(a.count(j),2,exact=True)print(ans)a[i]=l

まとめ

勉強不足なのとBを解くことをあきらめてしまったことが敗因。
おやすみなさい。

Pythonで毎日AtCoder #13

$
0
0

はじめに

今まではAtCoderProblemsのレコメンド問題を解いていましたが、より基礎的な力が足りないと思ったのでこれをやります。

#13

さすがにA問題1題だけだと物足りないので、A問題をふたつ解きます。

ABC086-A
ABC081-A

考えたこと
ABC086-Aは$a*b mod(2)$するだけ

a,b=map(int,input().split())ifa*b%2!=0:print('Odd')else:print('Even')

ABC081-Aはsの中の'1'をcountするだけ

s=list(str(input()))print(s.count('1'))

まとめ

今日のABCで悔しい思いをしたのでとりあえず過去問精選を解く。
では、また

Atcoder 生活 3日目

$
0
0

前回

3日目

今回はABC042_B,ABC043_Bをやり、さらに今日開催されたABC159に挑戦しました。

ABC042_B

文字列大好きいろはちゃんイージー

#include <bits/stdc++.h>
usingnamespacestd;intmain(){intN,L;cin>>N>>L;vector<string>S(N);for(auto&e:S){cin>>e;}sort(begin(S),end(S));for(constauto&e:S){cout<<e;}}

sortという存在をこれでまなびました.
昨日は、Aしか解いてなかったので、Bの難しさを知りました

ABC043_B

バイナリハックイージー

#include <bits/stdc++.h>
usingnamespacestd;intmain(){stringS,S_="";cin>>S;for(inti=0;i<S.size();i++){if(S[i]=='0')S_+='0';elseif(S[i]=='1')S_+='1';elseif(S[i]=='B')if(S_!="")S_.erase(S_.size()-1);}cout<<S_<<endl;}

これでやっとforの使い方を理解することができました。

ABC159

A-The Number of Even Pairs

#include <bits/stdc++.h>
usingnamespacestd;intmain(){intN,M;cin>>N>>M;if(N>1&&M>1)cout<<N*(N-1)/2+M*(M-1)/2<<endl;elseif(N<=1&&M>1)cout<<M*(M-1)/2<<endl;elseif(N>1&&M<=1)cout<<N*(N-1)/2<<endl;elsecout<<0<<endl;}

これしか解けなかった、、
やっぱA問題とB問題は格が違うと思う

明日もB問題解くため練習だ!

PHPでRSSを読み込む方法

$
0
0

初めに

プログラミング学習を独学で続けてきて、これは忘れそうだなと思いましたので、備忘録として記載します。

RSSとは

RSSは「Rich Site Summary(リッチ・サイト・サマリー)」の略です。
ブログ等でこのようなアイコンを見たことがあると思います。
スクリーンショット 2020-03-22 23.25.15.png
これがRSSのマークです!!

では、このRSSは何をする時に使うのでしょうか?

続きは後日書きます。

K最近傍法(K-Nearest Neighbor) 分類 基礎

$
0
0

K近傍法 (K-Nearest Neighbor) 概要

k近傍法(以下k-NN)はもっとも単純な分類アルゴリズムであり、予測したいデータと距離の近い、k個の訓練データの正解ラベルから予測値を決定するアルゴリズムである。

<メリット>
- モデルの過度な調整無しにある程度の精度が出る
- アルゴリズムの理解が容易

<デメリット>
- データの前処理必須
- 特徴量(数百以上)の多いデータセットでは上手く機能しない
- 疎なデータセットでは精度が出ない
- 処理速度が遅い

上記デメリットから実務上あまり使われることはない。

K-NNの以下の2つのうち分類(Classification)について本記事ではまとめる。

  1. Nearest Neighbor Classification (分類)
  2. Nearest Neighbor Regression (回帰)

分類: Nearest Neighbor Classification

予測のためのHyper Parameter は以下。
参考=> sklearn

Parameters詳細
n_neighborsアルゴリズム判断に用いる近傍点の数 (default=5)
weights予測判断に用いる重みの設定 (default="uniform")

"uniform":均一な重み
"distance":距離に応じた重み
algorithm予測のためのアルゴリズム (default="auto")

"ball_tree":BallTreeアルゴリズム
"kd_tree":KD Treeアルゴリズム
"brute":総当たり探索
"auto": 最適なアルゴリズムを自動で選択
leaf_sizeKD Tree, Ball Treeアルゴリズムを用いるときのリーフサイズ
metric距離の測定方法 (default="minkowski)
pMinkowski metricにおけるPower Parameter
n_jobs利用するCPU数の設定 (default=1)

Cancer Datasetでの予測分類

実際にsklearnのcancer datasetにて分類予測を行う。

まず必要なライブラリを読み込む。
classfication_reportは予測値の評価に用いる。

#必要なライブラリの読み込み
%matplotlibinlineimportnumpyasnpimportmatplotlib.pyplotaspltimportpandasaspdfromsklearn.model_selectionimporttrain_test_splitfromsklearn.metricsimportclassification_report#sklean cancer dataの読み込み
fromsklearn.datasetsimportload_breast_cancer

Cancer DataSetの詳細を確認する。
sklearn cancer datasetには説明変数(特徴量)が30、569のデータポイントがある。
目的変数(ラベル)のうち"0"が悪性の腫瘍(malignant)、"1"が良性の腫瘍(benign)を示す。

dataset=load_breast_cancer()# 特徴量 (説明変数)
X=pd.DataFrame(dataset.data,columns=dataset.feature_names)#ラベル(目的変数)
y=pd.Series(dataset.target,name='y')# データ詳細確認
print('X shape: (%i,%i)'%X.shape)print(y.value_counts())display(X.join(y).head())

image.png

実際に訓練データ/テストデータに分割の上、予測精度の確認を行う。
ハイパーパラメーターのうち近傍オブジェクト数を変数(1~10)とし、予測精度の変化をプロットする。

fromsklearn.neighborsimportKNeighborsClassifier#データセットをtest sampleを割合20%でホールドアウトする。
X_train,X_test,y_train,y_test=train_test_split(X,y,random_state=0,test_size=0.2)#近傍オブジェクト数とその予測スコアを格納するリストを準備
List_n_neighbors=[]List_train_score=[]List_test_score=[]#近傍オブジェクト数を1-10で予測値を比較。訓練データに対してfitする。
forn_neighborsinrange(1,11):clf=KNeighborsClassifier(n_neighbors=n_neighbors).fit(X_train,y_train)#訓練スコアと予測スコアを算出してリストに格納
List_n_neighbors.append(n_neighbors)List_train_score.append(clf.score(X_train,y_train))List_test_score.append(clf.score(X_test,y_test))#近傍オブジェクト数に対して訓練スコア、テストスコアをプロットする
fig=plt.figure(figsize=(10,6))plt.plot(List_n_neighbors,List_train_score,label="training accuracy")plt.plot(List_n_neighbors,List_test_score,label="test accuracy")plt.ylabel("Accuracy")plt.xlabel("n_neighbors")plt.xticks(np.linspace(1,11,11))plt.legend()

image.png

まとめ

Cancer Datasetを用いた予測においては近傍オブジェクト数(k)がk=6あたりが最良の性能であることがうかがえる。ただしK=2の場合でも88%程度の精度が担保されており、特徴量30程度のCancer Datasetに関してはNearest Neighbor Classificationによる分類は十分に機能しているといえる。

以下classification_reportによる結果を確認しても再現率(recall)、適合率(precision)ともに大きな偏りなく精度を保っていることが確認できる。

ただし実際に実務上、ガンの診断に使えるかというと以下classification_reportによる結果を確認するとmalignant再現率(recall)の精度から悪性47件のうち3件程度は悪性腫瘍(malignant)を良性(benign)と判断してしまう点から十分な精度ではないと思われる。

clf=KNeighborsClassifier(n_neighbors=6).fit(X_train,y_train)predict_result=clf.predict(X_test)print(classification_report(y_test,predict_result,target_names=["malignant","benign"]))

image.png


エンジニア体験会での初心者への教え方(Java,Eclipse)

$
0
0

先日、自社で行っているプログラミング体験会で、未経験者に「プログラミングとは」を話す機会を頂いたので、次の機会の為に良かったことや改善していきたいことを自分用にまとめておきます。

--はじめに--

【体験会に来る人の経歴】
体験会には様々な経歴の人が来ます。
・大学の時にJava学んでました~
・接客業をしていてパソコンはあまり触ったことないです~
・転職を考えている中でIT業界に興味を持ちました~
など、他業種や未経験の人が多かったです。

【体験会に来る人が求めていること(体験会後の交流会で多かった質問など)】
・完全未経験
→ プログラミングってなんか難しそう・・・
→ どうやって作るの?
・業務未経験だけどちょっと触ったことある(大学とか)
→ この会社で大丈夫か?(普通に企業説明会的な感じ)
→ エンジニアの仕事ってどんな感じ?

レベルもまちまちなのでその人たち全てに同じようなレベル感で教えることはできない。

今回は完全未経験向けに教える方法をメモしていきたいと思います。
この会社で大丈夫かどうかは体験会が終わった後にでも答えてあげましょう。

プログラムとは何か

まず初めにプログラム、プログラミング、プログラミング言語についてのイメージを話します。

初心者の多くはプログラムがどんなものか知らないことが多く、プログラミング言語って何?状態も珍しくないです。

そんな中話すわけなので、なるべくイメージをしてもらうことが大事だと思います。

そして、できるだけ難しい言葉は使わないようにします。
なんでもそうですが、苦手意識を持ってしまうとなかなか吸収しづらくなるため、わかりやすく説明します。
もちろん使わなければならない場面もあるので全く使わないのは無理ですが、使った場合にはその言葉の意味も伝えるようにすればたぶん大丈夫です。

例)書いたプログラムはコンパイルしなければ実行できません。
 →プログラムを実行するには、書いたコードをコンピュータ語に翻訳する「コンパイル」という処理をしなければなりません。

というように、なるべくかみ砕いて教えていく方がよいと思います。
できるだけなじみの深い言葉で話すことによって、苦手意識を持たせないことが重要です。

--講義の流れ--

1.プログラムとは

 - プログラムが何をするものなのかをざっくりと(言語の種類などもここで)

2.プログラミング基礎知識

 - プログラムの流れ(どういう流れで動いているか)
 - 変数
 - 簡単な構文をちょろっと(ifやfor)

3.実践

 - Eclipseで簡単なコードを書いて実行してもらう

--講義内容--

1.プログラムとは

プログラムとはコンピュータに向けた指示のことです。

普段私たちが人に何か指示をするとき、通常は言語を使いますよね。
日本人なら日本語、アメリカ人なら英語、中国人なら中国語といった言語を用いて指示するのですが、コンピュータに何かを支持するときも同様に言語を使用します。
それがプログラミング言語なのです。
プログラミング言語を用いて書かれた指示のことを「プログラム」といい、「プログラムを書く」ことを「プログラミング」というのです。

「プログラミング」というと難しく感じる人も多いかもしれませんが、使用するのはプログラミング「言語」というくらいなのでルールがあります。ルールを覚えてしまえば、日本語のように読み書きが出来るので難しく考える必要はありません。

ところで、プログラミング言語は何種類くらい存在するのかご存じですか?

この記事でも紹介するJavaを含め、マイナーな言語も含めると約200種類以上と言われています。
しかし、これらすべてを日々の業務で使うかというとそんなことはありません。
言語によって実現しやすい機能や、実現しにくい機能があります。
詳しいことは調べてみてください。
ここではJavaの基礎を説明します。

2.プログラミング基礎知識

2-1.プログラムの流れ

プログラミングが、【プログラムというコンピュータに指示を出すための指示】を書くことだと言うことが理解できたところで、プログラムを書いてから実行されるまでの流れを見ていきましょう。
プログラムはコンパイルしてから実行します。
(しかし、初心者にはコンパイルも実行もよく分からないと思います。日常で使わない言葉だし・・・
そこで、イメージしやすくするために
入力(プログラミング)→加工(コンパイル)→出力(実行)
という言葉で考えるとわかりやすいかもしれません。)

mainメソッド内にコードを入力してコンパイル(コンピュータが分かる言葉に加工)、そしてコンソールに出力。
書いたものがどのように出力されるかの流れを言いながら実行すると良いでしょう。
コンソールの場所の説明も忘れずに(ここに表示されますよ~的なこと)

Sample.java
packagesample;publicclassSample{publicstaticvoidmain(String[]args){System.out.println("Hello World!!");}}
出力内容
Hello World!!

※実際に実践してもらうときに注意すること

「Hello World!!」が出力できたら、自分の名前をコンソールに出力するプログラムを書いてもらいましょう。
その際に結構多いのが、System.out.println内の「Hello World!!」を書き変えるのではなく、packageから全部消してすべて書き直す人が多いのでSystem.out.println内だけを変えてもらうように注意しましょう。
また、全角のまま書いてエラーになっちゃう人が結構多いので教えてあげてください。
"とか{の出し方知らない人とかもいるので優しくしてあげてください。

2-2.変数

(初心者が一番引っかかりやすいのが変数なのではないでしょうか)
変数は一言で言うと【値を入れておく(格納しておく)箱】のことです。
Javaにおいては変数に型が決まっており、決められた型の値しか格納することができません。
ここでは数値と文字列について簡単に説明します。
intとStringという型についてです。
この型というのはデータ型といい、値がどんな型なのかがわかるようになっています。
intが数値、Stringが文字列を表します。

・int

ここでいう数値とは整数のことで、小数は含みません。
【1】や【10】や【100000】などです。
(小数は小数でほかのデータ型が存在しますがここでは割愛します。
また数値の中でも格納できる桁数によって使用するデータ型が決まっているのですがややこしくなるのでここでは割愛します。)
int型には数値のみを格納することができ、数値同士は計算することができます。

・String

Stringには文字列を格納できます。
文字列とは【"あ"】や【"あいうえお"】【"こんにちは"】などの数値以外の文字のことです。
ですが実は数値も格納できます。【"1"】や【"10"】など。
しかしStringの中に数値をしまってしまうと、intのように計算ができなくなります。→文字列としての数値。(つかいかたで説明)

・つかいかた

つかいかた
【使用するデータ型】 【変数名】 = 【格納する値】;
intでの計算
intnum1=10;intnum2=15;// 式通りに計算されるnum1+num2=25
Stringでの計算
Stringnum1="10";Stringnum2="15"// 文字同士がつながって表示されるnum1+num2="1015"

2-3.簡単な構文(ifやforなど)

変数が理解できたら、簡単な構文について説明しましょう。
イメージが大事なので身の回りにあるものを例にして説明してあげると良いでしょう。
例えば条件分岐なら
コンビニでお酒やたばこを購入するときの年齢確認の「20歳以上ですか?はいorいいえ」などを説明の例にして実際に書いてもらう、など。

if (条件分岐)

基本的な書き方
・if (もし○○なら△△する)

if (条件1(○○)) {
条件1(○○)が満たされていたら実行する処理(△△)
}

・else (もし○○なら△△、それ以外なら□□する)

if (条件1(○○)) {
条件1(○○)が満たされていたら実行する処理(△△)
} else {
条件1が満たされなかったら実行する処理(□□)
}

・else if (もし○○なら△△、●●なら▲▲、それ以外なら□□する)

if (条件1(○○)) {
条件1(○○)が満たされていたら実行する処理(△△)
} else if (条件2(●●)) {
条件1(○○)は満たされていないが
条件2(●●)は満たしていたら実行する処理(▲▲)
} else {
条件1(○○)と条件2(●●)が満たされなかったら実行する処理(□□)
}

※条件には算術演算子・比較演算子・条件演算子が使用できることを説明しましょう。
等しいか比較するときは「==」を使用する、など

if練習問題
※まずは簡単なプログラムを書いてもらい、動かす感覚を試してもらうことが大事だと思います。 変数ageの中身も各自で変更してもらい、100以外だとコンソールに出力されないことを確認してもらうと条件式の意味が分かりやすい。// if// 年齢が100歳の場合、「1世紀生きています」と出力する。// 変数 int age を使用すること// 解答intage=100;if(age==100){System.out.println("1世紀生きています。");}// else// 年齢が20歳以上の場合「お酒が飲めます」、そうでない場合「お酒が飲めません」と出力する// 変数int age を使用することintage=20;if(age>=20){System.out.println("お酒が飲めます");}else{System.out.println("お酒が飲めません");}// ※ここもageの中身をいくつか変えて、出力内容の変化を試してもらう。// else if// テストの点数が80点以上の人は「優」60点以上の人は「可」60点未満の人は不可と出力してください// 変数int score を使用すること(scoreは0~100のみが入ることとする)intscore=80;if(score>=80){System.out.println("優");}elseif(score>=60){System.out.println("可");}else{System.out.println("不可");}// ※ここもageの中身をいくつか変えて、出力内容の変化を試してもらう。

for (繰り返し処理)

繰り返し処理の場合
「自分の名前をコンソールに5回出力するときはどのように書けばいいでしょうか?」
などと問いかけるとだいたいの方は

5回出力
System.out.println("自分の名前");System.out.println("自分の名前");System.out.println("自分の名前");System.out.println("自分の名前");System.out.println("自分の名前");

と実装してくれます。
5回くらいなら楽に書けますが、100回出力してくださいとかになるとさすがにめんどくさいですよね。。。このような場合に繰り返し処理が利用できます。
という感じで進めます。

・for構文

for (【初期値】;【繰り返し条件式】;【継続処理】;) {
// 繰り返し条件式が「true」の場合に行う処理内容
}

練習問題
// 自分の名前を5回出力してみましょうfor(inti=1;i<=5;i++){System.out.println("山田太郎");}

forの中は「i」が「5」以下の場合に処理が実行されます。
「i」は1回の処理が終わるごとに「++」。すなわち1ずつ増加します。
わかりやすく処理を追ってみると

1回目
// iは1なので「山田太郎」が出力される。for(1<=5){System.out.println("山田太郎");}// 出力結果:山田太郎
2回目
// i++でiは2なので「山田太郎」が出力される。for(2<=5){System.out.println("山田太郎");}// 出力結果:山田太郎
3回目
// i++でiは3なので「山田太郎」が出力される。for(3<=5){System.out.println("山田太郎");}// 出力結果:山田太郎
4回目
// i++でiは4なので「山田太郎」が出力される。for(4<=5){System.out.println("山田太郎");}// 出力結果:山田太郎
5回目
// i++でiは5なので「山田太郎」が出力される。for(5<=5){System.out.println("山田太郎");}// 出力結果:山田太郎
6回目
// i++でiは6なので「自分の名前」は出力されない。for(6<=5){System.out.println("山田太郎");}// 出力結果:出力なし

ざっくりこんな感じで説明して、プログラミングって思ったより簡単で楽しい!から入ることが出れば吸収しやすくなると思います。

最後にロジックの練習問題をパズル感覚でやってあげるととっかかりやすくなると思うので、有名な問題だけ書いておきます。

fizzbuzz
// 1~100まで順番に出力しながら// 3で割り切れる場合は「fizz」を// 5で割り切れる場合は「buzz」を// 3と5両方で割り切れる場合は「fizzbuzz」と出力してください// 例) 1,2,fizz,4,buzz,fizz,...,14,fizzbuzz,16,......,98,fizz,buzz// 解答publicclassSample{publicstaticvoidmain(String[]args){for(inti=1;i<=100;i++){if(i%3==0&&i%5==0){System.out.println("fizzbuzz");}elseif(i%3==0){System.out.println("fizz");}elseif(i%5==0){System.out.println("buzz");}else{System.out.println(i);}}}}

さいごに

苦手意識を持たせないように優しく教えてあげましょう!

読んでいただいてありがとうございました^^
ここ変だよとかこんな風に教えるとより良いよ!などあれば教えてください!
マークダウンの書き方とかでのアドバイスもうれしいです!

IPアドレスを理解したい

$
0
0

最近、AWSの勉強を始めたものの、、、な感じなので、基礎知識から身につけていきます。
千里の道も一歩から。:writing_hand:

IPアドレスとは

ネットワークに繋がれているコンピュータやネットワーク機器に割り振られる、一意の番号のこと。インターネット上の住所ともいえるよ。

IPアドレスは大きく2種類あります。

パブリックIPアドレス(グローバルIPアドレス)

  • インターネットに接続するときにつかうIPアドレスのこと
  • ICANN(Internet Corporation for Assigned Names and Numbers)という団体が管理している
  • :writing_hand:AWSでは「パブリックIPアドレス」という名称がつかわれているよ

プライベートIPアドレス

  • インターネットで使われないIPアドレスのこと
  • だれも管理してないから、自由に使っていい
  • 例えば、社内LANを構築する時に使ったり、個人の学習用として使える
  • だいたいは、10, 172, 192 のどれかからはじまる

実際にはどんなもの?

実体はこういう感じ↓

10000010100110000011000010010000

……分かりにくすぎる!

そこで、
IPv4では、1バイトずつピリオドで区切って10進数で表してます。
 こんな感じ→ 219.101.198.4
IPv6では、2バイトずつコロンで区切って16進数で表記してます。
 こんな感じ→ 2001:0db8:0000:0000:0000:0000:dead:beaf

:warning:例にあげたv4とv6のIPアドレスに互換性はないです!!

IPアドレスの範囲の表記

実際にネットワークを構築する時には、使用するIPアドレスの範囲を決めます。
”使用するIPアドレス”とは、インターネット接続してくる機器たちに割り当てるIPアドレスのことを指します。
インターネット接続してくる機器たちとは、具体的にいうとコンピューターやルータなどです。
これらを総称して、ホストといいます。
ホストに割り当てる(=使用する)IPアドレスの範囲の表記法についてです。

範囲の決め方

ホストに割り当てる(=使用する)IPアドレスの範囲は、2のn乗で区切るきまりがあります。
よく使う区切りは、256個か65536個です。
理由は、IPアドレスの4つの区切り(IPv4の話)の、
 1番右側(0〜255) → 256個
 右側2つ(0〜65535) → 65536個
が使えるから。意外と単純な理由ですね。

表記法

「192.168.1.0~192.168.1.255」や「192.168.0.0~192.168.255.255」といちいち表記するのは冗長で嫌だ!
先頭からいくつ分のIPアドレスの範囲を示しているか、を表す楽な方法ないかな、、、とみんな思ってました。
そこで、2つの表記法ができました。

CIDR表記(Classless Inter-Domain Routing)

CIDRの読み方は、サイダーです。
ネットワーク部のビット長を「xxx.xxx.xx.xx /ビット長」という風に、おしりに付け足す表記。
 256個 → 192.168.1.0/24
 65536個 → 192.168.0.0/16

ちなみに、ビット長のことを「プレフィックス」といいます。
:writing_hand: Amazon VPCの仕様では、CIDR表記を採用しており、プレフィックス長は16以上を指定することになっています。
CIDR表記のIPアドレス範囲のことを「CIDRブロック」といいます。

サブネットマスク表記

(2進数で)ネットワーク部を全て1、ホスト部を全て0で表す表記法です。
10進数にすると255か0しかないので、「ネットワーク部は255だなぁ、自由に使えるホスト部は0だなぁ」と思えばOKかと。
 256個 → 192.168.1.0/255.255.255.0
 65536個 → 192.168.0.0/255.255.0.0

参考

・玉川憲、片山暁雄、今井雄太 著「Amazon Web Services 基礎からのネットワーク&サーバー構築」

【#PowerApps アプリ】予定の候補日メーカー 作り方

$
0
0

2019年12月7日に開催された Power Platform Day Winter '19、通称「パワープラットフォーム祭り19 冬の陣」。そこで登壇した際にデモで紹介した「予定の候補日メーカー」の作り方を公開します。

イベントのまとめ等を読み返してて「アレ欲しい」と言われていたのを(今さら)思い出した、なんて、貴方と当方のナイショですからねw

なお、登壇資料は下記で参照可能です。

IT企業のジャーマネ視点から Power Apps 導入など

動作イメージ

メディア1.gif
Office 365(Exchange Online = ExO)の予定表から、既に存在する予定を表示する「カレンダー」Screen を流用して、日付と時間帯を選択できるようにしたダケです。
右側の「時間帯(例 9:00 ~)」を30分置きぐらいで表示して、クリックした時間帯で「この時間なら調整可能だよ」っていう候補を作成する、ただソレだけのアプリです。

諸注意

アプリの制約として、下記はできません。実現されたい方はご自分で改造ください。

  • 自分の予定と他人の予定をあわせて確認する
  • 選択した候補の一部分だけを修正(取り消しなど)する
    • → 基本的にゼロクリアして再指定が必要
  • 先約があっても、候補日は指定可能
  • クリップボードに直接渡せない(Power Apps 現状の仕様)

ネタバレ(?)

このアプリを作成しようと思ったキッカケは、こちら。

以下の日程でご都合いかがでしょうかメーカー

随分以前のコトで、具体的なタイミングは失念してしまったのですが、SNSで「このサービスが便利!」って取り上げられたコトがありました。その際「当方はExOを普段から利用しているから、自分の予定を確認しつつ、調整可能な時間の候補が作れたら超便利なんじゃあないか!?」と思ったのです。
ExOの予定を確認して云々する便利なアプリが欲しい? → Power Apps があるじゃないか → 作ってみた、ですね、えぇ。おそらく、初品は10分前後で作ったんじゃないかなー、です。

作り方

とても簡単なんですが、初学者向けになるべくStep by Stepで記載していきます。

1. キャンバスアプリ新規作成でカレンダーScreenを追加

キャンバスアプリ → タブレットレイアウトで新規作成 → 「新しい画面」押下 → [カレンダー]選択でカレンダーScreenを追加します。
なお、もともと存在している[Screen1]は今回利用しません。削除しておいてください。
図1.png
画面を横向きで広く使いたいのでタブレットレイアウトを指定しています。携帯電話レイアウトを選択すると、カレンダーScreenが縦方向になるので意図したカタチになりません。ご注意ください。

2. 画面の右側にスペースを作る その1

追加するコントロールを置く場所を作ります。画面中央より右側を占有している下記2つのコントロールを選択し、左方向にドラッグしてズらします。ズらす距離は各位、適宜よろしい感じでOKです。

■ズらす対象コントロール
 - iconEmptyState1
 - LblNoEvents1
 
図2.png
なお、1度でもアプリを実行してしまうと上記2つのコントロールが別の表示内容・表示状態に変更される可能性があります。この処理はテスト実行やAltキー押下による操作を実施する前に対応してください。

3. 画面の右側にスペースを作る その2

ExOの予定表に存在する予定一覧を表示する Gallery コントロールも画面右端まで占有しています。そちらも上記と同様に右側に追加コントロールが配置できるようにスペースを作ります。

まず、テスト実行をするか、Altキーを押下しながらカレンダーをドロップダウンで選択します。しばらくすると、予定表の結果が画面上の各コントロールへ反映されるハズです。左端のカレンダーで、予定がある日付(●がついてる日にち)を選択しておいてください。

図3.png

[CalendarEventsGallery1]コントロールを選択すると、横幅(Width)が変更可能になります。下イメージのように、コントロール右端の〇を選択してドラッグすると横幅が縮小できますので、こちらも前述同様にスペースを作ってください。

図4.png

4. 境界線をおく

この手順、無くてもいいんですけどねw

既存コントロールの位置や横幅を変更して右側のスペースが作られました。その境界を明確にしたいので[RectCalendarSeparator1]をコピー&ペースト → 右側のスペース作ったトコの境界へ移動させます。

図5.png

5. 候補時間を選択する Gallery コントロール追加する

作成した右側のスペースにコントロールを追加してきます。まずは候補時間を選択させるギャラリーコントロールです。

挿入メニューから[ギャラリー]→[縦方向(空)]を選択して、Galleryコントロールを追加。その後、右側のスペースへ移動させます。その後、ギャラリーにラベルコントロールを追加して中央表示にする等、お好みの設定を実施してください。

図6.png
位置が決まってラベルコントロールを追加したら[Items]プロパティに候補の時間を設定します。例えば、9時から18時までの間、30分おきの候補が欲しい場合は下記になります。

Gallery.Items
[
    "09:00 ~ ",
    "09:30 ~ ",
    "10:00 ~ ",
    "10:30 ~ ",
    "11:00 ~ ",
    "11:30 ~ ",
    "12:00 ~ ",
    "12:30 ~ ",
    "13:00 ~ ",
    "13:30 ~ ",
    "14:00 ~ ",
    "14:30 ~ ",
    "15:00 ~ ",
    "15:30 ~ ",
    "16:00 ~ ",
    "16:30 ~ ",
    "17:00 ~ ",
    "17:30 ~ ",
    "18:00 ~ "
]

上記は15分間隔にする場合や、開始・終了時刻を変更した場合等は適宜改造してください。

6. 選択した時間帯で候補を作る

追加したギャラリーでクリックした時間帯から、例えば”3/22(日) 9:00 ~ 12:00”のような文字列を生成している箇所を設定します。「Gallery」内の「Label」コントロールを選択し[OnSelect]に下記を設定してください。

Gallery内のLabel.OnSelect
If(
    isSelecting,
    UpdateContext(
        {
            SelectedTxt: Concatenate(
                SelectedTxt,
                Substitute(ThisItem.Value," ~",""),
                Char(13) & Char(10)
            ),
            isSelecting: false
        }
    ),
    UpdateContext(
        {
            SelectedTxt: Concatenate(
                SelectedTxt,
                Substitute(
                    Text(
                        _dateSelected,
                        "[$-ja-JP]mm/dd(ddd)"
                    ),
                    "曜日",
                    ""
                ),
                " ",
                ThisItem.Value,
                " "
            ),
            isSelecting: true
        }
    )
)

そんなに難しいコトはしていないと思いますので、詳細な説明は実施しません。是非、皆さん解析してください。なお、曜日に関しては当方が以前ネタにしておりますので、下記を参照ください。

[PowerApps Tip's]曜日に関する注意点と文字列置換

7. 選択された結果を表示する TextInput コントロールを追加する

[SelectedTxt]変数に候補の日時が文字列として格納されているハズなので、それを表示する領域を準備します。

挿入メニューから[テキスト]→[テキスト入力]を選択して追加してください。そして、右側のスペースへ移動させます。

移動させたら[Mode]プロパティの値を”TextMode.MultiLine”へ変更します。また[Default]プロパティの値を“SelectedTxt”にしてください。これで、選択した候補が表示されるハズです。

図7.png

冒頭でも説明していますが、記事投稿時点でPower Apps ではクリップボードへ値を渡すことができません。そのため、候補日に関してはテキスト入力を利用してコピーできるようにしています。

8. リセットボタンを作る(おまけ?)

TextInput コントロールですが、MultiLine を有効にするとクリアボタンをオン([Clear] ⁼ true)にしてもリセットする×ボタンが表示されません。そのため、リセットボタンを作成します。

操作メニューから[ボタン]を選択して追加してください。表示内容などはお好みでどうぞ。指定する処理は下記になります。

Button.OnSelect
UpdateContext({isSelecting:false, SelectedTxt:Blank()})

図8.png

まとめ

  • Power Apps の「カレンダー」Screen は貴重な情報が大量にある
  • 既存で追加可能な Screen を改造すれば色々便利なアプリが作れる(カモ?
  • Power Apps はクリップボードへの値渡しが現状できない
    • →何らかのアイディアで回避する必要がある

慣れている方であれば、30分もかからずにアプリが作成できると思います。このアプリ、スマートフォンでも利用可能なので、突然の打ち合わせ調整依頼などが発生した際に、スマホのPower Appsアプリで候補作成 → コピペしてメールに貼り付けて返信、なんてコトも実現可能になります。チョッとしたコトなんですが、こういう「鋭くて便利なツール」があると生産性がUpします。日常のチョッとした課題を解決できるアプリが、ホントに簡単な手順で作成可能な Power Apps 素敵ですね。

それでは、皆さま、素晴らしい Power Platform Life を!

scikit-learnでirisなどの付属データセットではなく、独自データやインターネット上の外部データを読み込む方法

$
0
0

 書籍やネット上のscikit-learn教材には、irisやcancer等の付属データセットを使った解説が多いです。もちろん手軽で 同じ結果が得られる安心感もある一方、予定調和的で 深い学びが得にくいと感じる方も多いのではないかと思います。
 この記事では、自作データやネット上にある外部データを読み込んで、scikit-learnで分析する方法をご紹介します。
(検証環境:Windows10, Anaconda3, Python3.7.6, Jupyter Notebook6.0.3)

 CSVファイルの準備

 この記事では、例として機械学習・データサイエンス コミニティーである Kaggleが公開しているデータ World Happiness Report←リンク を使います。機械学習に使いやすいデータセットが揃っているので、ユーザー登録が必要ですが Kaggleを選択しました。
 Download (79 KB)というボタンからダウンロードして下さい。zipファイルを解凍すると 5つのCSVファイルが見つかりますが、ここでは 2019.csv を使います。

他のファイルを使う場合

  • 2019.csv はPythonデータ分析ライブラリである pandasで読み込み易いような「一行目に特徴量の名前、二行目以降にデータ」という配置になっています。そうでないデータは、エクセルの行削除などで成型して下さい。

  • エクセルファイル(.xls) など形式が違う場合は、読み込んだ後「ファイル-別名で保存」を行い、CSVファイル形式を選択します。区切り文字が選択可能な場合は ,(カンマ)にしておきます。

  • 保存場所はPythonの実行ファイル(pyやipynbファイル)があるフォルダにしておくと楽です。

 CSVファイルの読み込み

 ライブラリを使わずに 直接読み込む方法もありますが、以降の作業を楽にするため、この記事では pandasを使った方法を紹介します。
 pandasがまだインストールされていない場合は、この記事等を参考に行って下さい。

import pandas as pd
df = pd.read_csv('2019.csv')

 区切り文字がタブの場合は引数sep='\t'を、日本語が入っている場合は引数encoding='shift_jis'を加えます
df = pd.read_csv('ファイル名.csv', sep='\t', encoding='shift_jis')

 実行ファイルと別の場所にデータファイルを置く場合は df=pd.read_csv('data/2019.csv')と相対パスを加えるなどします。参考→Python, pathlibで絶対パスと相対パスを相互変換・判定

 特徴量名とデータ数の確認

print("データセットのキー(特徴量名)の確認==>:\n", df.keys())
print('dataframeの行数・列数の確認==>\n', df.shape)

上記のコマンドを実行すると、

データセットのキー(特徴量名)の確認==>:
 Index(['Overall rank', 'Country or region', 'Score', 'GDP per capita',
       'Social support', 'Healthy life expectancy',
       'Freedom to make life choices', 'Generosity',
       'Perceptions of corruption'],
      dtype='object')
dataframeの行数・列数の確認==>
 (156, 9)

と9つの特徴量があるサンプル数156のデータが読み込めたことが確認できます。

 欠損値等の処理をする

 データ中に欠損値(Null)が無いか、またデータ型を確認し、整数値のみ(int)/小数を含む数値(float)/文字列または文字列と数値の混在(object)なのかを見ます。

# dataframe各列の欠損値でないデータ数、データ型を確認
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 156 entries, 0 to 155
Data columns (total 9 columns):
 #   Column                        Non-Null Count  Dtype  
---  ------                        --------------  -----  
 0   Overall rank                  156 non-null    int64  
 1   Country or region             156 non-null    object 
 2   Score                         156 non-null    float64
 3   GDP per capita                156 non-null    float64
 4   Social support                156 non-null    float64
 5   Healthy life expectancy       156 non-null    float64
 6   Freedom to make life choices  156 non-null    float64
 7   Generosity                    156 non-null    float64
 8   Perceptions of corruption     156 non-null    float64
dtypes: float64(7), int64(1), object(1)
memory usage: 11.1+ KB

 Nullでは無いデータが156個⇒欠損値なし と確認できます。
 Overall rankは整数、Country or regionは文字列、それ以外は小数を含む数値 と意図通りのデータ型になっています。
 数値が入っているはずの列が objectになってしまっている場合は、

# 数値ではない型の要素の抽出
objectlist = df[['特徴量名を入れる']][df['特徴量名を入れる'].apply(lambda s:pd.to_numeric(s, errors='coerce')).isnull()]
objectlist

↑ を実行すると、文字列扱いになっているデータが抽出できます。

 このデータに文字列と数値の混在や欠損値はありませんでしたが、他データには様々な理由で、「空欄」「ゼロを意味する"0"以外の文字・記号」「単位付きの数字」等 そのままでは分析に不適当な値が入っていることがよくあります。

こちらの記事等を参考に、適切な処理をして下さい。

 Scikit-learn用のデータクラスを持つオブジェクト(空のデータセット)を作る

import sklearn
worldhappiness = sklearn.utils.Bunch()

worldhappinessの部分はデータセット名を表すよう、適宜変えて下さい。

 データセットにデータを入れていく

# 'Score'(幸福スコア)を目的変数'target'とする
worldhappiness['target'] = df['Score']
# 説明変数を'data'に入れる
worldhappiness['data'] = df.loc[:, ['GDP per capita',
       'Social support', 'Healthy life expectancy',
       'Freedom to make life choices', 'Generosity',
       'Perceptions of corruption']]

↑ 最初の3列以外の6列を指定します。「特徴量名の確認」で出力したデータをコピペすると楽です。

# 特徴量の名前も入れておくと、グラフの凡例等に使えます(無くても可)
worldhappiness['feature_names'] = ['GDP per capita',
       'Social support', 'Healthy life expectancy',
       'Freedom to make life choices', 'Generosity',
       'Perceptions of corruption']

 訓練セットとテストセットに分割

# 訓練セットとテストセットに分割
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(
    worldhappiness['data'], worldhappiness['target'], random_state=0)
print("X_train shape:", X_train.shape)
print("X_test shape:", X_test.shape)

 結び

 これで機械分析に進めると思います。間違い指摘・質問等ございましたら、お気軽にコメント下さい。

HTML,CSSでのwebサイト制作の手順とポイント

$
0
0

はじめに

本記事は

「progateやドットインストールなどでhtml、cssの文法的なインプットはしたが、いざwebサイトを作成する場合にどの手順を踏めば良いのか??」

という人を初学者を対象にhtml、cssを使ってwebサイトを作る際の手順と、その際に念頭におくべき事をまとめたものです。

拙い内容だとは思いますが、参考になれば幸いです!

※本記事はデザインが既にできている場合の手順になります。
①~③の過程は実際にデザインツールか紙を使って書く事を強くお勧めします!!

① デザインの全ての要素を隙間のない□で埋める!

ポイント

・全てを□で隙間なく埋め切る事が重要!

例 赤線にて区切り

スクリーンショット 2020-03-23 12.13.56.png

スクリーンショット 2020-03-23 12.18.59.png

② ①で区切った□をさらに1つ1つを細かいパーツに分ける

②-1 まずは大きなパーツから分けていく(青線)

スクリーンショット 2020-03-23 12.27.01.png

②-2 大きなパーツの中を更に細分化できる所まで分けていく(緑線)

スクリーンショット 2020-03-23 12.34.38.png

ポイント

・大きな□の中に小さな□が敷き詰められている状態になる
・この□の1つ1つがdiv要素であると考える!!(正確にはdiv以外のタグも使うが、、)

③ □の1つ1つに名前(class名)を付ける!!

③-1 赤線で囲った□に名前をつける

スクリーンショット 2020-03-23 12.58.25.png

③-2 青線で区切った□に名前をつける

スクリーンショット 2020-03-23 13.02.44.png

③-3 緑で区切った□に名前をつける

スクリーンショット 2020-03-23 13.07.09.png

ポイント

・大きい部分から名前をつけていく(赤線→青線→緑線)
・名前は基本的に重複なく付ける
・全く同じパーツを複数回使うときは、同じ名前をつける
・名前の付け方(命名規則)はプロジェクト単位で行う→1人でのプロジェクトでないなら、名前を付けた段階でレビューを入れると良い!!

参考用:代表的な命名規則について

https://webdesign-trends.net/entry/9214

④ htmlで□をネスト構造(入れ子構造)で書いていく

例:上記のbody1部分

<divclass="body1">//赤線
    <divclass="contents">//青線
      //緑線 <divclass="img"><imgsrc=""alt=""></div>緑線//
      //緑線 <divclass="text"><p>説明文説明文</p></div>緑線//
     </div>青線//
    <divclass="contents">//青線
      //緑線 <divclass="img"><imgsrc=""alt=""></div>緑線//
      //緑線 <divclass="text"><p>説明文説明文</p></div>緑線//
     </div>青線//
    <divclass="contents">//青線
      //緑線 <divclass="img"><imgsrc=""alt=""></div>緑線//
      //緑線 <divclass="text"><p>説明文説明文</p></div>緑線//
     </div>青線//
</div>//赤線

セマンティクスwebについて

セマンティクスwebはモダンなhtmlの書き方として、html5から導入された「より要素の内容に沿ったhtmlタグ使おうとする考え方」です!!
構造の綺麗なhtmlを書く事ができ、SEOなどの対策になります!!

先ほどのhtmlは分かりやすさ重視の為に、全ての要素をdivタグで囲いましたが、セマンティクスwebを導入するとdivの代わりに様々なhtmlタグを使用していく事になります。

<mainclass="body1">//赤線
    <articleclass="contents">//青線
      //緑線 <divclass="img"><imgsrc=""alt=""></div>緑線//
      //緑線 <divclass="text"><p>説明文説明文</p></div>緑線//
     </article>青線//
    <articleclass="contents">//青線
      //緑線 <divclass="img"><imgsrc=""alt=""></div>緑線//
      //緑線 <divclass="text"><p>説明文説明文</p></div>緑線//
     </article>青線//
    <articleclass="contents">//青線
      //緑線 <divclass="img"><imgsrc=""alt=""></div>緑線//
      //緑線 <divclass="text"><p>説明文説明文</p></div>緑線//
     </article>青線//
</main>//赤線

htmlを書く際はセマンティクスwebを意識してhtmlタグを工夫すると良いでしょう!!

参考用:セマンティクスwebについての詳細

https://developer.mozilla.org/ja/docs/Glossary/Semantics

ポイント

・「赤線の要素→青線の要素→緑線の要素」が入れ子になるようにhtmlを書く
・htmlをまず書き出して、必要としている要素が全て出力されているかブラウザで確かめる

⑤ cssにてデザインを整える

htmlでブラウザ上に各要素は出力されているので、cssでデザインに沿ってよしなにスタイリングして下さい。

まとめ

この手順は、「とにかくブラウザ上で成果物が目で見える状態にする。その上で細かいスタイリングを行なっていく!」という考え方に基いたものです。

こうする事で第三者に対して、早い段階から成果物の進捗を共有しやすくなったり、cssなどの挙動をブラウザでいちいち確認できるといった恩恵が受けられます。

Rubyの基本的なメソッドと参照について学んだこと

$
0
0

目次

  • Rubyのメソッド
  • 参照の概念
  • ライブラリ

Rubyのメソッド

Rubyには標準でいろんなメソッドがあります。
また、自分でメソッドを定義することも可能です。


メソッドに引数を設定する

スクリーンショット 2020-03-21 17.43.52.png

cry.rb
defcry(animal)ifanimal=='dog'puts'woof woof!'elsifanimal=='cat'puts'meow meow!'endendcry('dog')# -> woof woof!cry('cat')# -> meow meow!# 引数に過不足があるとエラーになる# cry -> `cry': wrong number of arguments (given 0, expected 1) (ArgumentError)

メソッドを定義する際引数を設定できます。
今回はcryというメソッド名で引数によって動物の鳴き声を出力するメソッドを定義しました。


引数にはデフォルト値をつけることも可能

スクリーンショット 2020-03-21 17.37.23.png

cry.rb
defcry(animal: 'cat')ifanimal=='dog'puts'woof woof!'elsifanimal=='cat'puts'meow meow!'endendcry(animal: 'dog')# -> woof woof!# 引数がない場合でもエラーにならない!cry# -> meow meow!

通常引数は呼び出し側(実引数)とメソッド定義側(仮引数)で数が一致している必要があります。
ですが、メソッド定義側でデフォルト値を設定することが可能です。
今回はcryというメソッド名で引数によって動物の鳴き声を出力するメソッドに
引数が存在しない場合はデフォルト値をcatとして定義しました。


標準出力で使われるメソッド

puts 'Hello World'
Hello World
=> nil

print 'Hello World'
Hello World=> nil

p 'Hello World'
"Hello World"
=> "Hello World"

メソッドを定義してターミナルに出力確認をする際今回の記事ではputsメソッドを使用していますが他にもターミナルに出力できるメソッドがあります。
irbを使用して確認して見た結果

puts
引数のオブジェクトをto_sメソッドで文字列に変換し、改行を加えて出力する。
戻り値: nil

print
引数のオブジェクトをto_sメソッドで文字列に変換し、改行ををせず出力する。
戻り値: nil

p
引数のオブジェクトをinspectメソッドで文字列に変換し、改行ををせず出力する。
戻り値: 文字列


真偽値を返すメソッド

スクリーンショット 2020-03-21 18.04.40.png

boolean.rb
# ?で終わるメソッドを自作する場合defwhat_name?(name)name=='bob'endpwhat_name?('tom')# -> falsepwhat_name?('bob')# -> true

真偽値を返すメソッドとしてメソッド名の終わりに?をつけたメソッドがあります。
"".empty?"Hello World".include?(Hello)など

自作する場合でもメソッド名に?をつけたほうが戻り値がわかりやすくなります。


エイリアスメソッド

スクリーンショット 2020-03-21 18.18.57.png

alias.rb
# メソッドを定義するdefhelloputs'Hello World!'end# aliasを設定するaliasgreetinghello# 元のメソッド名でも呼び出せ、aliasで設定した別名でも同様に呼び出すことができるhello# -> Hello World!greeting# -> Hello World!

Rubyにはメソッドに複数の名前をついている場合、自分で任意の名前
で定義することができます。
今回はhelloメソッドの名前をgreetingと別名で定義しました。


Rubyの戻り値

expression.rb
defexpressionhello='Hello World'end# retern分を記載しなくても最後に評価された式が戻り値として取得できるpexpression# -> Hello World
expression.js
functionexpression(){lethello="Hello World"// return hello}// return文を記載しなければ戻り値を取得できないconsole.log(expression())// -> undefinedfunctionexpression(){lethello="Hello World"returnhello}// return文を記載すれば戻り値を取得できるconsole.log(expression())// -> Hello World

Rubyのメソッドではreturnを記載しない場合、
最後に評価されたものが戻り値になります。
これは他の言語と少し違います。
試しにrubyでreturnを記載しないで定義したメソッドと
javascriptでreturnを記載しないで定義したメソッドを比較してみます。


擬似変数

pseudo_variable.rb
ptrue# -> truepself# -> mainp__FILE__# -> ファイル名p__LINE__# -> 行番号p__ENCODING__# -> エンコーディング# 擬似変数に代入しようとすることはできない# p __ENCODING__ = 'test' # -> Can't assign to __ENCODING__

Rubyには擬似変数と呼ばれる特殊な変数が存在します。
擬似変数は値を変更することはできません。


破壊的メソッド

destroy.rb
lang='ruby'# upcaseだと呼び出した文字列自身は変化しないplang.upcase# -> RUBYplang#-> ruby#upcase!だと呼び出した文字列自身が変化するplang.upcase!# -> RUBYplang# -> RUBY

Rubyのメソッドにはオブジェクトの値そのものを変更してしまうメソッドが存在します。
今回は upcase,upcase!を使用して'ruby'という文字列を'RUBY'に変換します。
以下の出力結果を確認するとupcaseの場合、変数aの値は変化していません。
しかし、upcase!の場合変数aの値が変わっています。
このように破壊的メソッドを使用すると呼び出したオブジェクトの状態を変更することができます。


参照の概念

Rubyのメソッドが色々あるなか破壊的メソッドを用いた場合、値が書き換わりました。

実際にはRubyの変数に代入すると変数に値が格納されるわけではありません。
変数にはオブジェクトの参照情報が格納されます。


メモリ領域

 
study_night_boy.png

パソコンがしてくれる作業を僕ら人間に当てはめるとこんな感じになります。

 1. 考える脳みそ -> CPU
 
 2. 作業する机 -> メモリ
 スクリーンショット 2020-03-21 19.29.54.png

変数に値を格納した時パソコンのメモリ領域(作業する机の領域)がどうなるかというとこんなイメージになります。
スクリーンショット 2020-03-21 21.57.34.png
スクリーンショット 2020-03-21 19.54.49.png

destroy.rb
lang='ruby'# upcaseだと呼び出した文字列自身は変化しないplang.upcase# -> RUBY# upcaseした際のオブジェクト番号を確認plang.upcase.object_id# -> 70178687801560plang#-> ruby# 変数のオブジェクト番号を確認plang.object_id# -> 70178687801780# upcase!した際のオブジェクト番号を確認plang.upcase!.object_id# -> 70178687801780plang# -> RUBY# 変数のオブジェクト番号を確認plang.object_id# -> 70178687801780

ここで先ほどの破壊的メソッドについて戻ろうと思います。

upcaseupcase!でのオブジェクト番号を確認すると
upcaseではオブジェクト番号が違うため、新しくオブジェクトを生成し、そのオブジェクトの参照情報を格納しております。

upcase!ではオブジェクト番号が同一であることがわかります。
このことから変数にはオブジェクトへの参照が格納されており破壊的メソッドを使用することで、指定のオブジェクトの中身を書き換えているということがわかりました。


ガベージコレクション(GC)

スクリーンショット 2020-03-21 20.12.40.png

パソコンがいろんな処理を行う際、作業机(メモリ領域)の場所を確保していきます。
作業机(メモリ領域)が場所が減っていくとそのうちスペースがいっぱいになってしまいます。
スペースがいっぱいになると僕ら人間が効率よく作業できないのと同様にパソコンも作業スペース
(メモリ領域)が減っていくと何もできなくなり処理が重たくなったり、最悪システムが停止したりします。
このようにメモリ領域が減っていく現象をメモリリークと言います。

このような状態にならないようにRubyにはガベージコレクションという機能が備わっています。
ガベージコレクションのおかげで僕らが作業スペースの後片付け(メモリの解放)をしなくても
使用されなくなったオブジェクトを片付けてくれます。
※家事代行サービスにお願いすればプロがよしなにやってくれる感じみたいですね。


ライブラリ

スクリーンショット 2020-03-21 22.31.19.png
Rubyでは最初から便利なプログラムがたくさん用意されています。
その便利なプログラムを寄せ集めたものをライブラリと言います。


組み込みライブラリ

スクリーンショット 2020-03-21 20.34.31.png

embedded_library.rb
text='Hello World'ptext.class# -> Stringptext.methods.include?(:length)# -> trueptext.length# -> 11

人間でいうと本人の習得しているスキルのイメージです。
英語をネイティブレベルまで習得しているなら海外旅行に行って話す際、教科書を見なくても話せると思います。
※僕は英語話せませんが、、、

組み込みライブラリは Ruby 本体に組み込まれているため、わざわざ処理を実装しなくても
同様の処理をするプログラムが組み込みライブラリに存在していればそれを使用すれば良いのです。

今回は文字列の長さを取得する処理を実装するために、Stringクラスのlengthメソッドを使用しました。


標準ライブラリ

スクリーンショット 2020-03-21 21.02.55.png

スキルはまだ身についてないけど家にある本棚から書籍を使えばアプリ開発ができるのと同じように
標準ライブラリではあるものの、組み込みライブラリでないものについてはライブラリを読み込むことで使用することができます。

今回はTimeクラスに定義されているstrptimeメソッドを使用します。

standard_library.rb
require'Time'pTime.strptime('2020-03-21T01:58:30+09:00','%Y-%m-%dT%H:%M:%S%z')# -> 2020-03-21 01:58:30 +0900

gem

スクリーンショット 2020-03-21 21.20.26.png

スキルが身についていない、家の本棚にもない場合でも問題ありません。
Rubyでは偉大な先輩エンジニアの方々が外部ライブラリとして、RubyGemsにアップロードしてくれています。
僕らは使いたいgemをそこからダンロードして、自分の端末にインストールすることで使用することができます。

今回はrails 5.2.3というgemをインストールして見ました。
gem i -v 5.2.3 rails


参考

プロを目指す人のためのRuby入門 言語仕様からテスト駆動開発・デバッグ技法まで

値渡しと参照渡しの違いを理解する

Rubyにおける(オブジェクトへの参照の)値渡しを理解しようとして無知を感じた

「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典

Laravelのライブラリ「laravel-dompdf」を使ってビューの表示をPDFとして表示しよう

$
0
0

目的

  • ライブラリを使用して現在のビューとして表示しているコードをそのままPDFで表示する方法をまとめる

実施環境

  • ハードウェア環境
項目情報
OSmacOS Catalina(10.15.3)
ハードウェアMacBook Air (11-inch ,2012)
プロセッサ1.7 GHz デュアルコアIntel Core i5
メモリ8 GB 1600 MHz DDR3
グラフィックスIntel HD Graphics 4000 1536 MB
  • ソフトウェア環境
項目情報
PHP バージョン7.4.3
Laravel バージョン7.0.8

実施条件

実施方法概要

  1. コントローラの確認
  2. アクションの記載変更
  3. 確認

実施方法詳細

  1. コントローラの確認

    1. PDFとして表示したいビューファイルが呼び出されているコントローラファイルを表示する。

      <?phpnamespaceApp\Http\Controllers;useIlluminate\Http\Request;
    2. use Illuminate\Http\Request;の下に下記の内容を記載する。

      usePDF;
    3. コントローラファイルの設定部分が下記の様になっていることを確認する。

      <?phpnamespaceApp\Http\Controllers;useIlluminate\Http\Request;usePDF;
  2. アクションの記載変更

    1. 先に確認したコントローラファイルのビューを表示しているアクションを確認する。

      returnview('ビューファイルディレクトリ名.ビューファイル名');
    2. 先に確認したreturn部分を下記の様に記載する。

      $pdf=PDF::loadView('ビューファイルディレクトリ名.ビューファイル名');return$pdf->stream();
  3. 確認

    1. 下記コマンドを実行してローカルサーバを起動する。

      $cd アプリ名ディレクトリ
      $php artisan serve
      
    2. 修正したアクションとリンクするURLにアクセスする。

    3. PDFで表示されればOKである。(日本語は文字化け表示されるが、現在の設定だと正常である。)


【Ruby on Rails】Railsに超入門したいと思った。

$
0
0

何故Rails

  • 人気のある言語として、ランクインしている。
  • 簡単にwebアプリが作成できる。(文法は後で覚えればいいや)
  • 日本語の資料が充実している。
  • javaとかより入りやすそう
  • そして何だか楽しそう!!!rubyという言語の名前がいい。

上記の勝手な思い込みからスタートしてみようと考えた。

Rails入門参考動画

Ruby on Rails 5入門(ドットインストール)

やりたいこと(目標)

  • 1.基本的なcrud作成 (create,show,index,delete)
  • 2.DBのselect結果を反映したセレクトボックスの作成
  • 3.入力データと登録済みデータの比較(登録済みデータが存在すれば、 エラーメッセージを出して登録させない)
  • 4.恐竜登録ツールのrails版の作成
  • 5.恐竜画像登録ツールのrails版

※下記はPHPで作成した画面の一部
rails_try1.jpg

『アルゴリズム図鑑』のアルゴリズムをPython3で実装(バブルソート編)

$
0
0

この記事について

この記事では筆者が『アルゴリズム図鑑』を読んで学んだアルゴリズムについて、Python3での実装例を紹介したいと思います。今回のアルゴリズムはバブルソートです。筆者は素人です。色々教えていただけると幸いです。

筆者はPython2のことをよく知りませんが、自分がPython3を使ってるっぽいことだけはわかっています(Python3.6.0かな?)。そのため、記事のタイトルではPython3としました。

バブルソートについて

問題設定は下記とします。アルゴリズムの説明は省略します。『アルゴリズム図鑑』を参照ください。

問題

与えられた数の列に対して、小さい数から順に並べ替えた列を返す。
例:
 4, 3, 1, 2
→ 1, 2, 3, 4

実装コードと実行結果

実装したコードを以下に示します。最初に変数dataに代入されているリストが処理対象の数の列です。

コード

bubble_sort.py
data=[4,3,1,2]print("input    :"+str(data))data_len=len(data)forkinrange(0,data_len-1):i=data_len-1while(i-1>=k):ifdata[i-1]>data[i]:temp_data=data[i-1]data[i-1]=data[i]data[i]=temp_dataelse:passi-=1print("output   :"+str(data))

実行結果

$ python bubble_sort.py
input    :[4, 3, 1, 2]
output   :[1, 2, 3, 4]

終わりに

気づいた点などあればご指摘、ご質問いただければと思います。特にコードの書き方の改善点などあれば勉強になるなと思います。

【Git】名前は可愛いしやるやん、cherry-pick

$
0
0

はじめに

現在プログラマとして働かせていただいている会社では、developブランチへのマージや開発環境へのデプロイは全て自動化されています。
しかし、developと開発時に切ったブランチをマージする際にコンフリクトが発生した場合には、仕方なく手動でマージを行います。
ここでのブランチの切り方によっては、developに存在するが、開発用に切ったブランチに存在しないファイル等があったりもします。
こうなると、マージする際に余計な差分が出てしまうことになります。(後で詳しく解説します)
つまり、差分(コミット)を選んでマージしなければなりません。
そんな時に使えるのが、今回紹介するcherry-pickです。
名前が可愛くて好きです。
しかも私が今携わっているプロジェクトではたくさん使います。
独学でgitを勉強した際には名前すら聞いたことがなかったので、復習がてら紹介します!

状況解説

ブランチの状況を解説します。
今回は、ラインログインの機能を追加したい!ということにします。

スクリーンショット 2020-03-23 20.33.24.png

masterからdevelopブランチを切り、そのdevelopブランチからdevelop_LINEブランチを切り、そのdevelop_LINEブランチを
個人の環境へpullし、feature/LINEというブランチを個人用開発ブランチとして切っています(錯乱)。

そして、developとdevelop_LINEというブランチをマージする際に余計な差分が生まれてしまうとします。
この時点でfeature/LINEの差分はdevelop_LINEへ取り込んであるとします。

状況はこんな感じです。

いざ実践

と言っても使い方は簡単です。
まず、develop_LINEブランチへ移動します。
そこで、gitのログを確認しましょう。
すると、コミットIDが出てきますね。

$ git log

commit abcdgehrkd1fhfuqwh359.....
Merge: .......
Author: .......
Date: ...........

調べ終わったらdevelopブランチへ移動します。

ここでcherry-pickの登場!

$ git cherry-pick abcdgehrkd1fhfuqwh359.....

「abcdgehrkd1fhfuqwh359.....」はさっきdevelop_LINEで調べた、developブランチへ取り込みたいコミットIDです。

これでOKです。

あとはpushして終わりです。

ちなみに

developへのpushの権限がない場合は、developブランチからdevelopへマージするようにブランチを切り、同じ操作を行えばOKです!

あと、複数コミットを取り込みたい場合は、

git cherry-pick コミット1 コミット2 ... コミットn

これでできます:cherry_blossom:

終わり

こんな感じで、特定のコミットのみを特定のブランチへ取り込みたい時にcherry-pickは使えます。

名前が可愛いので覚えてあげましょう。

ニューラルネットワークにおける最適化手法(SGDからADAMまで)を丁寧に理解しようとした

$
0
0

はじめに+雑感(機械学習/深層学習の技術進歩って早いですね)

 製造業で非システム部門で働く私にとって、ニューラルネットワークを初めとする機械学習周りの技術(≒アルゴリズム?)進歩はものすごく早いものだと感じます。日々新しいアルゴリズムが開発され、arXivといった審査がほぼ無い論文サイトに公開されます。そして、github等のプラットフォームによりすぐに(ある程度)誰でも実装することができることは、ものづくり産業である製造業と技術の進歩が全く異なります。

 私の業界で新しい装置や技術が開発されたとなれば、まずはそれを導入することで得られるメリットを見積もる必要があります。そして装置を導入する投資額に対して、得られるメリットが見合えば、稟議書を通して予算をつけてもらい、購入に移ることができます。この時点で、新しい技術が開発されてから数年必要であることはざらです

 さらに導入のためには、メーカー・システム会社さんとの詳細仕様検討、制作、出荷前の検査などがあります。また、工事の段取りや導入スケジュールを引いていざ工事となります。予算をつけてから1、2年後にようやく装置、技術が導入されます。
 
 また、基本的に導入されれば10年、20年と使っていくものが多くあるため、ものによってはWindows XPが入っているPCも普通にあります(スタンドアローンで。。)。
 
 そんな製造業とは技術導入のスピードが全く異なる機械学習、ニューラルネットワークの分野で、今回は最適化手法について私が理解した内容をまとめたいと思います。
 基本的な内容であるSGDから現在よく使用されているADAMまでをそれぞれの特徴と課題に着目してまとめました。

 今回、参考にさせて頂いたレビュー論文はこちらです。

On Empirical Comparisons of Optimizers for Deep Learning
https://arxiv.org/abs/1910.05446

 概要下記になります。
 

  • 最適化手法の概要
  • 最適化手法の変遷

最適化手法の概要

 ニューラルネットワークにおいて、モデルの精度を表す関数として損失関数があります。これは、以前の記事でもまとめましたが下記のことを示します。

損失関数は、その得られる値を最小化させることで予測精度の高いモデルへとすることができます。従って、その損失関数が小さくなるようなパラメータを探す必要があります。このとき、このパラメータの微分した値を手掛かりにパラメータを更新していきます。

https://qiita.com/Fumio-eisan/items/c4b5b7da5b5976d09504

 モデルの精度を上げるためには損失関数を最小化させることが必要であることを確認しました。このとき、最小化させる手法を最適化手法と呼んでいます。

image.png

ここで記載しているθ:重みパラメータやバイアスを変化させて、損失関数を最小化させることを考えます。

最適化手法の変遷

SGD(Stochastic Gradient Descent):確率的勾配降下法

1951年(これは古いですね)にRobbinsとMonro氏らによって発表されたアルゴリズムになります。重み$\mathbf{w}$で損失関数$E$を偏微分した値と学習率$\eta$を掛けた値を引いています。

A Stochastic Approximation Method
https://projecteuclid.org/euclid.aoms/1177729586

ここで、←の意味は、左辺(t+1番目)の値に右辺(t番目)の値を入れるという意味です。漸化式の考え方と同じですね。

\mathbf{w}^{t + 1} \gets \mathbf{w}^{t} - \eta \frac{\partial E(\mathbf{w}^{t})}{\partial \mathbf{w}^{t}}

image.png

 偏微分した値は勾配であり、+の勾配であれば引くことで最小値に向かうことがイメージできるかと思います。

 ここで$\eta$は固定値(0.01とか0.001とかを取ります)となっているため、モデルを作る人間が手動で値を決める必要があります。勾配の値で最小値に向かっていくため、損失関数によってはハンチングをしたりすることで、収束しないことがあります。
このように、手動で調整するため自動的に値が最適化されない値をハイパーパラメータと呼びます。機械学習をさせたい人間としては、この値をなるべく自動で最適化させたい!と思うのが常になります。

 次に、この式について、より早く収束に向かわせるように調整したアルゴリズムが下記になります。

Momentum

 
 1964年にPolyak氏ら(旧ソ連)で発表されたアルゴリズムです。
 先ほどの式に対して、前回の更新量($\mathbf{w}^{t}$-$\mathbf{w}^{t-1}$)を足した式になります。物理学の力学分野でいうところの慣性と同じ考え方をすることから、Momentum(慣性項)と呼ばれます。$\alpha$はこの慣性項のパラメータになります。

Some methods of speeding up the convergence of iteration methods
https://www.researchgate.net/publication/243648538_Some_methods_of_speeding_up_the_convergence_of_iteration_methods

\mathbf{w}^{t + 1} \gets \mathbf{w}^{t} - \eta \frac{\partial E(\mathbf{w}^{t})}{\partial \mathbf{w}^{t}} + \alpha(  \mathbf{w}^{t}-\mathbf{w}^{t-1})

先ほどの勾配がプラスとなる場合を考えます。$\mathbf{w}^{t}$よりも$\mathbf{w}^{t-1}$の値が大きいことから、結果として最後の慣性項は-の値となります。従って、SGDよりも早く収束に向かうことが想像できます。
 物理の力学のように物体が運動している考え方を取り入れたものになります。

しかしながら、この場合も学習率$\eta$や$\alpha$はある値を取っている定数であるため、最適化が自動で行えない課題が残っています。

従って、次はこの学習率を自動で調整してくれる仕組みを取り入れることを先人は考えました。

AdaGrad

 2011年(急に最近になりました)にJohn Duchi氏らによって発表されたアルゴリズムです。初期値として学習率$\eta_{0}$を決める必要はあります。また、最後の式自体はSGDと同じ式に見えます。
しかし、$\eta$は重みパラメータ$w$の関数となっていることが分かります。
パラメータ$\epsilon$は、無限大に発散させないように小さな正の定数を設定しています。

(PDFです)Adaptive Subgradient Methods for Online Learning and Stochastic Optimization
http://www.jmlr.org/papers/volume12/duchi11a/duchi11a.pdf

h_{0} = \epsilon\\
h_{t} = h_{t−1} + \nabla E(\mathbf{w}^{t})^{2}\\
\eta_{t} = \frac{\eta_{0}}{\sqrt{h_{t}}}\\
\mathbf{w}^{t+1} = \mathbf{w}^{t} - \eta_{t}\frac{\partial E(\mathbf{w}^{t})}{\partial \mathbf{w}^{t}}

 学習率を勾配によって変わる変数としています。勾配の2乗となっています。従って必ず正の値を取ります。その値が加算されていくため、それを分母に取る学習率は徐々に低い値を示していきます。これは、最適点に落ち着かない現象を回避してくれる効果があります。
image.png

さて、学習率が変化するようになったことで落ち着いて最適点に収束していきそうな気がします。しかしここでも課題が出てきます。学習回数(epochs)を重ねていくと、更新量が0に近づいて行ってしまうため更新がされなくなってしまいます。最適点に落ち着いていない場合はこれでは問題です。
 従って、それを解決しようとした考えが次のRMSPropになります。

参考URL
Adagradによる最適化
https://www.renom.jp/ja/notebooks/tutorial/basic_algorithm/adagrad/notebook.html

RMSProp

2012年にTijmen Tieleman氏らによって発表されたアルゴリズムです。
 先ほどの$h$についてみると、過去全部を用いるわけではなく、直近の勾配の二乗和をとるようになっています。$\alpha$は0.99などの値を指定します。すると下記$h$に関する式について、第2項の値が小さい一方で第1項の方が値が大きくなることが分かります。

 つまりAdaGradよりも$\alpha$の値を調整することで直近とそれより以前の勾配の影響どちらを考慮させたいかを適切に選んで最適化に向かわせることができます。
 

h_{t} = \alpha h_{t−1} + (1 - \alpha) \nabla E(\mathbf{w}^{t})^{2}\\
\eta_{t} = \frac{\eta_{0}}{\sqrt{h_{t}} + \epsilon}\\
\mathbf{w}^{t+1} = \mathbf{w}^{t} - \eta_{t} \nabla E(\mathbf{w}^{t})\\

 

AdaDelta

2012年にMatthew氏らによって発表されたアルゴリズムになります。(この辺りから理解に時間がかかるようになりました。。)
 先ほどのRMSPropと同じ考え方となっています。直近の勾配二乗和を使おうとしていることが分かります。
 

ADADELTA: An Adaptive Learning Rate Method
https://arxiv.org/abs/1212.5701

h_{t} = \rho h_{t−1} + (1 - \rho) \nabla E(\mathbf{w}^{t})^{2}\\
v_{t} = \frac{\sqrt{s_{t} + \epsilon}}{\sqrt{h_{t} + \epsilon}} \nabla E(\mathbf{w}^{t})\\
s_{t+1} = \rho s_{t} + (1 - \rho) v_{t}^{2}\\
\mathbf{w}^{t+1} = \mathbf{w}^{t} - v_{t}

ADAM

 そして最後に、現在多くの最適化手法として用いられているADAMについてです。これは、2015年にKingma氏らによって発表されたアルゴリズムになります。Adamとは、Adaptive(適応性のある)、Moment(運動量)、Estimation(見積)の略になります。
 考え方としては、Momentumで出てきた物理法則に準じる動きを取り入れることと、AdaGradで出てきた学習率を適宜変化させていくことを取り入れたハイブリッドなアルゴリズムになります。

Adam: A Method for Stochastic Optimization
https://arxiv.org/abs/1412.6980

m_{t+1} = \beta_{1} m_{t} + (1 - \beta_{1}) \nabla E(\mathbf{w}^{t})  ;勾配の1乗を溜め込む\\
v_{t+1} = \beta_{2} v_{t} + (1 - \beta_{2}) \nabla E(\mathbf{w}^{t})^{2}:勾配の2乗を溜め込む\\

\hat{m} = \frac{m_{t+1}}{1 - \beta_{1}^{t}}\\
\hat{v} = \frac{v_{t+1}}{1 - \beta_{2}^{t}}\\
\mathbf{w}^{t+1} = \mathbf{w}^{t} - \alpha \frac{\hat{m}}{\sqrt{\hat{v}} + \epsilon}

また、$\hat{m}$や$\hat{v}$はバイアス補正と呼ばれる値となっています。これは、ある定数によって割った値を示しています。通常、$\beta_{1}$は0.9、$\beta_{2}$は0.999を示します。
 
 AdaGradやRMSPropは学習率だけに対して調整を行うようなものをAdamは勾配の2乗平均と平均を1次モーメントと2次モーメントとして考慮することで、パラメータごとに適切なスケールで重みが更新されることを可能にしました。

現在(2020年初頭)はこのADAMをさらに高精度なものにしていくか、が最適化手法研究の流れの一部なようです。

終わりに

 今回、確率的勾配降下法(SGD)から現在よく使用されているADAMについてその考え方に重きを置いてまとめました。人間の知恵によってアルゴリズムが改善していくことが実感できました。しかし、ADAMにおいても結局ハイパーパラメータは残っており、モデルごとに適切な値を選択する必要があります。

  次回は考え方が分かりましたので、実際の関数を使ってその収束の仕方、最適化にどんな違いが表れるのか比較検証してみたいと思います。
 
 最後に、表現等に誤りや語弊がありましたらコメントを記載して頂けると幸甚です。ここまで閲覧頂きありがとうございました。

以下に参考にさせて頂いたURLを記載します。


Optimizer : 深層学習における勾配法について
https://qiita.com/tokkuman/items/1944c00415d129ca0ee9#%E3%81%BE%E3%81%A8%E3%82%81

Optimizerはどれが優れているか
https://medium.com/@akichan_f/optimizer%E3%81%AF%E3%81%A9%E3%82%8C%E3%81%8C%E5%84%AA%E3%82%8C%E3%81%A6%E3%81%84%E3%82%8B%E3%81%8B-on-empirical-comparisons-of-optimizers-for-deep-learning%E3%81%AE%E7%B4%B9%E4%BB%8B-f843179e8a8d

Optimizer入門&最新動向
https://www.slideshare.net/MotokawaTetsuya/optimizer-93979393

俺はまだ本当のAdamを理解していない
https://qiita.com/exp/items/99145796a87cc6cd47e1

勾配降下法の最適化アルゴリズム
https://www.slideshare.net/nishio/ss-66840545

Atcoder 生活 4日目

$
0
0

前回

4日目

きょうは、@drkenさんのAtCoder に登録したら次にやること ~ これだけ解けば十分闘える!過去問精選 10 問 ~で紹介されている第一問から第四問までを解こうとしました。

一問目 ABC086_A

Product

#include<bits/stdc++.h>
usingnamespacestd;intmain(){inta,b;cin>>a>>b;if(a*b%2==0)cout<<"Even"<<endl;elsecout<<"Odd"<<endl;}

二問目 ABC081_A

Placing Marbles

#include<bits/stdc++.h>
usingnamespacestd;intmain(){strings;cin>>s;intcnt=0;for(inti=0;i<3;i++){if(s[i]=='1')++cnt;}cout<<cnt<<endl;}

一問目と二問目はやっぱり簡単

三問目 ABC081_B

Shift only

#include <iostream>
usingnamespacestd;intN;intA[210];intmain(){cin>>N;for(inti=0;i<N;++i)cin>>A[i];intres=0;while(true){boolexist_odd=false;for(inti=0;i<N;++i){if(A[i]%2!=0)exist_odd=true;}if(exist_odd)break;for(inti=0;i<N;++i){A[i]/=2;}++res;}cout<<res<<endl;}

四問目 : ABC087_B

Coins

#include<bits/stdc++.h>
usingnamespacestd;intmain(){intA,B,C,X;cin>>A>>B>>C>>X;intres=0;for(inta=0;a<=A;++a){for(intb=0;b<=B;++b){for(intc=0;c<=C;++c){inttotal=500*a+100*b+50*c;if(total==X)++res;}}}cout<<res<<endl;}

三問目と、四問目は解けなかったので@drkenさんのものを写しただけですが、whileとboolの使い方をよく理解することができました。四問目はforにこんな使い方があったんだって感じでした。

B問題を自力で解けるように早くなりたいです。

Viewing all 21495 articles
Browse latest View live