りく
https://gyazo.com/2a97b74e0c732d3b7d7ce8c205ed203b
自己紹介 | 経歴など
■概要
初めまして、髙橋 陸と申します。25歳(1998/10/27生まれ)です。
現在は大学休学中でして、これまではいわゆるWeb系のスタートアップ企業にてソフトウェアとして合計5年間働いてきました。
ソフトウェアエンジニアとしての経歴に関する詳細は、wantedlyをご覧いただければと思っております。 お酒🍺 サウナ♨️ 読書📚 映画🎬 散歩🚶♀️ とかが好きです。
■外部リンク
Github
Twitter
Facebook
Instagram
Wantedly
lapras
■経歴
2021年8月~2023年5月
会員制ECの0→1の立ち上げから、組織・システム・プロダクトのマネジメント(シード〜シリーズA)
2021年3月~2021年9月
営業DXsaas の開発(東証グロース市場上場企業)
2019年4月~2021年1月
後払い決済サービスの開発(東証一部上場企業)
2018年12月~
プログラミングの独学始めた頃
2018年4月~
上智大学 経済学部経済学科に入った
2017年4月~
自宅浪人時代
■この先やっていきたいこと
自分自身の長期的なビジョンは、ソフトウェアエンジニアリングを通じて社会やユーザーに対して価値を提供し、そのプロセスを通じて自己成長を達成することです。これを基軸として、キャリアの進路を決定しようと考えています。具体的には、「事業とエンジニアリングをどのように連携させるか?」や「ソフトウェアエンジニアリングを通じて、どのように社会やユーザーに貢献できるか?」といった課題を重視し活動内容の選択を行っていきます。
しかし、自分自身のキャリアプランについては、厳格な計画よりも、直感的で機会があればそれを掴むというスタンスを持っています。その進行方針は以下の5つの要素を重視するものです。
1. 好奇心(Curiosity):新しい事への持続的な関心
2. 持続性(Persistence):困難に直面しても断念しない持続力
3. 楽観性(Optimism):どのような状況でも前向きな視点を保つ
4. 柔軟性(Flexibility):過度なこだわりを避け、柔軟な態度を取る
5. 冒険心(Risk Taking):結果が不確定な状況でも挑戦する勇気
これは計画的偶発性理論に基づいたような生き方であり、それ故に、就職活動や起業、フリーランスといった選択肢を最終的な目標への到達手段、つまり「HOW」と捉えています。 ■最近の興味関心
クラウドアーキテクチャ設計
もろもろ
■活かせる経験・知識・技術
ベーススキル
・事業・開発双方の観点から、適切な課題を設定し解決する問題解決の経験・スキル
・要求を要件に変換して、実装に落とし込む経験・スキル
・チームメンバーに言語を介して、意図を説明するコミュニケーション/ドキュメンテーション経験・スキル
・知らない領域の知識でも素早くキャッチアップし、業務でアウトプットする学習スキル
バックエンド
・RESTful API設計
・Open API(swagger)を活用したスキーマ駆動開発
・DB設計(概念設計・物理設計)
・Rails Way に沿った、アプリケーションロジックの実装
・SQLを用いた分析、BIツールでの可視化
・バッチ処理の実装(rake task やAWS Lambda)
・Elasticsearch を使用した全文検索の実装
webフロントエンド
・Next.js/Typescriptを使用した機能開発
・Chakra UI/Material UI を使用した UI実装
・Firebase AuthenticationやStripe等の外部サービスのSDKを使用した実装
・MicroCMSを活用した、フロントのローコード化
・Google Analytics を用いたユーザー行動ログの収集
インフラ・DevOps
・障害発生率の削減、リードタイム削減の文脈でCI/CD周りの改善(Github Actions/Circel CI等を活用して、自動テスト実行/Lint実行/自動テストcoverage計測)や、デプロイ自動化(Code Deploy)
・CloudWatchやSentlyを活用した監視・アラートの設計
・Four keys の計測基盤の構築
・AWS Glue を用いた ETL処理の実装
BizOps
・Google Apps Script, Zappier, Google Spreadsheet, Redash を活用した、各事業部の運用工数の削減作業や、データ活用の促進(リードタイムなどの可視化・レポートなど)
Tags
キリトリ.icon
ポップアップにペースを良い感じに整形するボタン追加
code: script.js
scrapbox.PopupMenu.addButton({
title: 'インデント削除',
onClick: text => {
text = text.split(/\n/).map(line => line.normalize().replace(/\s{4}/g,' ')).join('\n');
return text;
}
})
ポップアップに、文章を良い感じにリンク化するボタン追加
code:js
import '/api/code/daiiz/omakase-links/script.js'
code:script.js
const loadTitles = ({useLinks}) => {
fetch(/api/pages/${scrapbox.Project.name}/search/titles, {
credentials: 'same-origin'
}).then(res => {
return res.json()
}).then(data => {
let titles = data.map(p => p.title)
if (useLinks) {
data.map(p => {
p.links.map(l => {if (!titles.includes(l)) titles.push(l)})
})
}
titles = titles.sort((a, b) => b.length - a.length)
window.titles = titles
console.log('omakase-links-✨: load titles, links')
scrapbox.PopupMenu.addButton({
onClick: autoLink
})
})
}
// 既に記法になっているなどの理由で、置換すべきでない範囲を取得する
const detectLocked = text => {
const syntax = /\[*\.+?\\]*/g const locked = text.split('').map(c => false)
let res
while (res = syntax.exec(text)) {
}
return locked
}
const autoLink = text => {
if (!window.titles || !text) return text
const locked = detectLocked(text)
const matched = text.split('').map(c => null)
for (const title of window.titles) {
const regexp = new RegExp(escapeTitle(title), 'gi')
let res, found = false
while (!found && (res = regexp.exec(text))) {
const idx = res.index
if (matchedidx === null && !lockedidx) { found = true
for (let i = 0; i < len; i++) {
if (i === 0 || i === len - 1) {
if (i === 0) c = [${c}
if (i === len - 1) c = ${c}]
} else {
}
}
}
}
}
// 無駄にテロメアがupdateされるのを防ぐ為、何も置換しない時は何も返さない
if (matched.join('').length === 0) return
// 配列matchedでnullの位置を、元のtextの文字に置き換える
return matched.map((c, idx) => c === null ? textidx : c).join('') }
const escapeTitle = title => {
return title.replace(/[$-\/?-^{|}/g, '\\$&') }
// 置換候補をリアルタイムで更新できないのがツライところ
// しかし、毎回API呼んでると時間かかるので、ひとまず妥協
if (!window.titles) loadTitles({useLinks: true})
引用時にインデントマークを消す
code:script.js
let textSpans = document.getElementsByClassName("text");
let textSpansList = Array.from(textSpans);
textSpansList.forEach((textSpan) => {
const indentSpan = textSpan.querySelector(".indent");
if (indentSpan != null) {
if (indentSpan.getElementsByClassName("quote").length > 0) {
textSpan.querySelector(".indent-mark .dot").style.display = "none";
}
}
});