初めてのOSS Contribute【First Contributions編】

https://firstcontributions.github.io/ Make your first open source contribution in 5 minutes. 君も5分でOSSコントリビューターだ!(意訳) 「OSS活動への貢献してみたいけど、まずどうすれば良いのかよくわからないな」と思って調べていた時に発見した上記のありがたいプロジェクトで、OSSコントリビュータデビューさせてもらった時の備忘録です。 OSSにPR出してみたいけどぶっつけ本番は緊張する、貢献したいOSSとかまだあんまり決まってない(けどやりたいとは思ってる)人がもしいれば、このプロジェクトの胸を借りることをお勧めします。 流れのまとめ First ContributionsのリポジトリでPRを出す流れを体験させてもらう サイトのプロジェクトリストを参考に作業するリポジトリを探す ↑のREADMEやContribute.mdなどでルールを確認(大事) 1.の要領でPRを作成、修正、マージ PRの手順 基本的にはリポジトリのREADMEに沿って進めるだけです。5分もかかりませんでした。 (様々な言語で翻訳されていて、コミュニティの大きさを感じます) 簡単な手順は以下の通り。 リポジトリをフォーク フォークしたリポジトリをクローンしてくる ブランチを作成 コードを変更してコミット Push PRを送る(githubで自分のリポジトリに行くとCompare & pull requestボタンが表示される) これで完了です! 記念すべき人生初OSSコミットがこちら 練習が終わったら本番 PRを出すまでの流れを実際に体験できたので、いよいよ他のOSSにPR出していくぞ!という流れなのですが、貢献したいコミュニティが最初から決まっている場合を除くとどこのリポジトリにどういう作業をさせてもらおうか悩む、というか目星をつけられなくて困ると思います。少なくとも私は困りました。 ですがその辺りもFirst Contributionsはカバーしてくれていて、ネクストステップとして取り組みやすいプロジェクトのリストを用意してくれています。(一番最初に貼ったURLと同じです) https://firstcontributions.github.io/ ここで自分で使っている言語や諸々で絞り込んで、気になったリポジトリのissue等を見ていくと、すぐに取り組めるタスクがあったりします。 (もしくは実際に使ってみて、気になる箇所があればissueやそれに対するPRを立てたりもできます) 私の場合は、興味があったリポジトリに誰でも取り組んで良い「ファイルごとのテストカバレッジを100%にする」issueが立っていたのでそれに着手しました。 大体のリポジトリはREADMEやContribute.mdなどに貢献の方法やルールが明記されているのでまずはそれを見て、しっかりそれらを守りつつ作業することを心がけましょう(自戒)。 記念すべき人生二度目OSSコミットがこちら 余談 OSSコントリビューションというと花形のPRに目が行きがちですが、issueでのエラー報告も立派な貢献になるみたいです。言われてみれば確かに、実装中エラーに当たった時OSSのissueにはいつもお世話になってます。 カタカナ表記の場合、リポジトリ派閥とレポジトリ派閥があることに気がつきました。IT用語辞典などでも併記されているので、完全に好みの問題みたいです。 軽い気持ちでやったFirst Contributionsさんのお試しPRでしたが、大きな声では言えないですがこれひとつでfindyさんの偏差値が結構上がりました(!)。OSSへの貢献はエンジニアのハードルの一つなのかも知れないですね。

<span title='2022-01-05 20:34:34 +0900 +0900'>1月 5, 2022</span>&nbsp;·&nbsp;Sawa

【Python】フォーマット済み文字列リテラル

目的 すごく今更&簡潔にだけど、python3.6以降で利用できる文字列フォーマットについてまとめていきます。 (ずっとstr.format()を使っていたので戒めも兼ねて)。 フォーマット済み文字列リテラルとは フォーマット済み文字列リテラル(f-string)では、文字列の先頭にfを付けることで、pythonの式を文字列内に{式}の形で埋め込むことができます。 従来の書き方よりも簡潔、かつわかりやすく記述することができる書き方です。 公式ドキュメント 使い方 変数に入った数字を3文字のカンマ区切りにする hoge = 99999999 # 従来のstr.format() print("{:,}".format(hoge)) # フォーマット済み文字列リテラル print(f"{hoge:,d}") :の後ろに整数をつけて縦を揃える tokuten = {"kokugo": 9, "sugaku": 81, "eigo": 100} for sub, point in tokuten.items(): print(f'{sub:10} ==> {point:5d}') # kokugo ==> 9 # sugaku ==> 81 # eigo ==> 100 まとめ 従来のstr.format()と比べると、f-stringは最終結果が人の目で見てもわかりやすいですね。

