【初心者向け】ゆる〜い筋トレのすすめ その2
この記事は「イエソド アウトプット筋 トレーニング Advent Calendar 2020」9日目の記事です。
ネタがないので、前回書いた「【初心者向け】ゆる〜い筋トレのすすめ」の続きを書こうと思います。
【復習】筋トレで大事な三要素
筋トレでは、筋肉を鍛える運動、筋肉の元となる栄養素を摂取するための食事、身体を回復させるための休養の3要素がそれぞれ等しく重要となります。
そこで運動・食事・休養について、それぞれ覚えておいてほしいことをゆる〜く書いていきます。
運動
鍛えたい筋肉に集中する
筋トレというのは、種目ごとに鍛えられる部位が(ほとんど)決まっています。 具体例をあげると、レッグレイズでは主に大腿四頭筋が鍛えられます。 逆に、レッグレイズで上腕二頭筋やふくらはぎの筋肉を鍛えることはかなり難しい(不可能に近い)です。 したがって、筋トレをするときは何となくするのではなく、フォームで鍛えることのできる筋肉に集中(≒筋肉と会話)して行いましょう。
トレーニングに慣れてきたら負荷を少し上げる
漸進的過負荷の原則という言葉を聞いたことがあるでしょうか。 端的に言ってしまうと、筋肉が負荷に慣れていくので、少しずつ負荷を上げていきましょうという筋トレをするときの原則です。 ポイントは①慣れてきたら②少しずつです!慣れてないのにいきなり負荷を上げすぎると故障の元になるので気をつけましょう。
栄養
前回ではゆる〜くということで、プロテインとしか書かなかったですが、プロテインにも原料別にいくつかの種類があります。 ソイとかカゼインとかありますが、とりあえずホエイを買いましょう。よくわからないのでソイを買う人が多いですが、ソイは溶けにくい & 味に癖があって飲みにくいです。タンパク質の吸収速度的にもホエイをとりあえず買いましょう。
マルチビタミン・ミネラルを飲む
サプリメントと言うと拒否反応を起こす人がいますが、用法用量を守って飲む分にはいいことしかありません。 とりあえずビタミンとミネラルは日常生活で不足しがちなので、マルチビタミン・ミネラルを買って飲みましょう。
休養
分割法を取り入れる
筋トレ界隈では一般的な知識なのですが、分割法というトレーニング方法があります。 これは身体の部位ごとにトレーニングする日を分割することで、各部位をしっかり運動 & 休養させることのできるテクニックです。 具体例をあげると、月曜に上半身、木曜に下半身という風に分割をすると、週2のジム通いでも全身をしっかり運動 & 休養させることができます。 これはジム通いに慣れてきてコンスタントに週2以上通えるようになった方は是非取り入れてほしいです。
アクティブレスト
筋肉痛は筋肉が炎症を起こしている現象なので、冷却 & 休養が一般的な対処法となります。 しかしながら、軽症の際には軽いランニングなどで血行をよくする(このように軽い運動で血行をよくする休養方法をアクティブレストといいます)と、筋肉痛が取れることがあります。 ジム行きたいけど、ちょっとだけ筋肉痛があるんだよな〜というときには、ぜひウォーキングや軽いランニングを試してみてください。
おわりに
駆け足で30分弱で書いてみました。質問等などありましたら@tsukakei1012までドシドシオナシャス!
【初心者向け】ゆる〜い筋トレのすすめ
この記事は「イエソド アウトプット筋 トレーニング Advent Calendar 2020」2日目の記事です。
この記事では 運動を普段全くやらないけど最近運動不足だし筋トレでもやろうかな という方向けにゆる〜く筋トレをすすめていきます。
お前は誰?
株式会社イエソドでエンジニアをやっている@tsukakei1012と申します。
特にボディビルダーになりたいとかでもなく、淡々と趣味としての筋トレを6年くらい(惰性で)続けています。
今回はアウトプッ今回は鍛えるために筆を執りました。
筋トレで大事な三要素
筋トレっていうと、「ダンベルとか持ち上げればいいんでしょ!?」みたいなことをよく言われるのですが、違います。
もちろんダンベルを持ち上げる運動も重要ですが、筋肉の元となる栄養素を摂取するための食事、身体を回復させるための休養も同じくらい重要となります。
そこで運動・食事・休養について、それぞれ覚えておいてほしいことをゆる〜く書いていきます。
運動
ジムは家から近い場所に通おう
これは経験則ですが、ジムは絶対に家から近い場所がいいです(運動初心者の方は特に)。家から最寄りのジムに通いましょう。
強度より頻度を増やす
運動初心者の方あるあるですが、1回のトレーニングに色々詰め込む→全身激しい筋肉痛→ジム行く気なくすというパターンが結構あります。
これも経験則ですが、週に1回とても激しいトレーニングをするより、週に2回ほどほどに激しいトレーニングをした方が筋肉が付きます。
なので、(特に始めのうちは)もう少しトレーニングできるかもってくらいで止めて、翌々日くらいにもう一度ジムに行くようにするといいです。
栄養
ある程度トレーニングしている人達の間では常識なのですが、トレーニング直後はプロテイン摂取のゴールデンタイムになっています。
このタイミングを逃さず、プロテインだけは忘れず飲むようにしてください。プロテインはとりあえずザバスでもなんでもいいです。
食事は今まで通りでOK
筋トレを始めたからと言って、特に食事を変える必要はないです。今までと同じように(運動した分たくさん食べていいとは言っていない)食事はしていきましょう。
まずはストレス少なく筋トレを続けるのがゴールなので、アルコールも好きな方は今まで通りお好きにどうぞ。
休養
睡眠をしっかり取る
睡眠中に筋トレで破壊された筋繊維が修復されます。なので睡眠はしっかり取るようにしましょう!
痛かったら無理しない
筋肉痛や骨・関節などが痛い場合は無理せずトレーニングを休みましょう!健康のためのトレーニングで身体を痛めてしまっては元も子もないです。
一概には言えませんが、激しい筋肉痛や関節が痛む時は重量が重すぎたりフォームが間違っている可能性があります。ジムのトレーナーさんに相談してください。(僕も昔インピンジメント症候群になりかけました。)
おわりに
アウトプット筋がないので、この程度の記事でも書くのに40分かかってしまいました。。。
とりあえず最後に弊社の求人募集を置いておくので興味ある方はぜひカジュアル面談しましょう!
読んだ技術書籍まとめ 2019年 + おまけの2018年
はじめに
2019年もそろそろ終わるので、棚卸も含めて2019年中に読んだ技術書籍を備忘録的に感想付きでまとめていきます。
ついでに2018年のものも覚えている限りでまとめていこうと思います。
追記
反省としては、内容を忘れてしまっている書籍も多いので、しっかり復習しないとなと思った次第です😞
システムプログラミング
フロントエンド
- 基礎から学ぶ Vue.js
- Vue.jsの基本的なことを知りたくて購入。jQueryしか知らなかった僕でもVue.jsの基本的な文法・コンセプトを理解することができた。これ1冊だと内容的には薄い感じがするので、「Vue.js入門 基礎から実践アプリケーション開発まで」を続けて読むといいかも。
- Webフロントエンド ハイパフォーマンス チューニング
アプリケーション
- Kotlin Programming: The Big Nerd Ranch Guide
- Kotlinの基本的な文法を読みたくて購入。coroutineらへんは少し弱い気がするけど、Kotlinの基本的な文法を理解するには十分だと思う!最近、日本語版も出たみたい。
- Hands-On Design Patterns with Kotlin: Build scalable applications using traditional, reactive, and concurrent design patterns in Kotlin
- Kotlinの文法はわかったので、実践編として買った本。今のところは辞書っぽく使っている。買う必要は薄いけど、あると便利、みたいな本。
- 実践TypeScript
- TypeScriptについて本格的に知りたくて購入。TypeScriptに関する日本語書籍だと現時点(2019年12月)で最良の書籍だと思う。話は変わるけど、TypeScriptの型システムについてはこの記事がすごく良かった。
- スターティングGo言語
- Go言語、 A Tour of Goを何回やってもスライスやメソッドが理解できなくて購入。これのおかげでGoの基本的な文法が理解できたので、次のステップに進めそう😊
- Web API: The Good Parts
- 綺麗なWeb APIを設計したくて購入。RESTful APIやフレームワークのままにAPI設計するならいいけど、今後GraphQLとか使うときは参考にしたいな〜って思った本。GETとかPOSTとかわかってない人はReal World HTTP ミニ版と合わせて読むといいかも。
- Learning GraphQL
- 日本語版の評価がいい & GraphQLの勉強用に購入。GraphQL初心者から、まあまあわかるようになったので良かった。(でも正直、SubscriptionsとSchemaを返すことを除いて、まだあまりGraphQLのありがたさがわからない。)
インフラ
- 達人に学ぶDB設計 徹底指南書
- Rails以外のDB設計の世界を知りたくて購入。結構当たり前のことばかり書いてあるけど、たまには読み返す価値がありそう。
- ソフトウェアエンジニアのための ITインフラ監視[実践]入門
- インフラ監視について知りたくて購入。正直、オンプレ時代の情報ばかりなのでオンプレのインフラエンジニアでない限りは読む必要はなさそう。
- Kubernetes完全ガイド impress top gearシリーズ
- Kubernetesについて知りたくて購入。はっきり言ってKubernetesそれなりに知らないと読めない本。逆に知っていると、知りたいことは大体載っている本。
- Webエンジニアが知っておきたいインフラの基本
- インフラ監視について知りたくて購入。専門の人からすると薄い情報なんだろうけど、インフラエンジニア以外の人が取っ掛かりとして読むにはいい本だと思った。
- Amazon Web Services 業務システム設計・移行ガイド 一番大切な知識と技術が身につく
- SQL 第2版 ゼロからはじめるデータベース操作
- Elasticsearch実践ガイド
- Elasticsearchが業務で必要だったので購入。基本的な事が載っている。内容的には公式ドキュメントとあまり変わらないので、英語できるならそっちを読もう!
- Google Cloud Platform エンタープライズ設計ガイド
- Kubernetes実践入門 プロダクションレディなコンテナ&アプリケーションの作り方
- Kubernetesが全然わからなかったので購入。Kubernetes初心者にはぴったりだと思う!おすすめです!(Dockerを知らない人はまずこちらからどうぞ!)
- Designing Data-Intensive Applications: The Big Ideas Behind Reliable, Scalable, and Maintainable Systems
- 個人的に今年No.1の書籍!データに関わるミドルウェアについて、大学院の教科書として使えるレベルで網羅的・体系的・詳細に記述されていて、読むだけでかなり力がつく!
その他コメントは省略
- 図解まるわかり ネットワークのしくみ
- DNSがよくわかる教科書
- Building Microservices: Designing Fine-Grained Systems
- Cloud Native Infrastructure: Patterns for Scalable Infrastructure and Applications in a Dynamic Environment
- Cloud Native DevOps with Kubernetes: Building, Deploying, and Scaling Modern Applications in the Cloud
- Designing Distributed Systems: Patterns and Paradigms for Scalable, Reliable Services
- 入門 監視 ――モダンなモニタリングのためのデザインパターン
セキュリティ
- 暗号技術入門 第3版 秘密の国のアリス
- 暗号技術について勉強したくて購入。基本的なことは一通りわかったので良かった。安定の結城先生クオリティ!
- 体系的に学ぶ 安全なWebアプリケーションの作り方 第2版[固定版] 脆弱性が生まれる原理と対策の実践
機械学習
その他
- The Art of Readable Code: Simple and Practical Techniques for Writing Better Code
- 言わずと知れた名著。何度も日本語版は読んだけど、原著に当たりたくて購入。
- エンジニアリング組織論への招待 ~不確実性に向き合う思考と組織のリファクタリング
- NETFLIXの最強人事戦略~自由と責任の文化を築く~
- アドレナリンジャンキー プロジェクトの現在と未来を映す86パターン
- Team Geek ―Googleのギークたちはいかにしてチームを作るのか
- HRT!HRT!
2018年
- Terraform: Up & Running: Writing Infrastructure as Code
- Terraformの勉強がしたくて購入。Terraformの書き方はだいたいこれでわかるようになった。僕が買った初版の頃はTerraform自体もまだまだ未成熟で、tfstateの管理に周辺ツールを使わないといけなかったりしたけど、第2版は多分全てTerraformで完結しているはず...!
- ドラゴンクエストXを支える技術ーー 大規模オンラインRPGの舞台裏
- 現場で使える Ruby on Rails 5速習実践ガイド
- プロを目指す人のためのRuby入門 言語仕様からテスト駆動開発・デバッグ技法まで
- 言わずと知れたチェリー本。これ1冊読めば、Rubyでやりたいことはだいたいできるようになるはず!
- Take My Money: Accepting Payments on the Web
- Everyday Rails - RSpecによるRailsテスト入門
- ゼロから作るDeep Learning
――Pythonで学ぶディープラーニングの理論と実装
- Deep Learningを知りたくて購入。CNNはこれで何となく理解した(気になっている)。
おわりに
来年は、1. Haskellを覚える 2. Reactを覚える 3. Go言語でマイクロサービスを作れるようになる 4. Chaos Engineeringに関する知識を高める を目標にやっていきたいと思います!
Cloud FunctionsのHTTP Function呼び出しは認証が必要になるよってお話
この記事は「Google Cloud Platform Advent Calendar 2019」11日目の記事です。
3行でわかるまとめ
- 2020年1月15日以降に作成されるCloud FunctionsのHTTP Function呼び出し(以下、HTTP呼び出し)はデフォルトで認証が必要となります!
- 2020年1月15日以降に作成されるHTTP呼び出しを認証なしで行いたい場合は、「Cloud Functions Invoker」に
allUsers
を設定してあげる必要があります! - この情報は日本語ドキュメントと英語ドキュメントで差異があるので英語ドキュメントを読んでください!
これまでのHTTP呼び出しの認証方法
僕が知る限り、半年前まではCloud Functions自体に認証方法がなかったため、 Cloud Functions内で認証するためのロジックを書いてあげる必要がありました。
当時、ドキュメントに記載のあった方法は、GCS上に認証用のbucketを作成し、そのbucketに対する権限を確認することで認証するという方法でした。 tech.mercari.com
この方法はFunctionsの内容が冗長になるのに加えて、不必要なGCSバケットが必要などの問題がありました😩
これからのHTTP呼び出しの認証方法
Cloud Runのroles/run.invoker
のようなRoleがCloud Functionsに登場しました!
この項目にallUsers
を指定しない限りは、権限を持つユーザ・サービスアカウントしかHTTP呼び出しできないようになるので、
Functions内での認証のためのコードやGCSバケットのことを考えなくて済むようになりました😊
注意点
2020年の1月15日以降に作られるHTTP FunctionはデフォルトでHTTP呼び出しに認証が必要になるようなので、気をつけてください!
最後に
有益な情報の割になかなか見つけるのが難しい場所にドキュメントがあったので、共有させていただきました! ここまで読んでいただいてありがとうございました🙇♂️
terraform-providersの開発手順
Terraformにバグを見つけたので、PRを送るためにまずGoの勉強から始めるよ ☺️(Go書いたことないマン)
— つかもと (@tsukakei1012) 2019年2月28日
Terraformでの作業中に、Terraform Providerに(バグとも言えないような)軽微な不具合を発見したので、 PRを送るために開発環境構築・改修の検証を行った。
普段はGo言語で開発を行わないので、また似たような状況になった時に困らないように、 備忘録として開発環境構築・改修の検証の手順を残しておく。
Go言語のインストール
$ brew install goenv $ vim ~/.bashrc // 追記内容は下記参考 $ source ~/.bashrc $ goenv install 1.11.4 $ goenv global 1.11.4 $ mkdir $HOME/go
~/.bashrc
の追記内容
# For goenv export PATH="$HOME/.goenv/bin:$PATH" if which goenv > /dev/null; then eval "$(goenv init -)" fi export GOPATH=$HOME/go export PATH=$GOPATH/bin:$PATH
Terraform Providerの開発環境構築
README通りに進めていく。
$ mkdir -p $GOPATH/src/github.com/terraform-providers $ cd $GOPATH/src/github.com/terraform-providers $ git clone git@github.com:terraform-providers/terraform-provider-aws $ cd $GOPATH/src/github.com/terraform-providers/terraform-provider-aws $ make build
テスト
$ make test $ make testacc TESTARGS='-run=テストfuncton名'
実際に動かして検証したい時
まずビルドしたバイナリをPluginとして使えるようにする。
$ mkdir -p $HOME/.terraform.d/darwin_amd64 $ cp $GOPATH/bin/terraform-provider-aws $HOME/.terraform.d/darwin_amd64/terraform-provider-aws_vX.Y.Z // X.Y.Zは現行の最新版より大きい値にする
次に、検証に使うTerraformファイル内で下のようにprovider情報を修正して $ terraform init
する。
provider "aws" { version = "~> X.Y" }
おわり
追記
PRがマージされました。
TypeScriptでHubotを書いてみた
TypeScript Advent Calendar 2018 11日目の記事です。
ChatOpsの導入として、何かしらのbotをNode.jsで書いてみたいなあと思いまして、 社内向けにHubot(もう古い?)を導入してみました。
Node.jsでの開発は初めてだったのですが、せっかくならTypeScriptで書いてみようということになり、 TypeScriptでHubotを書いてみました。
導入編
まずHomebrewを使ってNVMとYarnをインストールします。
$ brew install nvm $ nvm install --lts $ nvm use --lts $ brew install yarn --without-node
設定ファイルを用意したり、TypeScriptをインストールします。
$ yarn init // 適当に答える $ yarn add webpack webpack-cli ts-loader typescript tslint tslint-config-airbnb @types/node
Hubotをインストールします。
$ yarn add generator-hubot yo hubot @types/hubot
ここら辺まで来ると、HubotをTSで書けるようになります。
import hubot = require("hubot"); module.exports = (robot: hubot.Robot<any>): void => { robot.respond(/hello/i, (msg: hubot.Response<hubot.Robot<any>>)=>{ msg.reply("world!"); }); };
プログラムを書いたので、テストを書きます。(TDDっぽく先に書いてもいいですね。)
まずは必要なライブラリをインストールします。
$ yarn add --dev chai co hubot-test-helper mocha
const Helper = require('hubot-test-helper'); const helper = new Helper('../scripts/hello.js'); const co = require('co'); const expect = require('chai').expect; describe('hello world', function() { beforeEach(function() { this.room = helper.createRoom(); }); afterEach(function() { this.room.destroy(); }); context('user says hello to hubot', function() { beforeEach(function() { return co(function*() { yield this.room.user.say('alice', '@hubot hello'); }.bind(this)); }); it ('should reply to user', function() { expect(this.room.messages).to.eql([ ['alice', '@hubot hello'], ['hubot', '@alice world!'] ]); }) }); });
これでひとまずプログラムとテストをTSで書くことができました!
運用編
Herokuにデプロイしています。 (Herokuへのデプロイで詰まった話はココ)
その他
Hubotがメンテされていなくて辛い。
TypeScriptでhubotを書く→型定義ファイルが貧弱でany型だらけになる→型定義ファイルにPRを送るために修正作業を始める→本家hubotにも修正事項を見つける→本家hubotにPRを送った←イマココ
— つかもと (@tsukakei1012) November 7, 2018
LeetCode: ZigZag Conversion
Easy問題ばかり解いていたので、たまにはMedium問題を解きます。
問題
The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows like this: (you may want to display this pattern in a fixed font for better legibility)
P A H N A P L S I I G Y I R
And then read line by line: "PAHNAPLSIIGYIR" Write the code that will take a string and make this conversion given a number of rows:
string convert(string s, int numRows);
解答
本問題では、sの中での何文字目がジグザグの何行目に来るのかを知る必要がありそうです。
とはいえ、いまいち掴みどころがわかりません。 そこで手を動かて試してみることにします。
numRows = 1
の時
これはs
が返ってきますね。
s.length <= numRows
の時
これも1.と同様にs
が返ってきますね。
numRows < s.length
の時
主に考えないといけないのはこの場合です。与えられている例題で少し考えてみます。
3-1. s = "PAYPALISHIRING", numRows = 3
の時
実際の値 | sの中で何文字目 | ジグザグの何行目 |
---|---|---|
P | 1 | 1 |
A | 2 | 2 |
Y | 3 | 3 |
P | 4 | 2 |
A | 5 | 1 |
L | 6 | 2 |
I | 7 | 3 |
S | 8 | 2 |
H | 9 | 1 |
I | 10 | 2 |
R | 11 | 3 |
I | 12 | 2 |
N | 13 | 1 |
G | 14 | 2 |
なるほど、そういうことですね。 ひとまず実装の戦略が何となく立ちましたが、もう一つの例題でも確認してみます。
3-1. s = "PAYPALISHIRING", numRows = 4
の時
実際の値 | sの中で何文字目 | ジグザグの何行目 |
---|---|---|
P | 1 | 1 |
A | 2 | 2 |
Y | 3 | 3 |
P | 4 | 4 |
A | 5 | 3 |
L | 6 | 2 |
I | 7 | 1 |
S | 8 | 2 |
H | 9 | 3 |
I | 10 | 4 |
R | 11 | 3 |
I | 12 | 2 |
N | 13 | 1 |
G | 14 | 2 |
なるほど、やはりそうですね。
上2つの表で注目して欲しいのは右端の列です。
数字がそれぞれ 1, 2, 3, 2, 1, 2, 3, 2, 1, ...
、1, 2, 3, 4, 3, 2, 1, 2, 3, 4, 3, 2, 1, ...
と周期的に並んでいますね。
これがつまりどういうことかというと、3-1.の時、1
は 1 + 4 * n
番目(nは非負整数)、2
は偶数番目
、3
は...というように規則的に数字が現れるということです。(3-2.の時はもう少し複雑な規則になりますが、基本的には同じことです。)
以上の考察から、sの中での何文字目がジグザグの何行目に来るかがわかったので、あとは実装するのみです。
public class Solution { public String convert(String s, int numRows) { if (numRows <= 1 || s.length() <= numRows) { return s; } char[] ans = new char[s.length()]; int current = 0; for (int i = 0; i < numRows; i++) { int patterNum = 2 * numRows - 2; int intervalNum = 2 * (numRows - i) - 2; for (int j = i; j < s.length(); j += patterNum) { ans[current] = s.charAt(j); current++; if (i != 0 && i != numRows - 1 && j + intervalNum < s.length()) { ans[current] = s.charAt(j + intervalNum); current++; } } } return String.valueOf(ans); } }
(sの長さをm、numRowsをnした時)時間計算量:O(m x n)、メモリ計算量:O(m)
この解法は結構速い方みたいですね。(どんぐりの背比べですが。)
それでは他の人の解答も見てみます。
class Solution { public String convert(String s, int numRows) { char[] result = new char[s.length()]; int count = 0; if(numRows == 1)return s; // 1行目の文字を埋めている for(int j = 0 ; j < s.length(); j += (numRows - 1) * 2) result[count++] = s.charAt(j); // 2 ~ numRows-1行目の文字を埋めている for(int i = 1 ; i < numRows - 1 ; i++) { int j = i; int add = (numRows - 1) * 2 - 2 * j; // i 行目の文字を埋めている処理 while(j < s.length()) { result[count++] = s.charAt(j); j += add; add = (numRows - 1) * 2 - add; } } // numRows行目の文字を埋めている for(int j = numRows - 1 ; j < s.length(); j += (numRows - 1) * 2) result[count++] = s.charAt(j); return String.copyValueOf(result); } }
少しわかりづらいので、コメントを入れました。 2 ~ numRows-1行目の文字の埋め方が少し違いますが、やっていることは基本的に同じですね。