<span title='2021-08-02 18:52:08 +0900 +0900'>8月 2, 2021</span>

Lodashの概要と関数まとめ

lodashとは The Lodash library exported as a UMD module. (中略) …Lodash makes JavaScript easier by taking the hassle out of working with arrays, numbers, objects, strings, etc. 配列、数値、オブジェクト、文字列など、値を扱う際に便利な関数を多く提供しているJavaspriptのライブラリです。 _.getや_.eachなどがそれ。 公式ドキュメントがすごくわかりやすくていい感じです。 lodash - github 公式ドキュメント 使い方 インポート import _ from 'lodash'; 関数 _.get() _.get(object, path, [defaultValue]) objectのpathの値を取得する。値を解決できなかった場合、defaultValueを返す。 _.has() _.has(object, path) objectのpathの値が存在するかを調べる。値自体は返さない。 _.set() _.set(object, path, value) objectのpathにvalueの値をセットする。 pathが定義されていない場合は新しく作られる。 インデックスのプロパティがない場合は配列が作成され、それ以外のプロパティがない場合はオブジェクトが作成される。(?) _.each() -> forEach() _.forEach(collection, [iteratee=_.identity]) collectionの要素を反復し、各要素に対してiterateeを実行。 iterateeは3つの引数(value, index|key, collection)で呼び出される。 ※iteratee関数は明示的にfalseを返すことで反復を終わらせることができる _.flatten() _.flatten(array) arrayを一段分フラットにする。非破壊的メソッド。...

<span title='2021-07-17 11:11:15 +0900 +0900'>7月 17, 2021</span>

【AWS SAM】テンプレートでCloudWatchイベントを記述する

目的 バッチ処理もAWS Lambdaで書きたいので、SAM テンプレートに記述できるのかどうかを調べたい。 結論 できます。 し、かなりわかりやすいです。 CloudWatch イベント アプリケーションの AWS SAM テンプレート 記述例 AWSTemplateFormatVersion: "2010-09-09" Transform: AWS::Serverless-2016-10-31 Globals: Function: Timeout: 30 MemorySize: 256 Handler: app.lambda_handler Runtime: python3.7 Resources: ### Batch ### HogeBatchFunction: Type: AWS::Serverless::Function Properties: CodeUri: api/batch/hoge_batch Events: HogeBatch: # TypeをScheduleに Type: Schedule Properties: # 実行タイミングを決める Schedule: cron(0 0 ? * SUN *) 最後のSchedule式は、rateとcronのどちらでも使えます。 Rate または Cron を使用したスケジュール式 参考 ざっと見て参考にさせてもらいたいなと思った記事(と公式ドキュメント): What Is the AWS Serverless Application Model (AWS SAM)?...

<span title='2021-02-19 12:01:46 +0900 +0900'>2月 19, 2021</span>

【DDD】前提知識まとめ

目的 社内お勉強会で DDD 本を輪読することになったんですが、 改めて「〇〇ってわかりますか?」と言われると戸惑ってしまうことが多いので自分用にまとめました。 抽象クラス(abstract class) 他のクラスで継承してもらうことを前提としたクラス。 複数のクラスの共通処理の中に、一部異なる処理を使用したい場合などに定義する。 抽象クラス自体はインスタンス化できない abstract functionで抽象メソッドを定義できる インターフェース クラスが実装するメソッドを定義することができるもの。 メソッドの実体は持てない(定義のみ) 使用できる修飾子はpublicのみ 定数を持てる。実装先のクラスでのオーバーライドはできない 不特定のクラスで、共通のメソッドを定義したい場合などに定義する。 ポリモーフィズム 「中に入るものによって、同じ関数でも違う処理を行える」というオブジェクト指向プログラミングの特徴のこと。 「モノが「そのモノ」らしく振る舞うこと」 =「呼び出した関数が、呼び出し元のオブジェクトに適した振る舞いをすること」 # 動物は必ず「鳴く」 interface Animal { sound(); } # 犬は「動物らしい振る舞い」をする(鳴く) class dog implements Animal { sound() { /**/ } } # 動物は「鳴く」ので、引数の動物ごとの異なる鳴き声を処理する # 引数で与えられる動物によって、異なる処理(鳴き声)ができる public function animalsound(animal) { animal.sound() } 継承 親クラスの振る舞いを引き継いで、子クラスを実装すること。 子クラス側で親クラスを拡張することができる。 委譲 実際の振る舞いを別のオブジェクトに委ねることで、別のオブジェクトの振る舞いを再利用する手法。(?) カプセル化 関連のあるデータとその使い方を一まとめにしたもの。 内部のデータを直接いじることはさせずに、使い方だけを見せる。 GoF デザインパターン 23 種類あるヤツ(雑) 勉強します 3 分でわかるデザインパターン入門 SOLID 原則 SOLID 原則とは Robert C....

<span title='2021-02-19 12:01:46 +0900 +0900'>2月 19, 2021</span>

【Docker】【nginx】docker-compose上のnginxをhttps対応する(開発環境編)

目的 docker-composeで立てたnginxをhttps対応にしたい。 あくまでも開発環境用なのでオレオレ証明書です。 手順 自己署名証明書をサクッと作成する ❯ openssl req -x509 -nodes -new -keyout server.key -out server.crt -days 365 docker-composeの更新 443ポートを使用するように変更。 また、作成した証明書も読み込めるようにvolumesも更新。 version: "3.5" services: web: build: ./docker/nginx restart: always ports: - 443:443 # 変更 depends_on: - app volumes: - ./:/var/www/html - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf - ./docker/nginx/server.crt:/etc/nginx/server.crt # 追加 - ./docker/nginx/server.key:/etc/nginx/server.key # 追加 links: - app networks: - default default.confの更新 ポートを443に変更し、証明書の情報を追加します。 server { listen 443; ssl on; ssl_certificate /etc/nginx/server.crt; ssl_certificate_key /etc/nginx/server.key; index index.php index.html; server_name php-docker....

<span title='2021-02-19 12:01:46 +0900 +0900'>2月 19, 2021</span>

【Embulk】インストール&dynamoDBのインポートを試してみる

割と大量のデータを別の場所に転送したい。といった要件があり、諸々模索している最中で、先輩から教えてもらったEmbulkを触ってみたのでまとめました。 Embulkとは GitHub - embulk/embulk: Embulk: Pluggable Bulk Data Loader. さまざまなストレージ、データベース、NoSQL、クラウドサービス間のデータ転送を支援する並列バルクデータローダーです。 関数を追加するプラグインをサポートしており、インプット先/アウトプット先に沿ったプラグインを適宜使用する/作成することで、前述の様々なストレージやDBなどでデータ転送を行うことができます。 インストール Brewでインストール可能です。 $ brew install embulk # embulk: Java 1.8 is required to install this formula. と言われたらエラー文通り下記でJava入れてもう一回 $ brew cask install homebrew/cask-versions/adoptopenjdk8 必要だなと思ったプラグインをプラグイン一覧から確認してインストール。 # CSVインポート $ embulk gem install embulk-input-jdbc # mysqlインポート $ embulk gem install embulk-input-mysql # mysqlアウトプット $ embulk gem install embulk-output-mysql # などなど チュートリアル 公式ドキュメントに乗っている、めちゃくちゃ簡単な動作確認チュートリアルです。 CSVを読み込んで画面に表示するだけの簡単なものになっています。 # サンプルCSVファイル、構成ファイルを作成 $ embulk example ./try1 # 推測プラグインを呼び出して適切な構成ファイル(提案)を出力。 $ embulk guess ....

<span title='2021-02-19 12:01:46 +0900 +0900'>2月 19, 2021</span>

【laravel-admin】インストール&画面作成まで 編

目的 ここ最近、しばらくlaravel-adminという管理画面を作成するためのライブラリを使っていたので、調べたことやつまづいたところも含めて少しずつ書き起こそうと思います。 まずはインストール編です。簡単に管理画面を確認できるところまで見ていきましょう。 laravel-adminとは laravelで簡単にDBの管理画面を作成することができるライブラリです。 ドキュメントやデモサイトなど使用するために必要な資料が充実しており、難しいカスタムを行う必要がなければものすごく簡単に管理画面が構築できます。 Laravel-admin(ドキュメント) GitHubページ 基本的な使用方法は上記でカバーし、カスタマイズして使用したい際には直接ソースコードを読んで適宜書き換えていく形になります。 主観ですが、コード内のコメントも(おそらく書き換える前提の部分は)丁寧に書かれているので、しっかり読み解けば問題ないかと思います。 プロジェクトの作成 既に開発しているlaravelプロジェクトに追加する場合は、この章は飛ばしてもらって大丈夫です。 何もないところからlaravel-adminを試したい方は、まずlaravelプロジェクトを作成するところから始めましょう。 公式によると、現在のバージョンでは以下の環境が推奨されるようです。 PHP 7+ laravel 5.5+ This package requires PHP 7+ and Laravel 5.5, for old versions please refer to 1.4 laravel-admin install $composer create-project --prefer-dist "laravel/laravel=5.5.*" <project-name> DBも必要になってくるので、.envにDBの情報も書き足しておきましょう。 よければこちらの記事も参考にしてみてください。 【Laravel+MySQL+nginx】docker-composeで最小構成の環境構築 - SawaLog インストール laravelの準備ができたら早速laravel-adminをインストールします。 $composer require encore/laravel-admin インストールが終わったら下記コマンドを実行します。 $php artisan vendor:publish --provider="Encore\Admin\AdminServiceProvider" $php artisan admin:install これらを実行すると、app/Adminディレクトリが作られます。これからの実装はこのディレクトリ配下で行うことになります。 ファイルの初期配置は以下。 app/Admin ├── Controllers │ ├── ExampleController.php │ └── HomeController.php ├── bootstrap....

<span title='2021-02-19 12:01:46 +0900 +0900'>2月 19, 2021</span>

【Laravel】Laravelで使用するDBををReadWrite構成にする時の確認でちょっとハマった話

起こった問題 タイトルの通り、Laravelで使用するDBのhostをRead/Weiteで切り替えたい、と思って設定をしていました。 設定後下記を確認して、 >>> config('database.connections.pgsql') => [ "read" => [ "host" => [ "postgres2", ], ], "write" => [ "host" => "postgres", ], ... 反映されてるな、と思って念の為connectionも見てみました。 >>> DB::connection('pgsql::read')->getConfig(); => [ ..., "host" => "postgres", ] ……あれ? Readコネクションなのでpostgres2であって欲しいのに、postgresが出てきてしまいました。 反映されてないのかな?と思い色々調べたので、備忘録として置いて起きます。 調べたこと getConfigで参照されるconfigは、 Illuminate\Database\Connectors\ConnectionFactory::make内で、 /** * Establish a PDO connection based on the configuration. * * @param array $config * @param string|null $name * @return \Illuminate\Database\Connection */ public function make(array $config, $name = null) { $config = $this->parseConfig($config, $name); if (isset($config['read'])) { return $this->createReadWriteConnection($config); } return $this->createSingleConnection($config); } createReadWriteConnectionが呼び出され、...

<span title='2021-02-19 12:01:46 +0900 +0900'>2月 19, 2021</span>

【Laravel】フォームリクエストでのバリデーションに条件付きの制約を追加する

やりたいこと Laravel くんで Controller をすっきりさせたいので、バリデーションをフォームリクエストで行いたい。 プラスで、簡単な条件分岐のバリデーションも付け足したい。 結論 withValodatorメソッドを通してsometimesを使うのが良さげです。 詳しく 通常のフォームリクエストでのバリデーション // FormRequest namespace App\Http\Request; use \\illuminate\Foundation\Http\FormRequest; class ItemUpdateRequest extends FormRequest { /** * Determine if the user is authorized to make this request. * * @return bool */ public function authorize() { return true; } public function rules() { return [ 'id' => 'required|integer', 'item_type' => 'required|string|in:tv,web,radio' 'name' => 'required|string|max:255', 'url' => 'nullable|url|max:2083, 'note' => 'nullable|string|max:2047', ]; } } // Controller(必要な記述以外は省略) use App\Http\Request\ItemUpdateRequest; class ItemController extends Controller { public function update(ItemUpdateRequest $request) { // } } これだけで通常のバリデーションは出来ますね。...

<span title='2021-02-19 12:01:46 +0900 +0900'>2月 19, 2021</span>