SwiftUIで画像をピンチで拡大する(UIImageView + UIScrollView)
SwiftUIで画像をピンチで拡大する(UIImageView + UIScrollView)方法です。
iOSのファイルアプリ(UIDocumentPickerViewController)を開いてドキュメントフォルダに保存したファイルを開く
iOSのファイルアプリ(UIDocumentPickerViewController)を開いてドキュメントフォルダに保存したファイルを開く方法です。
SwiftUIでObservableObjectの@publishedなプロパティとBindingする
SwiftUIでObservableObjectの@publishedなプロパティとBindingする方法です。
GithubのAPIを叩き、リポジトリの情報をリストに表示する。一番下までスクロールされたら追加で取得し、Indicatorも表示する
GithubのAPIを叩き、リポジトリの情報をリストに表示する。一番下までスクロールされたら追加で取得し、Indicatorも表示する方法です。
GithubのAPIを叩き、リポジトリの情報をリストに表示する。一番下までスクロールされたら追加で取得する
GithubのAPIを叩き、リポジトリの情報をリストに表示する。一番下までスクロールされたら追加で取得する方法です。
SwiftUIでViewModifierを使ってViewに影をつける
SwiftUIでViewModifierを使ってViewに影をつける方法です。 ViewModifierを使ってViewに影をつけています。
SwiftUIでFunctionBuilderを使ってViewに影をつける
SwiftUIでFunctionBuilderを使ってViewに影をつける方法です。 FunctionBuilderを使ってViewに影をつけています。
SwiftUIでText中の文字の太さや色を変える
SwiftUIで画像を丸く切り取り枠を付ける方法です。 150×200サイズに画像をリサイズして表示させています。 アスペクト比が異なる場合ははみ出た箇所を切り取って表示しています。
NavigationLinkを使用せずにプッシュ遷移する(.navigationDestination)
NavigationLinkを使用せずにプッシュ遷移する(.navigationDestination)方法です。
SwiftUIでButton内の画像やテキストの色を変えない
SwiftUIでButton内の画像やテキストの色を変えない方法です。 .buttonStyle(PlainButtonStyle()) を設定することでボタンを押した時の色を変えずに済みます。
SwiftUIでNavigationViewの戻るボタンを非表示にする
SwiftUIでNavigationViewの戻るボタンを非表示にする方法です。 navigationBarBackButtonHidden を false にすることで非表示にすることができます。
SwiftUIでNavigationViewを使いラージタイトルを表示する
SwiftUIでNavigationViewを使いラージタイトルを表示する方法です。 navigationTitle でタイトルを設定し、navigationBarTitleDisplayMode でサイズを指定しています。
SwiftUIで画像を丸く切り取り枠を付ける
SwiftUIで画像を丸く切り取り枠を付ける方法です。 150×200サイズに画像をリサイズして表示させています。 アスペクト比が異なる場合ははみ出た箇所を切り取って表示しています。
SwiftUIで画像をリサイズして表示する(clip)
SwiftUIで画像をリサイズして表示させる方法です。 150×200サイズに画像をリサイズして表示させています。 アスペクト比が異なる場合ははみ出た箇所を切り取って表示しています。
SwiftUIで画像を画像を丸く切り取る
SwiftUIで画像を画像を丸く切り取る方法です。 150✖︎150サイズに画像をリサイズし、丸く切り取って表示させています。 アスペクト比が異なる場合ははみ出た箇所を切り取って表示しています。
SwiftUIで画像をリサイズして表示する(fit)
SwiftUIで画像をリサイズして表示させる方法です。 150×200サイズに画像をリサイズして表示させています。 アスペクト比が異なる場合は余白を赤色で表示しています。
SwiftUIでマークダウンを表示する
SwiftUIでマークダウンを表示する方法です。 マークダウンのパースには swift-markdown を使用しています。 また Header(#) と テキストのみに対応しています。
セッションマネージャーを使ってEC2インスタンス(AmazonLinux2023)にログインする
セッションマネージャーを使ってEC2インスタンスにログインする方法です。 EC2インスタンスのセットアップ マネジメントコンソールからEC2にアクセスし、インスタンスの起動を選択します。 アプリケーションのイメージに AmazonLinux2023を選択します。 キーペアは作成せず、ネットワークはデフォルトVPCを指定します。 セキュリティグループには何も許可する必要がありません、SSH用の22番ポートにも許可を加える必要はありません。 セッションマネージャー用のロールを作成 IAM > ロールを選択し、ロールを作成します。 ユースケースに EC2 を選択します。 許可ポリシーに AmazonSSMManagedInstanceCore を追加します。 EC2インスタンスにロールの紐付け 作成したEC2インスタンスに作成したロールをアタッチします。 セッションマネージャーを使用してEC2インスタンスに接続 インスタンスの接続画面からセッションマネージャーを選択し、EC2インスタンスにログインできることを確認します。 AWS CLIからEC2インスタンスに接続する AWS CLIからECインスタンスに接続します。 以下のコマンドでAWS CLIからセッションマネージャーを使用してEC2インスタンスに接続します。 プラグインがインストールされていない場合は別途インストールが必要になります。 Troubleshooting Session Manager 署名されたインストーラーを使用して Session Manager プラグインを macOS にインストールする aws ssm start-session --target {EC2インスタンスID} --region ap-northeast-1
プロキシ環境下でAWSCLIを使う
プロキシ環境下でAWSCLIを使う方法です。 環境変数 http_proxy, https_proxy にプロキシのURLを設定することで解決しました。 # Mac export http_proxy={HTTPプロキシのURL}:{ポート番号} export https_proxy={HTTPSプロキシのURL}:{ポート番号} # Windows set http_proxy={HTTPプロキシのURL}:{ポート番号} set https_proxy={HTTPSプロキシのURL}:{ポート番号}
iOSDC2023のプロポーザルは残念ながら不採択となってしまいました
iOSDC2023のプロポーザルです。 残念ながら不採択となってしまいましたが、いつか発表できたら良いなと思います。 個人開発アプリの特許を出願する by かびごん小野
AWSクラウドプラクティショナーとソリューションアーキテクトアソシエイトの勉強方法
AWS未経験の方がAWSについて知るには資格勉強をするのが良いと思っています。 おすすめの勉強法についてまとめました。 クラウドプラクティショナー クラウドプラクティショナーはAWSの最も基礎的な資格です。 試験範囲は広いですが難易度もそこまで高くはありません。 1. クラウドプラクティショナーの本に目を通す クラウドプラクティショナーの対策本に目を通し、サービスの概要などをなんとなく理解します。 以下の本がおすすめです。 CloudTech の本は無料なので気軽に試してみてください。 AWS認定資格 クラウドプラクティショナーの教科書: 合格へ導く虎の巻 CloudTech制作委員会シリーズ AWS認定資格試験テキスト AWS認定 クラウドプラクティショナー 2. 模擬問題を繰り返し解く UdemyやAmazonにある模擬問題集を購入し、正解率が95%を超えるまで何度も繰り返し解きます。 繰り返しているうちに答えを覚えてしまうため、なぜその選択肢がダメなのか理由を意識しながら繰り返すことがおすすめです。 【2023年版】この問題だけで合格可能!AWS 認定クラウドプラクティショナー 模擬試験問題集(6回分390問) 3. ハンズオン動画を視聴し実際に操作する ソリューションアーキテクトを受験するつもりはない or 業務でAWSを使わずクラウドプラクティショナーの試験合格のみが目的であればハンズオンは必要ありません。 1と2のみで十分合格できると思いますが、その先を目指すのであればハンズオン動画を視聴しながら実際に操作することをお勧めします。 【SAA-C03版】これだけでOK! AWS 認定ソリューションアーキテクト – アソシエイト試験突破講座 ソリューションアーキテクトアソシエイト ソリューションアーキテクトアソシエイトはAWSのサービスを組み合わせて設計する仕事をする方向けの資格になります。 (デベロッパーはAWSのサービスを使用するプログラマー、アドミニストレーターはシステム管理者向けの資格だと理解しています) クラウドプラクティショナーより試験範囲は狭くなり勉強しやすくなりますがより深い知識が求められます。 1. ハンズオン動画を視聴し実際に操作する ソリューションアーキテクトはハンズオンなどをして実際にマネジメントコンソールを操作することが大事です。 【SAA-C03版】これだけでOK! AWS 認定ソリューションアーキテクト – アソシエイト試験突破講座 2. 模擬問題を繰り返し解く 【SAA-C03版】AWS 認定ソリューションアーキテクト アソシエイト模擬試験問題集(6回分390問)
GolangでWindowsで動作するソフトを作る
GolangでWindowsで動作するソフトを作る方法です。 “Hello World” と表示して、入力があると終了するソフトを作成し、Windows用にコンパイルしました。 GOOS=windows GOARCH=amd64 go build -o main.exe main.go
GolangでWebAPIを作るハンズオン(その1)
GolangでWebAPIを作るハンズオン(その1)です。 必要なもの Golang 公式の Download and install から、もしくは Homebrew などを使いインストールしてください。 go version コマンドを実行し、バージョン情報が表示されることを確認してください。 $ go version # go version go1.20.3 darwin/amd64 Editor Visual Studio Code や Goland などを用意してください。 私のおすすめは Goland です。(有料ですが。。。) Docker ローカル環境でMySQLを動かすために使います。 今回は使用しませんが、将来的に使います。 HelloWorld 任意の作業ディレクトリに移動し、main.go というファイルを作成します。 touch main.go 作成したファイルをエディタで開き、以下のコードを入力します。 入力が完了したら以下のコマンドを実行し、Hello World と出力されることを確認します。 go run main.go # Hello World サーバーを起動させてHello World 正常に Hello World と表示されましたか? 次に以下のコードを入力し、main.go を実行します。 ブラウザを表示し、http://localhost:8080/ にアクセスすると Hello World と表示されれば成功です。 最後に control + c でGoの実行を停止させます。 参考 Go言語でhttpサーバーを立ち上げてHello Worldをする
転職活動エントリ
はじめに 転職の際の忘備録として記憶が鮮明なうちに書き残します。 誰かの参考になれば幸いです。 TL;DR エージェントはよく選ぼう。 転職活動を始める前から転職準備を始めよう。 スペック 人材系メガベンチャー5年目です。うち1年ほど育休を取得していました。 iOSやAWSが得意でスキルセットは iOS(UIKit, SwiftUI)、AWS(ECS, Glue, Athena, Lambda, etc), Terraform, Docker, Spring Boot(Java)などです。 一芸に秀でている訳ではなく器用貧乏です。 資格はAWS CLP, AWS SAA, LPIC-1 です。 個人開発が趣味でiOSアプリやWebサービスを開発しています。 化学系の大学院卒で情報科学のバックグラウンドはありません。 本業でのマネジメントの経験はありません。 転職理由 育休明けのタイミングで部署異動となり、仕事内容がSREからiOSに変わりました。 iOSも好きですがSREを仕事にしたいと思っているため、良い機会だと思い転職活動を始めました。 使用した転職サイトと選考結果 使用した転職サイトはリクルートダイレクトスカウト、転職ドラフトと友人経由のリファラルです。 リクルートダイレクトスカウトでは企業に応募はせず、4社の転職エージェントとやりとりを行いました。 転職エージェントA(リクルートダイレクトスカウト) IT系の企業をベンチャーから大手まで広く紹介していただきました。 典型的な質より量のエージェントでした。 面談前に送った書類と面談の内容から履歴書と職務経歴書を作成され、私の確認なしに企業に応募されてしまいました。(後に確認した履歴書や職務経歴書は誤字脱字がありました) すぐにこのエージェントを切るべきでしたが、応募された企業の中に志望度の高い会社があったため、仕方なくこのエージェント経由で選考を進めました。 30社ほど応募し2社から内定を頂きました。(15社ほど書類落ち、10社ほど面接落ち、3社ほど辞退、2社内定) 転職エージェントB(リクルートダイレクトスカウト) 話しやすくレスポンスも早い素敵なエージェントでした。 すでに転職エージェントA社で30社ほど応募していたため、Web系のベンチャー企業を1社だけ紹介させていただきました。 1社応募し、0社から内定を頂きました。(1社面接落ち) 転職エージェントC(リクルートダイレクトスカウト) IT系ではない大企業を2社紹介していただきました。 2社応募し、0社から内定を頂きました。(1社書類落ち、1社面接落ち) 転職エージェントD(リクルートダイレクトスカウト) IT系ではない大企業を3社紹介していただきました。 とても素敵なエージェントでした。 面接の前に必ず面接対策をしてくださり、選考ルートや募集の背景などを教えてくれました。 メールのレスポンスも早く、ちゃんと寝ているのか心配になりました。 3社応募し、2社から内定を頂きました。(1社面接落ち、2社内定) 転職ドラフト 有難いこと多数のスカウトを頂きました。 最も興味のあった会社を1社応募しました。 1社応募し、0社からオファーを頂きました。(1社面接落ち) リファラル 友達経由のリファラルです。 興味のある会社を2社応募しました。 2社応募し、0社からオファーを頂きました。(1社テスト落ち、1社面接落ち) 試験について 会社によっては面接以外にも試験がありました。 SPIのような適性検査(国語、数学、性格診断など)やAtCoderのような競技プログラミングのテストが多かったです。 特に日経の大企業ではほぼ必ず適性検査があるため、ブランクがある場合は対策が必要です。 「適性検査なんて対策しなくても大丈夫でしょ!」と思っておりましたが、いざ受けてみるとボロボロでした。 「面接は良かったけど適性検査の結果が悪かったから1週間勉強して再受験して欲しい(意訳)」と選考中の企業から言われてしまい、慌てて問題集を買って勉強しました。(2回目は通過しました) 競技プログラミングのテストは対策が間に合わず、テスト結果が原因で落ちてしまうこともありました。 AtCoderのビギナーコンテストのD問題が高い確率で溶けるレベル(AtCoderの緑ぐらい?
Error Finding App Store Credentials というエラーが出てしまう
Error Finding App Store Credentials というエラーが出てしまった時の対処法です。 上記のエラーが出てしまい、AppStoreConnectにアプリをアップロードできませんでした。 セッションが切れてしまっていたので再ログインすることでアップロードができました。
SwiftUIでImageの色を反転させる
SwiftUIでImageの色を反転させる方法です。 .colorInvert() を追加することで色を反転させることができます。 SDWebImage/SDWebImageSwiftUI
SwiftでJSONをDictonaryでDecodeする
SwiftでJSONをDictonaryでDecodeする方法です。 Mapのような辞書配列をDictionaryのプロパティを持つstructでDecodeしています。
UserDefaultsで複数の値をセットで保存する
UserDefaultsで複数の値をセットで保存する方法です。 辞書型配列を使う方法と保存用のstructを作成する方法でサンプルコードを作成しました。 Set ボタンを押すと UserDefaults にカビゴンの情報が保存され、Get ボタンを押すとカビゴンの情報をコンソールに出力します。 辞書型配列を使う方法 保存用のstructを作成する方法
Swiftでモーダル表示時にviewWillDisappearが呼ばれない
Swiftでモーダル表示時にviewWillDisappearが呼ばれないということが起きました。 以下のようにボタンを押したタイミングでフルスクリーンのモーダルが表示されるとします。 modalPresentationStyle を .fullScreen にすると viewWillDisappear と viewDidAppear がモーダル表示のタイミングで呼ばれますが、.overFullScreen にすると viewDidAppear しか呼ばれませんでした。 参考: iOSにおけるモーダル表示まとめ
SwiftでUICalendarViewを使ってカレンダーを表示する
SwiftでUICalendarViewを使ってカレンダーを表示する方法です。 iOS16からUICalendarViewというすごく便利なものが使えるようになりました。 参考: How to use UICalendarView in iOS
SwiftUIでUICalendarViewを使ってカレンダーを表示する
SwiftUIでUICalendarViewを使ってカレンダーを表示する。 iOS16からUICalendarViewというすごく便利なものが使えるようになりました。 今回はSwiftUIでUICalendarViewを使用し、数字をタップすると日付がコンソールに出力されます。 参考: How to use UICalendarView in iOS
SwiftUIでTODOアプリを作成する
SwiftUIでTODOアプリのサンプルを作成してみました。 Add Scheduleボタンを押すと予定入力画面が表示されます。 日付を押すと予定一覧画面が表示され、予定の一覧を確認することができます。
SwiftUIでカレンダーを作成する
SwiftUIでカレンダーを作成する方法です。 VStack と HStack を組み合わせて作成しました。 2023年2月24日追記 iOS16からUICalendarViewという便利なものが用意されたのでそれを使った方が良いかもしれません。 こちら の記事です。
SwiftUIでローカル通知を送信する
SwiftUIでローカル通知を送信する方法です。 ローカル通知であればサーバーを用意しなくてもプッシュ通知を送信することができます。 参考: 【SwiftUI】通知機能の実装方法!ローカル通知とリモート通知の違い
タイムゾーン,etc(LPIC)
タイムゾーン,etc /etc/localtime タイムゾーンファイル、もしくはタイムゾーンファイルへのシンボリックファイルが格納されています。 /usr/share/zoneinfo タイムゾーンファイルが格納されている。 locale.conf LC_TIME: 時刻の形式 LC_TELEPHONE: 電話番号の形式 LANG: 言語を定義 サンプル アメリカの東海岸のタイムゾーンを設定する シンボリックリンクで設定する方法です。 $ ln -sf /usr/share/zoneinfo/US/Eastern /etc/localtime タイムゾーンファイルをコピーする方法です。 $ cp /etc/localtime /usr/share/zoneinfo/US/Eastern
last(LPIC)
last 最近ログインしたユーザーのリストを表示するコマンドです。 このコマンドはログイン履歴が記録された /var/log/wtmp を参照します。 $ last root pts/0 182.170.108.180 Thu Aug 25 12:47 still logged in root pts/0 182.170.108.180 Wed Aug 24 23:53 - 01:52 (01:58) root pts/0 182.170.108.180 Wed Aug 24 15:54 - 17:06 (01:12) root pts/0 182.170.108.180 Wed Aug 24 12:00 - 14:36 (02:35) root pts/0 182.170.108.180 Wed Aug 24 00:51 - 03:53 (03:02) root pts/0 182.170.108.180 Tue Aug 23 16:08 - 19:55 (03:47) snorlax pts/1 182.
/etc/resolv.conf(LPIC)
/etc/resolv.conf /etc/resolv.confは名前解決の設定を行うファイルです $ cat /etc/resolv.conf # Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8) # DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN # 127.0.0.53 is the systemd-resolved stub resolver. # run "systemd-resolve --status" to see details about the actual nameservers. nameserver 127.0.0.53
/etc/hosts(LPIC)
/etc/hosts IPアドレスとホスト名の対応情報を格納するファイルです。 $ cat /etc/hosts 127.0.0.1 localhost 127.0.1.1 localhost # The following lines are desirable for IPv6 capable hosts ::1 ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters
systemdのタイマー(LPIC)
systemdのタイマー cronのようなタイマーを作ることができます。 1時間ごとに実行するタイマーを作成する スクリプト timer-per-hour.sh を作成します。 $ vi /usr/local/bin/timer-per-hour.sh 以下のような内容を記述します。 #!/bin/bash date >> /var/log/timer-per-housr.log 権限を付与します。 $ chmod 755 /usr/local/bin/timer-per-hour.sh timer-per-hour.timer を作成します。 $ vi /etc/systemd/system/timer-per-hour.timer [Unit] Description="Per hour" [Timer] OnActiveSec=1hour OnUnitActiveSec=1hour Unit=timer-per-hour.service [Install] WantedBy=multi-user.target $ systemctl enable timer-per-hour.timer $ systemctl list-timers サンプル 登録されているタイマーの一覧を表示 $ systemctl list-timers NEXT LEFT LAST PASSED UNIT ACTI> Wed 2022-08-24 17:03:43 JST 58min left Tue 2022-08-23 17:03:43 JST 23h ago update-notifier-download.timer upda> Wed 2022-08-24 17:13:48 JST 1h 8min left Tue 2022-08-23 17:13:48 JST 22h ago systemd-tmpfiles-clean.
ssh,ssh-keygen,ssh-agent,etc(LPIC)
ssh,ssh-keygen,ssh-agent,etc ssh オプション -i 秘密鍵を指定する -p ポート番号を指定する -o Port ポート番号を指定する
su,sudo,etc(LPIC)
su,sudo,etc /etc/sudoers sudoコマンドは /etc/sudoers ファイルを参照して、ユーザーがコマンドの実行権限を持っているか判定します。
Postfix,Exim,Sendmail,MTA,newaliases,etc(LPIC)
Postfix,Exim,Sendmail,MTA,newaliases,etc newaliases /etc/aliases ファイルを参照して、/etc/aliases.db ファイルを更新するコマンドです。 ~/.foward Sendmail, Postfix, Exim などの MTAで、ユーザーが受信メールのリダイレクトを行うファイルです。 mama@example.com mama@mylpic.com その他 /etc/aliases ファイルの変更を有効にするには newaliases コマンドを実行します。
dig(LPIC)
dig DNSサーバーへの問い合わせをするコマンドです オプション swiswiswift.comのIPアドレスを調べる $ dig swiswiswift.com ; <<>> DiG 9.18.1-1ubuntu1.1-Ubuntu <<>> swiswiswift.com ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 39724 ;; flags: qr rd ra; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 65494 ;; QUESTION SECTION: ;swiswiswift.com. IN A ;; ANSWER SECTION: swiswiswift.com. 60 IN A 13.225.173.24 swiswiswift.com. 60 IN A 13.
host(LPIC)
host DNSサーバーへの問い合わせをするコマンドです。 swiswiswiftのIPアドレスを調べる $ host swiswiswift.com swiswiswift.com has address 13.225.173.24 swiswiswift.com has address 13.225.173.42 swiswiswift.com has address 13.225.173.78 swiswiswift.com has address 13.225.173.3
hostname(LPIC)
hostname ホスト名の設定、変更をするコマンドです。 ホスト名を表示 $ hostname ホスト名を更新 $ hostname new.host.name.com
nmcli(LPIC)
nmcli NetworkManagerの制御を行うコマンドラインツールです。 オブジェクト general device connection networking サンプル Wi-FiのアクセスポイントのSnorlax-WiFiに接続する $ nmcli device wifi connect Snorlax-WiFi
route(LPIC)
route ルーティングテーブルの設定と表示を行うコマンドです。 表示 $ route Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface default v160-251-100-1. 0.0.0.0 UG 100 0 0 eth0 cache12.cloud.z v160-251-100-1. 255.255.255.255 UGH 100 0 0 eth0 160.251.100.0 0.0.0.0 255.255.254.0 U 100 0 0 eth0 v160-251-100-1. 0.0.0.0 255.255.255.255 UH 100 0 0 eth0 cache13.cloud.z v160-251-100-1. 255.255.255.255 UGH 100 0 0 eth0 追加 $ route add { -net | -host } 宛先 [ネットマスク] ゲートウェイ [インターフェース名] 削除 $ route del { -net | -host } 宛先 [ネットマスク] ゲートウェイ [インターフェース名] サンプル 以下の様なルートテーブルの場合、192.
ip(LPIC)
ip ネットワークインターフェース、ルーティングテーブルなどを管理するコマンドです。 routeコマンドや、ifconfigコマンドを合わせたようなコマンドです。 ネットワークインターフェースのデータリンク層の情報を表示する $ ip link show ルーティングテーブルを表示 $ ip route show ネットワークインターフェース eth0 の送受信のバイト数を表示する $ ip -s link show dev eth0
ifconfig,ifup,ifdown,etc(LPIC)
ifconfig ネットワークI/Fの設定、表示するコマンドです。 $ ifconfig ネットワークインターフェース eth0 の送受信バイト数を表示 $ ifconfig eth0 ネットワークインターフェースeth0に、IPアドレス 192.168.0.50、サブネットマスク 255.255.255.0 を設定する $ ifconfig eth0 192.168.0.50 netmask 255.255.255.0 ifup 指定したネットワークインターフェースを有効にするコマンドです。 $ ifup [ネットワークインターフェース] ifdown 指定したネットワークインターフェースを無効にするコマンドです。 $ ifdown [ネットワークインターフェース]
lsof(LPIC)
lsof プロセスによってオープンされているファイルの一覧を表示します。 オプション -i オープンしているインターネットファイルとプロセスを表示する。 サンプル オープンされているすべてのファイルを表示する $ lsof
traceroute,tracepath(LPIC)
traceroute サンプル ローカルホストからswiswiswift.comへの経路をトレースして表示する $ traceroute swiswiswift.com traceroute to swiswiswift.com (13.225.173.24), 30 hops max, 60 byte packets 1 v160-251-100-2.wbeh.static.cnode.io (160.251.100.2) 0.548 ms 0.502 ms 0.473 ms 2 150.95.5.241 (150.95.5.241) 3.932 ms 3.994 ms 4.078 ms 3 150.95.5.117 (150.95.5.117) 0.972 ms 0.960 ms 0.948 ms 4 150.95.5.102 (150.95.5.102) 1.378 ms 1.353 ms 1.326 ms 5 150.95.5.61 (150.95.5.61) 1.303 ms 1.270 ms 150.95.5.77 (150.95.5.77) 0.861 ms 6 101.203.88.207 (101.203.88.207) 4.469 ms 3.051 ms as16509-3.
netstat(LPIC)
netstat TCPとUDPのサービスポートの状態、UNIXドメインソケットの状態、ルーティングルーティング情報などを表示します。 オプション -a すべてのプロトコル(TCP、UDP、UNIXソケット)を表示 -l 接続待ちのソケットを表示 -n ホスト、ポート、ユーザーなど名前を解決せず、数字のアドレスを表示 -p ソケット/ポートをオープンしているプログラムのPIDと名前を表示 -r ルーティングテーブルを表示 -s 統計情報を表示 -t TCPソケットを表示 -u UDPソケットを表示 -x UNIXソケットを表示 サンプル すべてのプロトコル(TCP、UDP、UNIXソケット)を表示 $ netstat -a Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 localhost:domain 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:ssh 0.0.0.0:* LISTEN tcp 0 348 v160-251-101-197.3f:ssh fpb6aa6cb4.ap.nur:59895 ESTABLISHED ... ルーティングテーブルを表示 $ netstat -r Kernel IP routing table Destination Gateway Genmask Flags MSS Window irtt Iface default v160-251-100-1.
UDP,TCP(LPIC)
UDP,TCP TCP コネクションを確立し、確立した通信路で転送を行う 受信データのエラー訂正機能がある UDP コネクションを確認しない TCPのような喪失パケットの再送、シーケンス制御、エラー訂正機能はない。
IPアドレス(LPIC)
IPアドレス IPV4 プライベートアドレス 10.0.0.0 - 10.255.255.255 172.16.0.0 - 172.31.255.255 192.168.0.0 - 192.168.255.255 サンプル 192.168.1.64/28 プレフィックスが /28 なので、32-28となり、下位4ビットがホスト部となります。 つまり、192.168.1.64 - 192.168.1.79 の16個が使用できます。 192.168.1.64はネットワークアドレス、192.168.1.79はブロードキャストアドレスとなります。 ホストのアドレスは 192.168.1.65 - 192.168.1.78 となります。 IPV6 NetworkManager 接続性の状態 none portal limited full unknown
locale(LPIC)
locale ロケール情報の表示の表示はlocaleコマンドで行います。 サンプル 現在設定されているロケール情報を全て表示する $ locale LANG=en_US.UTF-8 LANGUAGE= LC_CTYPE="en_US.UTF-8" LC_NUMERIC="en_US.UTF-8" LC_TIME="en_US.UTF-8" LC_COLLATE="en_US.UTF-8" LC_MONETARY="en_US.UTF-8" LC_MESSAGES="en_US.UTF-8" LC_PAPER="en_US.UTF-8" LC_NAME="en_US.UTF-8" LC_ADDRESS="en_US.UTF-8" LC_TELEPHONE="en_US.UTF-8" LC_MEASUREMENT="en_US.UTF-8" LC_IDENTIFICATION="en_US.UTF-8" LC_ALL=
プリンター,etc(LPIC)
プリンター,etc Postscript Printer Description(PPD) PPDはフォント、用紙サイズ、解像度などPostScriptプリンタの機能を記述し制御するためのファイルです。 /etc/cups/printers.conf 登録されたプリタンタのDeviceURIが指定されている設定ファイルです。 lpadmin CUPSでのプリンタの登録や削除はlpadminコマンドで行うことができます。 オプション -p 作成するプリンタ名を指定する。 Ghostscript 入力されたPostScriptを解釈し、PDFやEPSなどに書き出すことができます。 lpr BSD系で使われる印刷コマンドです。 サンプル fileをプリンタlp1で印刷する $ lpr -P lp1 file fileを2部印刷する $ cat file | lpr -#2 フィルタを通さずにfileを印刷する $ lpr -o raw file $ lpr -l file lp System V系で使われる印刷コマンドです。 fileをプリンタlp1で印刷する $ lp -d lp1 file $ cat file | lp -n2 フィルタを通さずにfileを印刷する $ lp -o raw file lpstat System V系で使われるプリンタのキューを表示するコマンドです。 lpq BSD系で使われるプリンタのキューを表示するコマンドです。 lpc BSD系で使われるプリンタのキューを表示するコマンドです。 cupsdisable 指定したプリンタを停止状態にするコマンドです。
syslog,rsyslog,syslog-ng,systemd journal,logger,etc(LPIC)
syslog,rsyslog,syslog-ng,systemd journal システムログを収集するソフトウェアです。 syslog ファシリティ ファシリティはメッセージの生成元を表します。 kern: カーネルによる出力 user: ユーザアプリケーションによる出力 mail: メールサービス関連による出力 daemon: システムデーモンによる出力 プライオリティ プライオリティはメッセージの重要度を表します。 emerg: パニック状態でシステムは使用不能 alert: 緊急に対処が必要 crit: 緊急に対処が必要。alertよりは緊急度は低い err: エラー発生 debug: デバッグ情報 none: ログメッセージを記録しない。 etcsyslog.conf ファイルで kern.crit と設定すると crit以上のすべてのメッセージが /var/log/messages に記録される。 /etc/syslog.conf syslogdの設定ファイルです。 すべてのカーネルメッセージをコンソールに表示する kern.* /dev/console rsyslog Syslogプロトコルをベースとして作成されました。 設定ファイル rsyslog.conf は syslog の設定ファイル syslog.conf と後方互換性があります。 syslog-ng 設定ファイルである syslog-ng.conf は。syslog の設定ファイル syslog.conf とは書式が異なるため互換性がありません。 systemd journal systemdを採用するシステムでシステムを収集するプログラムです。 rsyslogなどの他のsyslogソフトウェアと連携することができます。 /var/log/journal 不揮発性ストレージを使う場合(デフォルト)は /var/log/journal に保存される。 /run/log/journal 揮発性ストレージを使う場合は /run/log/journal に保存される。 サンプル 2022年8月28日以降のログを取得 $ journalctl --since="2022-08-28 00:00:00" 2022年8月28日以前のログを取得 $ journalctl --until="2022-08-28 00:00:00" systemd-cat メッセージをログに記録するコマンドです。
chronyc,chronyd(LPIC)
chronyc,chronyd 従来のntpdデーモン、ntpdateコマンドに代わり、機能及びパフォーマンスを改善したものです。 読み方はクローニーです。 設定ファイルは /etc/chrony.conf です。 chronyを起動 $ systemctl start chronyd
groupadd,groupdel(LPIC)
groupadd,groupdel groupadd $ groupadd pokemon $ cat /etc/group | grep pokemon pokemon:x:1001: groupdel $ groupdel pokemon
getent(LPIC)
getent ネームサービススイッチ(/etc/nsswitch.conf)の設定に従い、引数で指定したデータベースの内容を表示します。 サンプル システムの全ユーザーのアカウントを表示する $ getent passwd root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin bin:x:2:2:bin:/bin:/usr/sbin/nologin sys:x:3:3:sys:/dev:/usr/sbin/nologin sync:x:4:65534:sync:/bin:/bin/sync games:x:5:60:games:/usr/games:/usr/sbin/nologin ...
cron,crontab,anacron,etc(LPIC)
cron,crontab,anacron,etc cron crontab /etc/cron.allow, /etc/cron.deby /etc/cron.allow に記述があるユーザーはcrontabを作成することができる。 /etc/cron.deby に記述があるユーザーはcrontabを作成することができない。 /etc/cron.allow と /etc/cron.deby の両方が作成されている場合は /etc/cron.deny は無視される。 /etc/cron.allow と /etc/cron.deby の両方が存在しない場合はrootユーザーだけがcrontabを作成できる。 1 2 3 4 5 6 * * * * * * 分 時 日 月 曜日 コマンド ユーザーのcrontabファイル ユーザーのcrontabファイルは /var/spool/cron/crontabs/ に格納されます。 rootの場合は /var/spool/cron/crontabs/root に格納されます。 /etc/cron.allow /etc/cron.allow がある場合、ファイルに記述されているユーザーがcronを利用できる。 /etc/cron.deby /etc/cron.deby がある場合、ファイルに記述されていないユーザーがcronを利用できる。 サンプル 毎分/var/log/cron.logにhelloと追記する $ crontab -e * * * * * /usr/bin/echo "hello" >> /var/log/cron.log 2>&1 crontabを表示する $ crontab -l crontabを削除する $ crontab -r anacron /etc/cron.
/etc/group(LPIC)
/etc/group グループの設定は /etc/group に保存されています。 1 2 3 4 pokemon:x:1002:snorlax,ditto グループ名 グループパスワード。 グループID グループメンバー
/etc/passwd(LPIC)
/etc/passwd ユーザーのアカウント情報は /etc/passwd ファイルに保存されます。 1 2 3 4 5 6 7 snorlax:x:1000:1000:I Love Snorlax! :/home/snorlax:/bin/bash ユーザー名 パスワード。shadow が使われている場合は x が入ります ユーザーID グループID コメント ホームディレクトリ デフォルトシェル ユーザーをログインできないようにする /etc/passwd の最初の:の後を* もしくは ! にするとログインできなくなります。 snorlax:*:1000:1000::/home/snorlax:/bin/sh
X.org(LPIC)
X.org,etc xorg.conf 設定ファイルです。 /etc/X11/xorg.conf xorg.conf.d 以下に設定ファイルが分割されて格納されている場合もあります。 /etc/X11/xorg.conf.d/* /usr/share/X11/xorg.conf.d/* ディスプレイマネージャー XDM(X Display Manager) GDM(Gnome Display Manager) SDDM(Simple Desktop Display Manager) LightDM ウィンドウマネージャー Mutter metacity kwin デスクトップ環境 GNOME(GNU Network Object Model Environment) 標準ディスプレイマネージャー: gdm 標準ウィンドウマネージャー: metacity, mutter KDE 標準ディスプレイマネージャー: kdm, sddm 標準ウィンドウマネージャー: kwin X Window System 標準ディスプレイマネージャー: xdm 標準ウィンドウマネージャー: twm アクセシビリティ オンスクリーンキーボード gok(GNOME Onscreen Keyboard)はGonome2のオンスクリーンキーボード テキスト読み上げプログラム emacspeakはEmacsに読み込んだテキストや電子メールなどを音声を読み上げるソフトです。 スティッキー・キー 2つのキーを同時に起こすことが困難な場合に有効にする設定です。 スロー・キー 指定した時間より長く押し続けないとそのキー入力を有効としない設定です。 バウンス・キー 同じキーを素早く押したとき場合はそのキー入力を有効としない設定です。 xdpyinfo Xサーバーについての情報を表示するコマンドです。 xwininfo クリックした特定のウィンドウの情報を表示するコマンドです。 環境変数DISPLAY Xのアプリケーションは環境変数DISPLAYで指定されたディスプレイを表示します。 xhost xなんとかを動かす MacにXquartzをインストールする
LPIC101直前まとめ(LPIC)
LPIC101直前まとめ テスト直前に確認することを想定したページです。 setはシェル変数の一覧を表示するコマンド。シェルのパラメーターも設定できる envは環境変数の一覧を表示するコマンド pwdは現在のディレクトリパスを表示するコマンド $PWDは現在のディレクトリパスが格納された環境変数 exportは環境変数を設定するコマンド manコマンドが実行時に参照するドキュメントファイルは /usr/share/man と /usr/local/share/man に格納されてる su - rootはrootでログインし直すコマンド mkdirコマンドは-pオプションをつけるとパス途中のディレクトリも作成される $ mkdir -p snorlax/ditto mvはファイルを移動させるコマンド。-fオプションは移動先にファイルが存在しても強制的に上書きする。*を使うとすべてのファイルを移動する。 $ mv -f snorlax/* ditto cpはファイルをコピーさせるコマンド。-Rオプションはコピー元のディレクトリ構造をそのままコピーする。 $ cp -Rf snorlax/* ditto trはキーボードやファイルから入力された文字を変換して表示するコマンド。小文字を大文字に変換したり、文字を削除したりできる。 $ tr -d 'lax' < file.txt Ditto Sowpoke Snor $ tr 'a-z' 'A-Z' < file.txt DITTO SLOWPOKE SNORLAX wcはテキストファイルの文字数や行数を数えるコマンド chownコマンドは指定されたファイルの所有者とグループを変更する $ chown ユーザー名.グループ名 ファイル名 chownコマンドでスティッキービットを指定する場合は「1000」、もしくは「o+t」 一時的に利用するライブラリのパスはLD_LIBRARY_PATH環境変数に格納する rpmでパッケージファイルを指定して、そのパッケージが依存するパッケージを表示する $ rpm -qpR パッケージファイル名 rpmでインストールzみのパッケージを指定して、そのパッケージに含まれるファイル名リストを表示する $ rpm --query --list rpmで指定したファイルを含むrpmパッケージを表示する $ rpm -qf /etc/mke2fs.
pkill(LPIC)
pkill サンプル nginxを終了させる $ ps ax | grep nginx 5241 ? Ss 0:00 nginx: master process /usr/sbin/nginx 5242 ? S 0:00 nginx: worker process 5244 pts/0 S+ 0:00 grep --color=auto nginx $ pkill nginx `` $ ps ax | grep nginx 5249 pts/0 S+ 0:00 grep –color=auto nginx 5241, 5242, 5244 のプロレスが終了していることがわかります。 5249 のプロセスは終了した後にできたプロセスだと思います。
systemd(LPIC)
systemd サンプル nginxサービスを起動する $ systemctl start nginx.service nginxサービスを停止する $ systemctl stop nginx.service nginxサービスを再起動する $ systemctl restart nginx.service nginxサービスのステータスを表示 $ systemctl status nginx.service nginxサービスが起動しているか表示 $ systemctl is-active nginx.service nginxサービスを自動起動の設定をする $ systemctl enable nginx.service nginxサービスを自動起動の設定を解除する $ systemctl disable nginx.service ランレベル Red Hat Enterprise Liux, CentOS. Fedoraでのランレベル 0: 停止 1: シングルユーザーモード 2: マルチユーザーモード(テキストログイン、NFSサーバーは停止) 3: マルチユーザーモード(テキストログイン) 4: 未使用 5: マルチユーザーモード(グラフィカルログイン) 6: 再起動 s: シングルユーザーモード Ubuntu, Debian GNU/Linux でのランレベル 0: 停止 1: シングルユーザーモード 2: マルチユーザーモード 3: マルチユーザーモード 4: マルチユーザーモード 5: マルチユーザーモード 6: 再起動 s: シングルユーザーモード その他 /lib/systemd/system ディレクトリ以下にはsystemd のデフォルトのUnit定義さいるが格納されています。 現在のランレベルを調べるには runlevel コマンドを使用します。
SysVinit(LPIC)
SysVinit SysVinitの起動手順 init が /etc/inittab ファイルを読み込む init が /etc/rc.sysinit スクリプトを読み込む init が /etc/rcスクリプトを実行する /etc/rc スクリプトが「/etc/rc<ランレベル>.d」ディレクトリ以下のスクリプトを実行する
shutdown(LPIC)
shutdown オプション -r 再起動する。 -h シャットダウン後システムを停止する。 -k 実際にはシャットダウンを行なわず、 ログイン中のユーザ全員へのメッセージ送付のみを行なう。 サンプル 5分後に再起動する $ shutdown -r +5 Reboot scheduled for Sun 2022-08-14 15:58:19 JST, use 'shutdown -c' to cancel. ログイン中のユーザ全員へのメッセージを送る $ shutdown now -k "I love snorlax!"
journalctl(LPIC)
journalctl systemd-journaldが収集したログを表示するためのコマンドです。 サンプル 保管されている一番古いログから順番に確認する $ journalctl Aug 13 00:05:00 localhost kernel: Linux version 5.14.0-39.el9.x86_64 (mockbuild@x86-03.stream.rdu2.redhat.com) (gcc (GCC) 11.2.1 20211019 (Red Hat 11.2.1-6), GNU ld version 2.35.2-13.el9) #1 SMP PREEMPT Fri Dec 24 04:03:40 UTC 2021 Aug 13 00:05:00 localhost kernel: Command line: BOOT_IMAGE=(hd0,gpt2)/boot/vmlinuz-5.14.0-39.el9.x86_64 root=UUID=4683850f-07fa-4ac1-96ff-4ae48affa2ba ro crashkernel=1G-4G:192M,4G-64G:256M,64G-:512M rhgb quiet net.ifnames=0 console=tty0 console=ttyS0,115200n8r Aug 13 00:05:00 localhost kernel: x86/fpu: Supporting XSAVE feature 0x001: 'x87 floating point registers' Aug 13 00:05:00 localhost kernel: x86/fpu: Supporting XSAVE feature 0x002: 'SSE registers' Aug 13 00:05:00 localhost kernel: x86/fpu: Supporting XSAVE feature 0x004: 'AVX registers' .
ntpd,ntpdate,etc(LPIC)
ntpd,ntpdate,etc ntpd NTPにより時刻の同期を取るデーモンです。 /etc/ntp.conf ntpdの設定ファイルです。 オプション driftfile restrict server リモートサーバーのIPアドレスかDNS名、あるいは参照クロックのアドレスを指定する。 iburst iburstオプションを指定するとNTPサーバーとの初期の同期時に2秒間隔で8個のパケットを送信して同期を取ります。 通常より早く同期を取ることができます。 /etc/ntp.conf のサンプル # /etc/ntp.conf, configuration for ntpd; see ntp.conf(5) for help driftfile /var/lib/ntp/ntp.drift # Leap seconds definition provided by tzdata leapfile /usr/share/zoneinfo/leap-seconds.list # Enable this if you want statistics to be logged. #statsdir /var/log/ntpstats/ statistics loopstats peerstats clockstats filegen loopstats file loopstats type day enable filegen peerstats file peerstats type day enable filegen clockstats file clockstats type day enable # Specify one or more NTP servers.
hwclock(LPIC)
hwclock ハードウェアクロックをシステムクロックに合わせる $ hwclock -u --systohc システムクロックをハードウェアクロックに合わせる $ hwclock -u --hctosys
chage(LPIC)
change サンプル snorlaxユーザーのパスワードの有効期限を調べる $ chage -l snorlax snorlaxのパスワードの有効期限を30日後に設定する $ chage -M 30 snorlax $ chage -l snorlax Last password change : Aug 23, 2022 Password expires : Sep 22, 2022 Password inactive : Dec 31, 2022 Account expires : Aug 24, 2022 Minimum number of days between password change : 0 Maximum number of days between password change : 30 Number of days of warning before password expires : 7 snorlaxのパスワードの有効期限が切れてからアカウントが無効になるまでの期間を15日後に設定する $ chage -I 15 snorlax $ chage -l snorlax Last password change : Aug 23, 2022 Password expires : Sep 22, 2022 Password inactive : Oct 07, 2022 Account expires : Aug 24, 2022 Minimum number of days between password change : 0 Maximum number of days between password change : 30 Number of days of warning before password expires : 7
date(LPIC)
date サンプル 現在時間を表示 $ date Tue Aug 23 05:19:08 PM JST 2022 日付が入りでファイルを生成 $ touch `date "+%Y%m%d-snorlax.txt"` UTCで現在時刻を表示 $ date --utc Tue Aug 23 08:19:39 AM UTC 2022 タイムゾーンをNew_Yorkに指定してdateコマンドを実行する $ TZ=New_York date タイムゾーンをUTCに指定してdateコマンドを実行する $ TZ=UTC date
userdel(LPIC)
userdel ユーザーを削除するコマンドです。 サンプル snorlaxユーザーを削除する(snorlaxのホームディレクトリは残る) $ userdel snorlax snorlaxユーザーとホームディレクトリを削除する $ userdel -r snorlax
at,batch(LPIC)
at,batch 指定したコマンドを1回だけ実行するコマンドです。 at /etc/at.allow /etc/at.allow に登録されたユーザーは、atコマンドとbatchコマンドの実行を許可されます。 /etc/at.deny /etc/at.deny に登録されたユーザーは、atコマンドとbatchコマンドの実行を拒否されます。 サンプル 今日の17:30に/var/log/at.logにログを出力する $ at 17:30 today at Tue Aug 23 17:30:00 2022 at> date > /var/log/at.log at> <EOT> キューに入っている実行待ちのジョブを表示 $ atq 1 Tue Aug 23 17:30:00 2022 a root キューに入っている実行待ちジョブを削除 ジョブを追加します。 $ at 17:30 today at Tue Aug 23 17:30:00 2022 at> date > /var/log/at.log at> <EOT> $ atq atqコマンドでジョブ一覧を表示します。 2 Wed Aug 24 17:30:00 2022 a root 2番のジョブを削除します。 $ at -r 2 atqコマンドでジョブ一覧を表示します。 2番のジョブが消されていることを確認します。
BIOSとUEFI(LPIC)
BIOSとUEFI BIOS、UEFIはマザーボードに搭載されているプログラムです。 UEFIはBIOSの後継で、直感的なインターフェイス(マウスでも操作可能)、ハードディスクの容量が2.2TBを超えても対応可能、ネットワーク機能などがあります。 BIOS BIOS -> MBR -> ブートローダー -> Kernel -> OS UEFI UEFI -> GPT, EFIブートローダー -> Kernel -> OS
systemctl(LPIC)
systemctl サンプル sshd.serviceを開始する $ systemctl start sshd.service システム起動時にsshd.serviceを自動起動する $ systemctl enable sshd.service
GRUB(LPIC)
GRUB ブートローダーです。 GRUBの設定ファイルは /boot/grub/menu.lst と /boot/grub/grub.conf です。 設定項目 default デフォルトで起動するOSを定義する timeout OSを自動起動するまでの待機時間を指定する title 起動するOSに対して名前を定義する。 root GRUBのルートデバイスを定義する。 kernel カーネルのイメージファイルとカーネルオプションを指定する。 initrd 初期RAMディスクのイメージファイルを指定する その他 カーネル選択メニューが表示されているときに「A」もしくは「E」のキーを押すとカーネルオプションを編集できるようになります。 GRUB2 ブートローダーです。 GRUBの設定ファイルは /boot/grub2/grub.cfg と /etc/default/grub です。 grub-mkconfig /etc/default/grub に設定を記述し、grub-mkconfig を実行すると /boot/grub2/grub.cfg が生成されます。 grub-install GRUBをインストールコマンドです。 サンプル /dev/sdaのMBRにGRUBをインストールする $ grub-install /dev/sda
GPTとMBR(LPIC)
GPTとMBR MBRとGPTは、マスターブートレコード(Master Boot Record)とGUIDパーティションテーブル(GUID Partition Table)の略語です。 GPTとMBRの違い ブートモードの違い MBRディスクがBIOSをサポートし、GPTディスクがUEFIをサポートしています。 サポートするディスク容量が異なる MBRディスクでは2TBまでの領域しか扱うことができません。 一方でGPTディスクは2TBを超える領域を扱うことができます。
ACPI(LPIC)
Advanced Configuration and Power Interface(ACPI) ACPIはPC/AT互換機の電源制御の統一規格として採用されたハードウェアコンポーネントの電源管理のための規格です。 systemd-logind デーモン systemd-logind は systemd を採用したシステムで、ACPIイベントの処理おw行うデーモンです。
modprobe(LPIC)
modprobe 指定したモジュールの依存関係を確認し、必要なモジュールを自動的に追加、もしくは削除します。 モジュールに対する設定を行う場合は /etc/modprobe.d ディレクトリの下に、.confファイルを配置します。
type(LPIC)
type コマンドのパスや種類を表示するときに使うコマンドです。 WindowsとLinuxでは挙動が異なります。 サンプル lsのパスを表示 $ type ls is /bin/ls
fsck,e2fsck(LPIC)
fsck,e2fsck ファイルシステムにエラーがないかどうかのチェックと修復を行うコマンドです。 オプション -A /etc/fstabにあるファイルシステムを全て検査する サンプル /dev/vda2 をチェックする $ fsck /dev/vda2 /etc/fstab にあるファイルシステムを全て検査する $ fsck -A
tune2fs(LPIC)
tune2fs ext2/ext3/ext4 ファイルシステムのパラメーターを調整するコマンドです。 オプション -c [回数] チェックなしでマウントできる最大回数を指定する。 -i [時間] ファイルシステムをチェックする最大の時間間隔を指定する。 -j 「ext3」ジャーナル領域を「ext2」ファイルシステムに追加し、「ext3」ファイルシステムに移行する。 -L ファイルシステムのボリュームラベルを設定する。 -l スーパーブロックの内容を表示する サンプル /dev/vda2のスーパーブロックの内容を表示する $ tune2fs -l /dev/vda2 ファイルシステムをチェックする時間間隔を20日に設定する $ tune2fs -i 20 /dev/vda2 数字の後に d, m, w を付けると日、月、週をそれぞれ設定できます。 数字のみの場合は日扱いになります。
man(LPIC)
man コマンドのマニュアルを表示するためのコマンドです。 オプション -a すべてのセクションのmanページが表示される -C 設定ファイルを指定する サンプル slコマンドのマニュアルを表示する $ man sl slコマンドの第一セクションのマニュアルを表示する $ man 1 sl
特殊文字のエスケープ(LPIC)
xargs 標準入力から受け取った値を引数に渡すコマンドです。 サンプル ls に ‘-li’ を渡して実行する ls -li と同等です。 $ echo '-li' | xargs ls
特殊文字のエスケープ(LPIC)
エスケープ バックスラッシュ \ で特殊文字はエスケープできます。 サンプル (^^)/ をechoで出力する $ echo \\\(^^\)\/ $ echo '\(^^)/'
正規表現(LPIC)
正規表現 ## サンプル 以下のようなファイルからNginxという文字列が入った行を抽出する logNginx0 logNginx1 logApache0 logNginx2 logApache1 logDatadog0 $ grep -e 'logNginx[012]' file.txt $ grep -e 'logNginx[0-2]' file.txt logNginx0 logNginx1 logNginx2 以下のようなファイルから10時代のログを抽出する 2022-01-23 04:23:43 log 2022-01-26 04:23:43 log 2022-01-28 10:23:43 log 2022-01-30 04:23:43 log 2022-02-02 04:23:43 log 2022-04-23 10:23:43 log $ grep -e '10:[0-5][0-9]' file.txt 2022-01-28 10:23:43 log 2022-04-23 10:23:43 log
stat(LPIC)
stat ファイルやディレクトリの属性や日付、iノード番号などを表示するコマンドです。 サンプル $ stat file.txt 16777222 84363776 -rw-r--r-- 1 snorlax staff 0 10 "Aug 9 17:56:08 2022" "Aug 9 17:56:06 2022" "Aug 9 17:56:06 2022" "Aug 9 17:56:06 2022" 4096 8 0 file.txt
変数の展開(LPIC)
変数の展開 ダブルクオート内で変数を展開する $ echo "I am ${USER}." I am snorlax. 鉤括弧を使わなくても変数を展開できます。 $ echo "I am $USER." I am snorlax. シングルクオートでは変数は展開されません。 $ echo 'I am ${USER}.' I am ${USER}.
シェル変数と環境変数の違い(LPIC)
シェル変数と環境変数の違い シェル変数と環境変数を設定します。 $ export POKEMON_ENV=Snorlax # 環境変数を設定 $ POKEMON_SHELL=Ditto # シェル変数を設定 $ cat << END > pokemons.sh # pokemons.shを作成 #!/bin/sh echo \$POKEMON_ENV echo \$POKEMON_SHELL END $ chmod 777 pokemons.sh # 権限を付与 シェル変数のPOKEMON_SHELLは子プロセスに引き継がれません。 $ bash pokemons.sh Snorlax 子プロセスを作らなければ環境変数もシェル変数も表示されます。 $ . /Users/snorlax/Desktop/pokemons.sh Snorlax Ditto $ source pokemons.sh Snorlax Ditto
/etc/fstab(LPIC)
/etc/fstab マウントするファイルシステムとマウントポイント、マウント時に指定するオプションなどmountコマンドの実行に必要な情報を記述するファイルです。 設定例 1 2 3 4 5 6 /dev/sdb /data ext4 user,auto 0 0 デバイスファイル名(デバイスファイル名、ラベル名、UUID) マウントポイント ファイルシステムの種類 マウントオプション バックアップの指定 ファイルシステムのチェック マウントオプション async ファイルシステムの書き込みを非同期で行う sync ファイルシステムの書き込みを同期で行う auto -aふぁ指定された時にマウントされる noauto -aが指定された時にマウントされない user 一般ユーザーにマウントを許可する。
umount(LPIC)
umount ファイルシステムをルートファイルシステムから切り離す(アンマウントする)ためのコマンドです。 オプション -a /etc/fstab ファイルに記載されているファイルシステムをすべてアンマウントする -r アンマウントが失敗した場合、読み取り専用での再マウントを試みる -t 指定したファイプのファイルシステムのみに対してアンマウントする
lsblk(LPIC)
lsblk 利用可能なブロックデバイスの一覧を表示するコマンドです。 サンプル 利用可能なブロックデバイスの一覧を表示する $ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS loop0 7:0 0 44.7M 1 loop /snap/snapd/15534 loop1 7:1 0 79.9M 1 loop /snap/lxd/22923 loop2 7:2 0 62M 1 loop /snap/core20/1587 loop3 7:3 0 47M 1 loop /snap/snapd/16292 loop4 7:4 0 61.9M 1 loop /snap/core20/1405 sr0 11:0 1 494K 0 rom vda 252:0 0 30G 0 disk ├─vda1 252:1 0 1M 0 part └─vda2 252:2 0 30G 0 part /myapp /
複数の画像をpdfに変換する
複数の画像をpdfに変換する方法です。 ImageMagicがインストールされていない場合はインストールします。 Macの場合はbrewでインストールすると楽だと思います。 $ convert ./images/*.PNG 102-chap1.pdf
Conohaでディスクを追加する
Conohaでディスクを追加する方法です。 まずはサーバーを立ち上げ、ファイルシステムの使用状況を確認します。 $ df -T -h Filesystem Type Size Used Avail Use% Mounted on tmpfs tmpfs 47M 1000K 46M 3% /run /dev/vda2 ext4 30G 6.0G 23G 22% / tmpfs tmpfs 235M 0 235M 0% /dev/shm tmpfs tmpfs 5.0M 0 5.0M 0% /run/lock tmpfs tmpfs 235M 0 235M 0% /run/qemu tmpfs tmpfs 47M 4.0K 47M 1% /run/user/0 /dev ディレクトリを確認します。 $ ls /dev ... vda vda1 vda2 ... こちら を参考にしながらディスクを追加します。 ディスク追加時はサーバーを一度シャットダウンする必要があります。
dmesg(LPIC)
dmesg システム起動時にカーネルが画面に表示するメッセージを表示するコマンドです。 メッセージを表示 $ dmesg [269117.247721] [UFW BLOCK] IN=eth0 OUT= MAC=02:01:85:82:59:71:64:f6:9d:a6:3a:bf:08:00 SRC=192.241.203.248 DST=133.130.89.113 LEN=40 TOS=0x00 PREC=0x00 TTL=240 ID=54321 PROTO=TCP SPT=60243 DPT=137 WINDOW=65535 RES=0x00 SYN URGP=0 [269130.481176] [UFW BLOCK] IN=eth0 OUT= MAC=02:01:85:82:59:71:64:f6:9d:a6:3a:bf:08:00 SRC=195.230.103.247 DST=133.130.89.113 LEN=40 TOS=0x00 PREC=0x00 TTL=227 ID=54321 PROTO=TCP SPT=54674 DPT=500 WINDOW=65535 RES=0x00 SYN URGP=0 [269173.921804] [UFW BLOCK] IN=eth0 OUT= MAC=02:01:85:82:59:71:64:f6:9d:a6:3a:bf:08:00 SRC=123.160.221.3 DST=133.130.89.113 LEN=52 TOS=0x00 PREC=0x00 TTL=47 ID=4224 DF PROTO=TCP SPT=36430 DPT=9519 WINDOW=65535 RES=0x00 SYN URGP=0 [269188.440730] [UFW BLOCK] IN=eth0 OUT= MAC=02:01:85:82:59:71:64:f6:9d:a6:3a:bf:08:00 SRC=103.
lsmod(LPIC)
lsmod 現在システムにロードされているモジュールの状態を表示するコマンドです。 またモジュールの状態は /proc/modules に格納されています。 $ lsmod Module Size Used by xt_recent 24576 0 xt_multiport 20480 1 tls 106496 0 intel_rapl_msr 20480 0 intel_rapl_common 36864 1 intel_rapl_msr joydev 32768 0 input_leds 16384 0 serio_raw 20480 0 mac_hid 16384 0 xt_hl 16384 22 ip6_tables 32768 52 ip6t_rt 20480 3 ip6t_REJECT 16384 3 nf_reject_ipv6 20480 1 ip6t_REJECT xt_LOG 20480 10 nf_log_syslog 20480 10 xt_comment 16384 2 nft_limit 16384 13 xt_limit 16384 0 xt_addrtype 16384 4 xt_tcpudp 20480 20 xt_conntrack 16384 16 nf_conntrack 167936 1 xt_conntrack nf_defrag_ipv6 24576 1 nf_conntrack nf_defrag_ipv4 16384 1 nf_conntrack ipt_REJECT 16384 110 nf_reject_ipv4 16384 1 ipt_REJECT nft_compat 20480 251 nft_counter 16384 283 nf_tables 241664 611 nft_compat,nft_counter,nft_limit nfnetlink 20480 2 nft_compat,nf_tables ramoops 32768 0 pstore_blk 16384 0 reed_solomon 28672 1 ramoops pstore_zone 28672 1 pstore_blk mtd 73728 0 sch_fq_codel 20480 2 dm_multipath 40960 0 scsi_dh_rdac 20480 0 scsi_dh_emc 16384 0 ipmi_devintf 20480 0 efi_pstore 16384 0 scsi_dh_alua 20480 0 ipmi_msghandler 122880 1 ipmi_devintf msr 16384 0 ip_tables 32768 8 x_tables 53248 15 xt_conntrack,nft_compat,xt_LOG,xt_multiport,xt_tcpudp,xt_addrtype,xt_recent,ip6t_rt,xt_comment,ip6_tables,ipt_REJECT,ip_tables,xt_limit,xt_hl,ip6t_REJECT autofs4 49152 2 btrfs 1527808 0 blake2b_generic 20480 0 zstd_compress 229376 1 btrfs raid10 69632 0 raid456 163840 0 async_raid6_recov 24576 1 raid456 async_memcpy 20480 2 raid456,async_raid6_recov async_pq 24576 2 raid456,async_raid6_recov async_xor 20480 3 async_pq,raid456,async_raid6_recov async_tx 20480 5 async_pq,async_memcpy,async_xor,raid456,async_raid6_recov xor 24576 2 async_xor,btrfs raid6_pq 122880 4 async_pq,btrfs,raid456,async_raid6_recov libcrc32c 16384 4 nf_conntrack,btrfs,nf_tables,raid456 raid1 49152 0 raid0 24576 0 multipath 20480 0 linear 20480 0 hid_generic 16384 0 bochs 16384 0 crct10dif_pclmul 16384 1 crc32_pclmul 16384 0 drm_vram_helper 24576 1 bochs ghash_clmulni_intel 16384 0 drm_ttm_helper 16384 2 bochs,drm_vram_helper ttm 86016 2 drm_vram_helper,drm_ttm_helper drm_kms_helper 307200 4 bochs,drm_vram_helper syscopyarea 16384 1 drm_kms_helper sysfillrect 20480 1 drm_kms_helper sysimgblt 16384 1 drm_kms_helper aesni_intel 376832 0 crypto_simd 16384 1 aesni_intel fb_sys_fops 16384 1 drm_kms_helper cryptd 24576 2 crypto_simd,ghash_clmulni_intel cec 61440 1 drm_kms_helper usbhid 65536 0 rc_core 65536 1 cec virtio_net 61440 0 net_failover 20480 1 virtio_net psmouse 176128 0 virtio_blk 20480 1 drm 606208 6 drm_kms_helper,bochs,drm_vram_helper,drm_ttm_helper,ttm failover 16384 1 net_failover i2c_piix4 28672 0 hid 147456 2 usbhid,hid_generic pata_acpi 16384 0 floppy 118784 0 $ cat /proc/modules xt_recent 24576 0 - Live 0xffffffffc0869000 xt_multiport 20480 1 - Live 0xffffffffc0853000 tls 106496 0 - Live 0xffffffffc0917000 intel_rapl_msr 20480 0 - Live 0xffffffffc0859000 intel_rapl_common 36864 1 intel_rapl_msr, Live 0xffffffffc0839000 joydev 32768 0 - Live 0xffffffffc07b8000 input_leds 16384 0 - Live 0xffffffffc07b3000 serio_raw 20480 0 - Live 0xffffffffc07ad000 mac_hid 16384 0 - Live 0xffffffffc07a8000 xt_hl 16384 22 - Live 0xffffffffc07a3000 ip6_tables 32768 52 - Live 0xffffffffc079a000 ip6t_rt 20480 3 - Live 0xffffffffc0794000 ip6t_REJECT 16384 3 - Live 0xffffffffc078f000 nf_reject_ipv6 20480 1 ip6t_REJECT, Live 0xffffffffc0789000 xt_LOG 20480 10 - Live 0xffffffffc0783000 nf_log_syslog 20480 10 - Live 0xffffffffc077d000 xt_comment 16384 2 - Live 0xffffffffc0778000 nft_limit 16384 13 - Live 0xffffffffc0773000 xt_limit 16384 0 - Live 0xffffffffc076e000 xt_addrtype 16384 4 - Live 0xffffffffc0769000 xt_tcpudp 20480 20 - Live 0xffffffffc071b000 xt_conntrack 16384 16 - Live 0xffffffffc0764000 nf_conntrack 167936 1 xt_conntrack, Live 0xffffffffc073a000 nf_defrag_ipv6 24576 1 nf_conntrack, Live 0xffffffffc0733000 nf_defrag_ipv4 16384 1 nf_conntrack, Live 0xffffffffc072e000 ipt_REJECT 16384 110 - Live 0xffffffffc0729000 nf_reject_ipv4 16384 1 ipt_REJECT, Live 0xffffffffc0724000 nft_compat 20480 251 - Live 0xffffffffc0715000 nft_counter 16384 283 - Live 0xffffffffc0710000 nf_tables 241664 611 nft_limit,nft_compat,nft_counter, Live 0xffffffffc06d4000 nfnetlink 20480 2 nft_compat,nf_tables, Live 0xffffffffc06ce000 ramoops 32768 0 - Live 0xffffffffc06b5000 pstore_blk 16384 0 - Live 0xffffffffc06c9000 reed_solomon 28672 1 ramoops, Live 0xffffffffc06bf000 pstore_zone 28672 1 pstore_blk, Live 0xffffffffc06a1000 mtd 73728 0 - Live 0xffffffffc066a000 sch_fq_codel 20480 2 - Live 0xffffffffc0664000 dm_multipath 40960 0 - Live 0xffffffffc0654000 scsi_dh_rdac 20480 0 - Live 0xffffffffc064e000 scsi_dh_emc 16384 0 - Live 0xffffffffc0649000 ipmi_devintf 20480 0 - Live 0xffffffffc0640000 efi_pstore 16384 0 - Live 0xffffffffc062f000 scsi_dh_alua 20480 0 - Live 0xffffffffc0636000 ipmi_msghandler 122880 1 ipmi_devintf, Live 0xffffffffc0610000 msr 16384 0 - Live 0xffffffffc060b000 ip_tables 32768 8 - Live 0xffffffffc05e6000 x_tables 53248 15 xt_recent,xt_multiport,xt_hl,ip6_tables,ip6t_rt,ip6t_REJECT,xt_LOG,xt_comment,xt_limit,xt_addrtype,xt_tcpudp,xt_conntrack,ipt_REJECT,nft_compat,ip_tables, Live 0xffffffffc05d8000 autofs4 49152 2 - Live 0xffffffffc05cb000 btrfs 1527808 0 - Live 0xffffffffc0455000 blake2b_generic 20480 0 - Live 0xffffffffc044f000 zstd_compress 229376 1 btrfs, Live 0xffffffffc0416000 raid10 69632 0 - Live 0xffffffffc0404000 raid456 163840 0 - Live 0xffffffffc03db000 async_raid6_recov 24576 1 raid456, Live 0xffffffffc03d4000 async_memcpy 20480 2 raid456,async_raid6_recov, Live 0xffffffffc03ce000 async_pq 24576 2 raid456,async_raid6_recov, Live 0xffffffffc03c7000 async_xor 20480 3 raid456,async_raid6_recov,async_pq, Live 0xffffffffc03c1000 async_tx 20480 5 raid456,async_raid6_recov,async_memcpy,async_pq,async_xor, Live 0xffffffffc03bb000 xor 24576 2 btrfs,async_xor, Live 0xffffffffc03b4000 raid6_pq 122880 4 btrfs,raid456,async_raid6_recov,async_pq, Live 0xffffffffc0395000 libcrc32c 16384 4 nf_conntrack,nf_tables,btrfs,raid456, Live 0xffffffffc0279000 raid1 49152 0 - Live 0xffffffffc0388000 raid0 24576 0 - Live 0xffffffffc0381000 multipath 20480 0 - Live 0xffffffffc037b000 linear 20480 0 - Live 0xffffffffc0375000 hid_generic 16384 0 - Live 0xffffffffc0370000 bochs 16384 0 - Live 0xffffffffc036b000 crct10dif_pclmul 16384 1 - Live 0xffffffffc0366000 crc32_pclmul 16384 0 - Live 0xffffffffc0361000 drm_vram_helper 24576 1 bochs, Live 0xffffffffc02f1000 ghash_clmulni_intel 16384 0 - Live 0xffffffffc02ec000 drm_ttm_helper 16384 2 bochs,drm_vram_helper, Live 0xffffffffc0109000 ttm 86016 2 drm_vram_helper,drm_ttm_helper, Live 0xffffffffc034b000 drm_kms_helper 307200 4 bochs,drm_vram_helper, Live 0xffffffffc02ff000 syscopyarea 16384 1 drm_kms_helper, Live 0xffffffffc02fa000 sysfillrect 20480 1 drm_kms_helper, Live 0xffffffffc025b000 sysimgblt 16384 1 drm_kms_helper, Live 0xffffffffc013e000 aesni_intel 376832 0 - Live 0xffffffffc028f000 crypto_simd 16384 1 aesni_intel, Live 0xffffffffc0219000 fb_sys_fops 16384 1 drm_kms_helper, Live 0xffffffffc0256000 cryptd 24576 2 ghash_clmulni_intel,crypto_simd, Live 0xffffffffc0212000 cec 61440 1 drm_kms_helper, Live 0xffffffffc027f000 usbhid 65536 0 - Live 0xffffffffc0201000 rc_core 65536 1 cec, Live 0xffffffffc01f0000 virtio_net 61440 0 - Live 0xffffffffc0269000 net_failover 20480 1 virtio_net, Live 0xffffffffc0263000 psmouse 176128 0 - Live 0xffffffffc022a000 virtio_blk 20480 1 - Live 0xffffffffc0220000 drm 606208 6 bochs,drm_vram_helper,drm_ttm_helper,ttm,drm_kms_helper, Live 0xffffffffc015b000 failover 16384 1 net_failover, Live 0xffffffffc0153000 i2c_piix4 28672 0 - Live 0xffffffffc0147000 hid 147456 2 hid_generic,usbhid, Live 0xffffffffc0119000 pata_acpi 16384 0 - Live 0xffffffffc0111000 floppy 118784 0 - Live 0xffffffffc00eb000
lsusb(LPIC)
lsusb USBバスと、接続されているデバイスに関する情報を表示します。 $ lsusb Bus 001 Device 002: ID 0627:0001 Adomax Technology Co., Ltd QEMU USB Tablet Bus 001 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub $ lsusb -t /: Bus 01.Port 1: Dev 1, Class=root_hub, Driver=uhci_hcd/2p, 12M |__ Port 1: Dev 2, If 0, Class=Human Interface Device, Driver=usbhid, 12M
lspci(LPIC)
lspci システムのすべてのPCIバスと、接続されているデバイスに関する情報を表示するコマンドです。 $ lspci 00:00.0 Host bridge: Intel Corporation 440FX - 82441FX PMC [Natoma] (rev 02) 00:01.0 ISA bridge: Intel Corporation 82371SB PIIX3 ISA [Natoma/Triton II] 00:01.1 IDE interface: Intel Corporation 82371SB PIIX3 IDE [Natoma/Triton II] 00:01.2 USB controller: Intel Corporation 82371SB PIIX3 USB [Natoma/Triton II] (rev 01) 00:01.3 Bridge: Intel Corporation 82371AB/EB/MB PIIX4 ACPI (rev 03) 00:02.0 VGA compatible controller: Device 1234:1111 00:03.0 Ethernet controller: Red Hat, Inc. Virtio network device 00:04.
apt-get(LPIC)
apt-get サブコマンド install upgrade update dist-upgrade remove apt-get update と apt-get upgrade と apt-get dist-upgrade の違い apt-get update パッケージのリストを更新する インストールされているパッケージの更新は行わない apt-get upgrade インストールされているパッケージを更新する. さきにupdateを実行しておく ただし、更新によって新規にパッケージのインストールや削除が発生するような場合は、それを行わない つまり、安全なアップデート apt-get dist-upgrade インストールされているパッケージを更新する. 更新によって新規にパッケージのインストールや削除が発生するような場合、それらも実行する 参考: yum update と yum upgradeの違い(ついでにDebianも) サンプル インストールされているパッケージの更新を行う $ apt-get upgrade パッケージ情報の依存関係情報のキャッシュを最新の情報に更新する $ apt-get update lolcatをインストールする $ apt-get install lolcat lolcatをアンインストールする $ apt-get remove lolcat apt-cache サンプル slが依存するパッケージの情報を表示します $ apt-cache depends sl
uniq(LPIC)
uniq 重複する内容の行を1行にまとめることができます。 ソートされていない場合は事前にソートする必要があります。 サンプル file.txtの重複する行を1行にまとめる $ cat file.txt Ditto Ditto Snorlax Snorlax Snorlax Slowpoke Slowpoke $ cat file.txt | uniq Ditto Snorlax Slowpoke sort後にuniqを使う file.txtが以下のようにソートされていない場合、uniqコマンドだけではまとめることができません。 Ditto Slowpoke Snorlax Snorlax Snorlax Ditto Ditto Snorlax Slowpoke Snorlax Ditto Slowpoke Ditto $ cat file.txt | uniq Ditto Slowpoke Snorlax Ditto Snorlax Slowpoke Snorlax Ditto Slowpoke Ditto 事前にファイルの内容をソートしてからuniqコマンドでまとめる必要があります。 $ cat file.txt | sort | uniq Ditto Slowpoke Snorlax ```
dpkg,etc(LPIC)
dpkg オプション -l, –list インストール済みの全debパッケージの情報を表示します。 -s, –status 指定したパッケージの情報を表示。 -L, –listfiles 指定したパッケージに含まれるすべてのファイルを表示 -S, –search インストール済みのパッケージから指定されたファイルを検索 -I, –info 指定したパッケージの詳細情報を表示 -C, –audit インストールが完了していないパッケージを検索 -c, –contents インストールされたパッケージではなく、指定したdebパッケージファイルに含まれるファイルの一覧を表示 -r, –remove パッケージは削除するが、設定ファイルは残したままとする。 -P, –purge 設定ファイルも含め完全にパッケージを削除する サンプル slに含まれるファイルをすべて表示する $ apt install sl $ dpkg -L sl -L は --listfiles の省略形です。 $ dpkg --listfiles sl インストール済みのパッケージから /etc/mke2fs.conf ファイルが含まれているパッケージを表示する $ dpkg -S /etc/mke2fs.conf e2fsprogs: /etc/mke2fs.conf エラーなどで部分的にインストールされたパッケージを検索する $ dplg -C dpkg-reconfigure インストール済みパッケージを再設定する。 $ dpkg-reconfigure postfix
Linuxのファイル(LPIC)
Linuxのファイル /etc/apt/sources.list Debian系のパッケージのダウンロード先(リポジトリ)が書かれたファイル /etc/fstab デバイスとマウントポイント、ファイルシステムについて記述されたファイル /etc/passwd ユーザーのパスワードや属性情報を保存したファイル。現代ではパスワード情報は記載せずに /etc/shadow (シャドウファイル)に分離する運用が一般的となっている。 /etc/inittab システム起動後のデフォルトのランレベルが定義されているファイルです。 /etc/rc[0-6].d or /etc/rc.d/rc[0-6].d SysV initで起動時に使用するスクリプトをランレベルごとに管理しており、例えばランレベル5であれば /etc/rc.d/rc5.d ディレクトリに格納しています。 /etc/hosts /etc/nsswitch.conf /etc/resolv.conf /etc/shadow ハッシュ化されたパスワードが保存されたファイルです。 /etc/services サービス名とポート番号の対応が記述されたファイルです。 /etc/pam.d /etc/updatedb.conf updatedbコマンドの設定が記述されたファイル /etc/yum.conf yumの基本設定ファイル /etc/yum.repos.d/ リポジトリサーバーの設定情報が記述されたファイルを保存するディレクトリです。 /etc/hostname ホスト名が記述されたファイルです。 /etc/ntp.conf /etc/nologin このファイルが存在するとroot以外のユーザーは対話的ログインができなります。 /lib64 64bitのPCを使用している際の一般的な共有ライブラリの配置場所です。 /proc/cpuinfo プロセッサの情報が格納されたファイルです。 /proc/cmdline ブート時にカーネルに渡された引数を確認できるファイルです。 /proc/interrupts 割り込み要求(IRQ: Interrupt ReQuest)の情報を確認できるファイルです。 /proc/ioports /proc/sys/net/ipv4/ip_forward /proc/mounts 現在のマウント状態が格納されているファイル /proc.modules ロードされたモジュールの情報が格納されたファイル /proc/self/mounts 現在のマウント状態が格納されているファイル /var/log/dmesg システム立ち上げ時にカーネルが出力するメッセージが格納されているファイル
mount(LPIC)
mount オプション -a /etc/fstab ファイルに記載されているファイルシステムをすべてマウントする。 -r ファイスシステムを読み取り専用でマウントする -w ファイスシステムを読み書き可能なモードでマウントする(デフォルト) -t ファイルシステムタイプを指定してマウントする -o マウントオプションを指定する –bind サブツリーをどこか他の場所に再マウントする サンプル 現在マウントされているファイルシステムをすべて表示する $ mount /dev/sbd を /data にマウントする $ mount /dev/sbd /data /opt/myapp ディレクトリを /myapp にマウントする $ mount --bind /opt/myapp /myapp /opt/myapp ディレクトリを /myapp にマウントするとディレクトリ同士が同期されたような状態になり、/myapp/file.txt を作成すると /opt/myapp/file.txt にもファイル存在するようになります。 /etc/fstabファイル内のオプションフィールドがautoのエントリをすべてマウントする mount -a
mkfs(LPIC)
mkfs,mke2fs ファイルシステムの作成(初期化)を行うコマンドです。 オプション -t ファイルシステムのタイプを指定します。 このオプションを使って指定しなかった場合は ext2 ファイルシステムを作成します。 サンプル $ mkfs -t ext3 /dev/vda2
ファイルシステム(LPIC)
ファイルシステム ext ext2 ext3 ext4 reiserfs ジャーナル機能を持ったファイルシステム。 ディスクの使用効率が良く、クラッシュからの高速な回復機能がある。 xfs jfs vfat LinuxとWindowsの両方で読み書き可能なファイルシステム。 exfat btrfs ntfs NF File System(ntfs)はWindows NT系の標準ファイルシステム。
passwd(LPIC)
passwd パスワードの変更を行うコマンドです。 サンプル snorlaxのパスワードを設定する $ passwd snorlax snorlaxのパスワードの有効期限を60日後に設定する $ passwd -x 60 snorlax $ chage -l snorlax Last password change : Aug 23, 2022 Password expires : Oct 22, 2022 Password inactive : never Account expires : Aug 24, 2022 Minimum number of days between password change : 0 Maximum number of days between password change : 60 Number of days of warning before password expires : 7 snorlaxのパスワードの有効期限が切れてからアカウントが無効になるまでの期間を30日後に設定する $ passwd -i 30 snorlax $ chage -l snorlax Last password change : Aug 23, 2022 Password expires : Oct 22, 2022 Password inactive : Nov 21, 2022 Account expires : Aug 24, 2022 Minimum number of days between password change : 0 Maximum number of days between password change : 60 Number of days of warning before password expires : 7 アカウントをロックする /etc/shadow の暗号化されたパスワードの先頭に!
useradd(LPIC)
useradd,usermod,userdel ユーザーを追加したり、削除したりするコマンドです。 useradd ユーザーを追加するためのコマンドです。 似たコマンドにadduserコマンドがあります。 オプション -c コメント コメントを指定 -d パス ホームディレクトリを指定 -g グループ名/GID プライマリグループを指定 -G グループ名/GID プライマリグループ以外に所属するグループを指定 -s パス デフォルトシェルを指定 -e アカウント失効日の指定 -m ホームディレクトリを作成する サンプル snorlaxユーザーを作成する $ useradd snorlax snorlaxユーザーをホームディレクトリ付きで作成する ユーザー作成時に /etc/skel 以下にあるものがコピーされます。 $ useradd -m snorlax $ ls /home snorlax snorlaxユーザーをコメント付きで作成する $ useradd -c 'I love snorlax!' snorlax $ cat /etc/passwd | grep snorlax snorlax:x:1000:1000:I love snorlax!:/home/snorlax:/bin/sh snorlaxユーザーを失効日付きで作成する 2022年8月24日になるとログインできなくなります。 $ useradd -e 8/24/2022 snorlax $ passwd snorlax # パスワードを入力 $ chage -l snorlax Last password change : Aug 23, 2022 Password expires : never Password inactive : never Account expires : Aug 24, 2022 Minimum number of days between password change : 0 Maximum number of days between password change : 99999 Number of days of warning before password expires : 7 usermod ユーザー情報を変更するコマンドです。
シェルスクリプト(LPIC)
シェルスクリプト シェル上で実行できるプログラミング言語です。 変数 $$ シェルのPID $? 最後に時効したコマンドの終了値 $# 引数の数 関数 $ function snorlaxFunc() { echo 'Snorlax' } $ snorlaxFunc() Snorlax サンプル snorlax.txtがあるか調べる if [ -f ./snorlax.txt ]; then echo 'snorlax.txt is exists!' fi if test -f ./snorlax.txt; then echo 'snorlax.txt is exists!' fi 引数の数を表示する #!/bin/sh echo $# ./script.sh snorlax ditto 2 30秒ごとにSnorlaxと出力する while true do echo Snorlax sleep 30 done
シェル変数(LPIC)
シェル変数 さまざまなシェル変数についてです。 特殊なシェル変数 $$ シェルのPID $? 最後に実行したコマンドの終了値 $# 因数の個数 $* 区切り文字で区切られたすべての引数 $0 実行ファイル名 $1, $2, … 1番目の引数、2番目の引数 サンプル シェル変数を設定する $ POKEMON_SHELL=Snorlax
unalias(LPIC)
unalias エイリアスを解除するコマンドです。 サンプル $ alias snorlax='echo Snorlax' $ snorlax Snorlax $ unalias snorlax $ snorlax zsh: command not found: snorlax
SSHキーを設定する(LPIC)
SSHキーを設定する サーバー側で鍵を生成し、クライアント側にダウンロードする方法です。 ubuntuでの設定方法です。 sshでサーバーにログインする sshでサーバーにログインします。 $ ssh root@example.com 鍵を作成する rsa形式で鍵を作成します。 ~/.ssh/id_rsa.pub、~/.ssh/id_rsa に公開鍵、秘密鍵が書き出されます。 $ ssh-keygen -t rsa 秘密鍵をクライアント側にダウンロードする 秘密鍵をクライアント側にダウンロードします。 $ scp root@160.251.101.197:/root/.ssh/id_rsa . ダウンロードが完了したら秘密鍵を削除します。 $ rm /root/.ssh/id_rsa 鍵を設定する 公開鍵を authorized_keys に追加し、id_rsa.pub を削除します。 $ cat id_rsa.pub >> authorized_keys $ chmod 600 authorized_keys $ rm id_rsa.pub サーバー側sshd設定変更 秘密鍵によるログインを有効にします。 $ vi /etc/ssh/sshd_config AuthorizedKeysFile .ssh/authorized_keys .ssh/authorized_keys2 $ systemctl restart sshd.service クライアント側からsshする 鍵を指定してログインします。 $ ssh -i id_rsa root@example.com
profile、.bash_profile、.profile、.bash_login(LPIC)
bash Linuxでコマンドなどの命令文を記述したシェルを実行するために使われます。 /etc/profile、.bash_profile、.bash_login、.profile /etc/profile -> ~/.bash_profile -> ./bash_login -> ~/.profile の順番で読み込まれる。 .bash_history .bash_history にはコマンド履歴が保存されます。 $ cat /root/.bash_history HISTFILE HISTFILE にはコマンド履歴を保存するファイルが指定されます。 $ echo $HISTFILE /root/.bash_history HISTSIZE $ echo $HISTSIZE 1000
rpm2cpio(LPIC)
rpm2cpio rpmコマンドをcpioアーカイブ形式に変換し、標準出力に出力するコマンドです。 サンプル rpmコマンドをcpioアーカイブ形式に変換し、標準出力に出力する $ pm2cpio sl-5.02-1.el7.x86_64.rpm | cpio -t ./usr/bin/sl ./usr/share/doc/sl-5.02 ./usr/share/doc/sl-5.02/LICENSE ./usr/share/doc/sl-5.02/README.ja.md ./usr/share/doc/sl-5.02/README.md ./usr/share/man/ja/man1/sl.1.ja.gz ./usr/share/man/man1/sl.1.gz 37 blocks
yum,etc(LPIC)
yum yum update と yum upgrade の違い yum update はインストール済みのパッケージをアップデートするコマンドです。 yum upgrade は yum update --obsoletes と同じです。 --obsoletes は、パッケージの更新時にのみ有効なオプションで、不要になったパッケージの削除を自動で行います。 /etc/yum.conf yumの基本設定ファイルです。 $ cat [main] gpgcheck=1 installonly_limit=3 clean_requirements_on_remove=True best=True skip_if_unavailable=False /etc/yum.repos.d/ リポジトリサーバーの設定情報が記述されたファイルを保存するディレクトリです。 $ ls /etc/yum.repos.d/ centos-addons.repo centos.repo epel-next.repo epel-next-testing.repo epel.repo epel-testing.repo redhat.repo サンプル slコマンドをインストールする $ yum install sl パッケージグループを一覧表示する $ yum grouplist インストール済みのパッケージの一覧を表示 $ yum list installed アップデートができるすべてのパッケージを表示 $ yum list updates $ yum check-update インストール済みのrpmパッケージをyumコマンドで削除 $ yum remove sl $ yum erase sl yum updateを実行した時のアップデート対象となるパッケージの一覧を表示 $ yum check-update nginxを検索する $ yum search nginx
rpm(LPIC)
rpm Red Hat Linux や Fedora linux、CentOS などの Red Hat 系のディストリビューションで採用されているパッケージ管理システムです。 rpmコマンドやyumコマンドを利用してrpmパッケージの管理を行います。 オプション -q, –query 指定したパッケージがインストールされていればバージョンを表示(後述) -U, –upgrade パッケージをアップグレードする。 インストール済みのパッケージが存在しない場合、新規にインストールを行う。 -F, –freshen パッケージをアップデートする。 インストール済みのパッケージが存在しない場合、何も行わない。 -V, –verbose 詳細な情報を表示する -h, –hash 進行状況を#記号で表示する -e, –erase パッケージを削除する –nodeps 依存関係を無視してパッケージを削除する –allmatches パッケージ名に一致するすべてのバージョンのパッケージを削除する query のオプション -a, –all インストール済みのrpmパッケージ情報を一覧で表示 -i, –info 指定したパッケージの詳細情報を表示 -c, –configfiles 指定したパッケージ内の設定ファイルのみを表示 -p, –package インストールされたrpmパッケージではなく、指定したrpmパッケージファイルの情報を表示 -R, –requires 指定したパッケージが依存しているrpmパッケージ名を表示 ファイル名 パッケージファイルのファイル名に規則がある。 sl-5.02-1.el7.x86_64.rpm パッケージ名: sl バージョン内容: 5.0.2 リリース番号: 1.el7 アーキテクチャ: x86_64(64bit) 拡張子: rpm サンプル インストールされているslコマンドのバージョンを表示 $ rpm -q sl $ rpm --query sl sl-5.
ldd(LPIC)
ldd lddコマンドは共有ライブラリへの依存関係を表示するコマンドです。 サンプル /usr/bin/slが必要とする共有ライブラリの一覧を表示する $ ldd /usr/bin/sl linux-vdso.so.1 (0x00007ffca1f76000) libncurses.so.6 => /lib64/libncurses.so.6 (0x00007f233b61d000) libtinfo.so.6 => /lib64/libtinfo.so.6 (0x00007f233b5ee000) libc.so.6 => /lib64/libc.so.6 (0x00007f233b3e5000) /lib64/ld-linux-x86-64.so.2 (0x00007f233b651000)
ldconfig(LPIC)
ldconfig リンクの作成やライブラリのキャッシュを行うコマンドです。 ldconfig を実行すると /etc/ld.so.conf に基づいて /etc/ld.so.cache を再構築します。 /etc/ld.so.cache のファイル更新日を確認します。 $ ls -l /etc/ld.so.cache -rw-r--r-- 1 root root 20231 Aug 15 15:17 /etc/ld.so.cache ldconfig を実行します。 $ ldconfig /etc/ld.so.cache のファイルが更新します。 $ ls -l /etc/ld.so.cache -rw-r--r-- 1 root root 20231 Aug 15 15:17 /etc/ld.so.cache
whereis(LPIC)
whereis 指定されたコマンドのバイナリー、ソース、マニュアルページの場所を表示するコマンドです。 サンプル slのバイナリとマニュアルの場所を表示する $ whereis sl sl: /usr/bin/sl /usr/share/man/man1/sl.1.gz
locate,updatedb(LPIC)
locate,updatedb locateはファイルを名前で検索するコマンドです。 updatedbはlocate用の検索データベースを作成します。 サンプル snorlaxをファイル名に含むファイルを検索する $ find . -name snorlax
find(LPIC)
find 指定したディレクトリ以下で、指定した検索条件に合致するファイルを検索するコマンドです。 オプション -name 指定したファイル名で検索する -type ファイルのタイプで検索する -atime 指定した日時をもとに、最終アクセスがあったファイルを検索する -mtime 指定した日時をもとに、最終更新されたファイルを検索する -maxdepth 検索するサブディレクトリの深さを指定する サンプル snorlaxをファイル名に含むファイルを検索する $ find . -name "*snorlax*" カレントディレクトリのみでsnorlaxをファイル名に含むファイルを検索する $ find . -name "*snorlax*" -maxdepth 1 カレントディレクトリ内のsnorlaxをファイル名に含むファイルを削除する $ find . -name "*snorlax*" -maxdepth 1 -print0 | xargs -0 rm 参考: findとxargsコマンドで-print0オプションを使う理由(改) rootが所有するディレクトリとファイルをすべて表示する(-uidを使う場合) $ find . -uid 0 rootユーザーのuidは0 rootが所有するディレクトリとファイルをすべて表示する(-userを使う場合) $ find . -user root x日前、 x日以上のファイルを検索する 検索対象となるファイルを作成します。 $ touch --date="2022/8/4 12:00" 8-4.txt $ touch --date="2022/8/5 12:00" 8-5.txt $ touch --date="2022/8/6 12:00" 8-6.
ln(LPIC)
ln ファイルへのリンクを作成するコマンドです。 ハードリンクとシンボリックリンクの違い 複数の実名を付ける処理がハードリンクです。 ハードリンクの場合、複数あるファイル名はどれも対等なものとなります。 ただしハードリンクは異なるディレクトリ間で作成することはできません。 シンボリックリンクは別名を付けることに相当します。 シンボリックリンクを作成すると新たにファイルが生成され、リンク先のファイル名とパスが保持されます。 具体例で説明します。 まずはファイルを作成します。 $ touch file.txt ファイルの詳細を確認します。 $ ls -li file.txt 393491 -rw-r--r-- 1 root root 0 Aug 8 01:38 file.txt ハードリンクを作成します。 $ ln file.txt file-hard.txt 2つのファイルの詳細を確認します。 $ ls -li file.txt $ ls -li file-hard.txt 393491 -rw-r--r-- 2 root root 0 Aug 8 01:38 file.txt 393491 -rw-r--r-- 2 root root 0 Aug 8 01:38 file-hard.txt ハードリンクではiノードの値が共に 393491 であることがわかります。 またハードリンクを作成したことで、リンク数が1から2へと増えていることがわかります。 次にシンボリックリンクを作成します。 $ ln -s file.
chown(LPIC)
chown 指定されたファイルの所有者とグループを変更します。 オプション -R ディレクトリのみに指定が可能であり、サブディレクトリを含め再起的に所有者、グループが変更される。 サンプル ファイルの所有者、グループを変更する snorlaxでファイルを作成します。 $ su snorlax $ touch file.txt $ ls -l file.txt -rw-rw-r-- 1 snorlax snorlax 0 Aug 14 00:51 file.txt ファイルの所有者とグループをrootに変更します。 $ chown root:root file.txt $ ls -l file.txt -rw-rw-r-- 1 root root 0 Aug 14 00:51 file.txt ユーザー名:グループ名 ではなく、ユーザー名.グループ名 でも変更できます。 $ chown snorlax.snorlax file.txt $ ls -l file.txt $ -rw-rw-r-- 1 snorlax snorlax 0 Aug 14 00:51 file.txt
umask(LPIC)
umask デフォルトのパーミッションを決定するumask値を確認、設定するコマンドです。 ファイルの場合は666からumask値を削除したもの、ディレクトリの場合は777からumask値を削除したものがデフォルトのパーミッションになります。 サンプル umask値を確認する $ umask 022 umask値に027を設定する ファイルの場合は666から027を引いたものがパーミッションとなるため、640となり、rw-r----- となります。 $ umask 027 $ touch file.txt $ ls -l file.txt -rw-r----- 1 snorlax staff 0 8 2 23:28 file.txt ディレクトリの場合は777から027を引いたものがパーミッションとなるため、750となり、rwxr-x--- となります。 $ umask 027 $ mkdir mydir $ ls -l file.txt drwxr-x--- 2 root root 4096 Aug 16 00:59 mydir
chmod(LPIC)
chmod ファイルやディレクトリに設定されているパーミッションを変更するコマンドです。 オプション -R ディレクトリに指定した場合、サブディレクトリを含め再起的にパーミッションが変更される。 シンボリックモード 文字や記号を用いてパーミッションを指定します。 ユーザー u: 所有者 g: グループ o: その他 a: すべてのユーザー 操作 +: 許可を与える -: 許可を削除する =: 許可を設定する パーミッション r: 読み取り w: 書き込み x: 実行権 オクタルモード 数字で権限を指定します。 読み取り権は4、書き込み権は2、実行権は1、権限なしは0と権限を8進数で指定できます。 読み取り、書き込み、実行の権限を与える場合は7、読み取りと書き込みの権限を与える場合は6を設定します。 サンプル シンボリックモードでパーミッションをrwxrwxrwxに変更する $ chmod a=rwx file.txt すべてのユーザーに対するパーミッションを rwx に設定します。 $ ls -l file.txt -rwxrwxrwx@ 1 snorlax staff 58 7 31 11:26 file.txt シンボリックモードでパーミッションをrwxr–r–に変更する $ chmod u=rwx,g=r,o=r file.txt $ ls -l file.txt -rwxr--r--@ 1 snorlax staff 58 7 31 11:26 file.
パーミッション(LPIC)
パーミッション ディレクトリやファイルなどを操作するための権限です。 パーミッションの読み方 左からファイルの種類、ユーザーに対するパーミッション、グループに対するパーミッション、その他のユーザーに対するパーミッションです。 ファイルの種類 - 通常ファイル d ディレクトリ l シンボリックリンク サンプル -rw-rw-r– のパーミッション - rw- rw- r-- と分解できる。 - なのでファイル。 rw- なので所有者は読み取りと書き取りができる。 rw- なのでグループは読み取りと書き取りができる。 r-- なのでその他のユーザーは読み取りができる。
fdisk(LPIC)
fdisk パーティションを作成、削除するコマンドです。 オプション -d 領域を削除 -l パーテションのタイプを表示 -m 利用可能なメニューの表示 サンプル 作成済みのパーティションテーブルを表示する $ fdisk -l Disk /dev/loop0: 79.95 MiB, 83832832 bytes, 163736 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk /dev/loop1: 44.68 MiB, 46845952 bytes, 91496 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk /dev/loop2: 61.
pvcreate(LPIC)
pvcreate Logical Volume Manage(LVM)は複数のハードディスクやパーティションにまたがった記憶領域を、あたかも一つのディスクとして扱うことのできるディスク管理機能です。 pvcreateコマンドは複数のハードディスクやパーティションにまたがった記憶領域を、あたかも一つのディスクとして扱うことのできるディスク管理機能です。
Filesystem Hierarcchy Standard(LPIC)
Filesystem Hierarcchy Standard Filesystem Hierarcchy Standard(FHS)はディレクトリ構造の標準を定めた仕様書です。 / ファイルシステムの頂点にあたるディレクトリ /bin 一般ユーザー、管理者が使用するコマンドが配置 /dev デバイスファイルが配置。システム起動時に接続されているデバイスがチェックされ、自動的に作成される。 /etc システム管理用に設定ファイルや、各種ソフトウェアの設定ファイルが配置。 /lib /bin や /sbin などに置かれたコマンドやプログラムが利用する共有ライブラリが配置。 /lib64 64bit用の共有ライブラリが配置。 /media /opt Linuxインストール後、追加でインストールしたパッケージが配置。 /proc /root /sbin /tmp /var /var/log /boot /usr /usr/bin /usr/lib /usr/local Linuxインストール後、追加でインストールしたパッケージ(ソフトウェア)が配置 このディレクトリ以下には bin、sbin、libなどのディレクトリが配置される。 /usr/sbin /home
watch(LPIC)
watch 指定されたコマンドを繰り返し実行するコマンドです。 サンプル 5秒ごとに echo “snorlax” を実行するコマンド # wip 動くか試してない $ watch -n 5 echo "snorlax"
killall(LPIC)
killall プロセス名を指定してシグナルを送信する際に使用するコマンドです。 主なシグナル SIGUP シグナル番号1、端末の切断によるプロセスの終了 SIGINT シグナル番号2、割り込みによるプロセスの終了([ctrl]+[c]) SIGKILL シグナル番号9、プロセスの強制終了 SIGTERM シグナル番号15、プロセスの終了(デフォルト) SIGCONT シグナル番号18、一時停止したプロセスを再開する
kill(LPIC)
kill シグナルを送信し、プロセスを終了させるためのコマンドです。 主なシグナル SIGUP シグナル番号1、端末の切断によるプロセスの終了 SIGINT シグナル番号2、割り込みによるプロセスの終了([ctrl]+[c]) SIGKILL シグナル番号9、プロセスの強制終了 SIGTERM シグナル番号15、プロセスの終了(デフォルト) SIGCONT シグナル番号18、一時停止したプロセスを再開する
nohup(LPIC)
nohup ログアウトしてもプログラムを実行し続けるためのコマンドです。 ## サンプル バックグラウンドで sl コマンドを実行する。 $ nohup sl & バックグランドでupdatedbコマンドを実行する $ nohup updatedb &
nice(LPIC)
nice プロセスの優先度をデフォルトから変更して実行するコマンドです。 nice値は -20~19 の値で変更可能です。 niceコマンドで、オプションで数値を指定しない場合のnice値は10(0+10)の優先度を付与します。
ps(LPIC)
ps プロセスの情報を得るコマンドです。 BSDでのオプション a すべてのプロセスを表示する u 詳細情報を表示する x 制御端末のないプロセス情報も表示する サンプル アクティブなプロセスをすべて表示する $ ps ax $ ps -ef
vi(LPIC)
vi ファイルの作成、編集を行うコマンド(エディタ)です。 コマンドモード、入力モード、exモードを使い分けます。 環境変数EDITOR デフォルトのエディタは環境変数EDITORで設定できます。 $ export EDITOR=/usr/bin/vi コマンドモード [ctrl] + f ファイルの末尾に向かって1画面ずつスクロール [ctrl] + b ファイルの先頭に向かって1画面ずつスクロール [数字] + dd 数字の数だけ行を削除する。 例えば 3dd であればカーソルから3行削除する。 [数字] + . 直前のコマンドを数字の回数だけ繰り返す。 例えば dd と入力して1行消したとに 3. と入力すると追加で3行消されます。 / [文字列] 現在のカーソル位置からファイルの末尾に向かって検索 ? [文字列] 現在のカーソル位置からファイルの先頭に向かって検索 A 入力モードに切り替え、行の末尾にカーソルを移動する P カーソル行の上の行に貼り付ける。 p カーソル行の下の行に貼り付ける。 ZZ ファイルの更新が無ければタイムスタンプを更新せずに保存と終了を行う 入力モード exモード :w ファイル名を変更せずにそのまま保存 :q ファイルを保存せずに終了 :q! すべて破棄して終了する :wq タイムスタンプを更新して保存と終了を行う :! viを実行しながらコマンドを実行する。
fgrep(LPIC)
fgrep fgrepは正規表現を使用せずに検索したい時に使用します。 grep コマンドではこのように正規表現を使ってファイルを検索することができます。 以下の例では先頭が sno であるポケモンを検索しています。 $ grep ^sno pokemons.txt fgrep コマンドは正規表現を使用せずにそのままの単語を検索します。 そのため以下の例では何も出力されません。 $ fgrep ^sno pokemons.txt
pgrep(LPIC)
pgrep 現在実行中のプロセスを調べて、ユーザー名、UID、GIDなどを元にプロセスIDを検索します。 オプション -u 指定されたユーザーに該当するプロセスIDを検索 サンプル snorlax のプロセスを検索 $ pgrep -u snorlax
sha256sum(LPIC)
sha256sum SHA256ハッシュ値を求めるコマンドです。 $ sha256sum file.txt e1134eadacc182c3838b5121687b4cbb6a2fa46d18aeeb7ab09f3752766a9c56 file.txt sha512sum SHA512ハッシュ値を求めるコマンドです。 $ sha512sum file.txt 68e2768a313d196590d70a5045138cb42d752b634525b7404c397228a2b368833a51dc42c19a6b5d26baf9a0a9acba5df28e40111c652d606ddf1e8ce72e00c2 file.txt
od(LPIC)
od ファイルの内容を8進数で表示するコマンドです。 オプション -d Decimal(10進数)で表示する -x Hexa Decimal(16進数)で表示する サンプル pokeons.txt の内容を16進数で出力する $ od -x pokemons.txt
wc(LPIC)
wc テキストファイルの文字数や行数を数えるコマンドです。 オプション -c バイト数だけを出力する。 -l 行数だけを出力する。 -w 単語数だけを出力する サンプル pokeons.txt の行数を出力する $ wc -l pokemons.txt
tr(LPIC)
cut ファイル内の行中の特定部分のみを取り出すコマンドです。 オプション -c 指定された位置の各文字だけを表示する -d 区切り文字を指定する -f 必要な項目を項目数で指定する サンプル ファイルから3-5文字目を取り出す 以下のような内容の number.txt があるとします。 123456789 $ cut -c 3-5 number.txt $ cut -c 3-5 number.txt 345 行からから1つ目と4つ目の要素を取り出す 以下のような内容の pokemons.txt があるとします。 snorlax:143:normal:460.0kg ditto:132:normal:4.0kg eevee:133:normal:6.5kg 1つ目の要素であるポケモン名と4つ目の要素である体重を取り出します $ cut -d : -f 1,4 pokemons.txt snorlax:460.0kg ditto:4.0kg eevee:6.5kg
tr(LPIC)
sed テキストを置換するコマンドです。 オプション -i 編集結果をファイルに書き込む。 サンプル pokemons.txtの中の最初のsnorlaxをkabigonに置換して表示する $ sed 's/snorlax/kabigon/' pokemons.txt pokemons.txtの中のすべてのsnorlaxをkabigonに置換して表示する $ sed 's/snorlax/kabigon/g' pokemons.txt
tr(LPIC)
tr 標準入力であるキーボードから入力した文字を指定した文字に変換し、標準出力であるディスプレイに表示します。 オプション -d 文字群1で合致した文字を削除する -s 文字列1で合致した文字の繰り返しを1文字に置き換える サンプル 入力された文字を大文字にする $ tr 'a-z' 'A-Z' 入力された文字からsを削除する $ tr -d 's' file.txtの英小文字をすべて大文字にする $ cat file.txt Ditto Slowpoke Snorlax $ tr 'a-z' 'A-Z' < file.txt DITTO SLOWPOKE SNORLAX 以下のコマンドでも英小文字をすべて大文字にする $ cat file.txt | tr 'a-z' 'A-Z' $ tr [:lower:] [:upper:] < file.txt $ tr '[:lower:]' '[:upper:]' < file.txt file.txtからlaxを削除して表示する $ tr -d 'lax' < file.txt Ditto Sowpoke Snor
tail(LPIC)
tail テキストファイルの末尾部分を表示するコマンドです。 デフォルトでは10行目まで表示します。 オプション -n 行数を数字で指定する。 -f ファイルの最終部分を読み続けます。増えていくログファイルの確認に便利です。 サンプル pokemons.txtの末尾を表示 $ tail pokemons.txt pokemons.txtの末尾3行を表示 $ tail -3 pokemons.txt pokemons.txtの末尾を表示し続ける $ tail -f pokemons.txt このコマンドを実行後、pokemons.txtを変更すると末尾が更新されます。
head(LPIC)
head テキストファイルの先頭部分を表示するコマンドです。 デフォルトでは10行目まで表示します。 オプション -n 行数を数字で指定する。 サンプル pokemons.txtの先頭を表示 $ head pokemons.txt pokemons.txtの先頭3行を表示 $ head -3 pokemons.txt
grep(LPIC)
grep テキストデータ内の文字列検索を行うコマンドです。 オプション -v パターンに一致しない行を表示する -n 行番号を表示する -l パターンと一致するファイル名を表示 -i 大文字と小文字を区別しないで検索を行う -e パターンを使って検索を行う サンプル pokemons.txtからSnorlaxを検索する $ grep Snorlax pokemons.txt Snorlax pokemons.txtから大文字小文字の区別なくsnorlaxを検索する $ grep -i SNORLAX pokemons.txt Snorlax pokemons.txtからSnorlax以外を検索する $ grep -v Snorlax pokemons.txt Ditto Slowpoke pokemons.txtから末尾がlaxの行を検索する $ grep -e lax$ pokemons.txt Snorlax
コマンドを続けて実行する(LPIC)
コマンドを続けて実行する 複数のコマンドを続けて実行する方法です。 サンプル ;の前のコマンドの終了コードに関わらずコマンドを順々に実行する $ snorlax ; ls &&の前のコマンドの終了コードが0ならば&&の後のコマンドを実行する $ mkdir snorlax ; ls ||の前のコマンドの終了コードが0以外ならば||の後のコマンドを実行する $ snorlax ; ls
tee(LPIC)
tee 標準入力から読み込んだデータ尾を標準出力とファイルの両方に出力するコマンドです。 サンプル pokemons.txt を行番号付きで読み込み、pokemons-with-line.txt に保存し、最初の2行を表示する。 $ cat -n pokemons.txt | tee pokemons-with-line.txt | head -2 1 snorlax 2 ditto
リダイレクト(LPIC)
リダイレクト リダイレクトをすることで出力結果やエラーをテキストファイルに出力したりすることができます。 標準出力結果を file.txt に出力する $ echo "shorlax" > file.txt 上記の例は以下の例と同等です。 $ echo "shorlax" 1 > file.txt すでに file.txt が存在する状態で上記らのコマンドを実行すると上書きされます。 標準出力結果を file.txt に追記する $ echo "shorlax" >> file.txt ファイルが存在しない場合は作成されます。 $ echo "ditto" >> file.txt $ cat file.txt shorlax ditto 標準エラー出力されたといのみファイルに出力する $ snorlax 2> error.txt snorlx は存在しないコマンドです。 $ cat error.txt zsh: command not found: snorlax 標準出力、標準エラー出力の両方をファイルに出力(追記)する $ echo "snorlax" &>> log.txt $ snorlax &>> log.txt $ cat log.txt snorlax zsh: command not found: snorlax これらの同様に標準出力、標準エラー出力の両方をファイルに出力(追記)します。
cat(LPIC)
cat cat はテキストを表示するために使うコマンドです。 オプション -n 行番号を表示します。 サンプル file.txt を表示する $ cat file.txt file.txt を行番号付きで表示する $ cat -n file.txt 複数行の文字列を表示する $ cat << END I Love Snorlax END 複数行の文字列をファイルに保存する $ cat << END > snorlax.txt I Love Snorlax END
less(LPIC)
less less は1画面に収まらないような長いテキストを表示するために使うコマンドです。 似たコマンドに more があります。 末尾まで行くと自動的にプロンプトへ戻るのが more、戻らないのが less です。 サンプル file.txt を表示する $ less file.txt [Space]キーを押すと次のページが表示されます。
more(LPIC)
more more は1画面に収まらないような長いテキストを表示するために使うコマンドです。 似たコマンドに less があります。 末尾まで行くと自動的にプロンプトへ戻るのが more、戻らないのが less です。 サンプル file.txt を表示する $ more file.txt [Space]キーを押すと次のページが表示されます。 ファイルの最終ページまで閲覧すると同時に終了します。
xz,unxz(LPIC)
xz,unxz xz は圧縮に、unxz は解凍に使われるコマンドです。 サンプル file1.txt をxzで圧縮する $ xz file1.txt file1.txt.xz が生成され、file1.txt が消えます。 file1.txt.xz をunxzで解凍する $ unxz file1.txt.xz file1.txt が生成され、file1.txt.xz が消えます。 file1.txt.xz を snorlax.txt.xz とリネームした後に、unxz snorlax.txt.xz と実行すると snorlax.txt が生成されます。
bzip2,bunzip2(LPIC)
bzip2,bunzip2 bzip2 は圧縮に、bunzip2 は解凍に使われるコマンドです。 サンプル file1.txt をbzip2で圧縮する $ bzip2 file1.txt file1.txt.bz2 が生成され、file1.txt が消えます。 file1.txt.bz2 をbunzip2で解凍する $ bunzip2 file1.txt.bz2 file1.txt が生成され、file1.txt.bz2 が消えます。 file1.txt.bz2 を snorlax.txt.bz2 とリネームした後に、bunzip2 snorlax.txt.bz2 と実行すると snorlax.txt が生成されます。
gzip, gunzip(LPIC)
gzip, gunzip gzip は圧縮に、gunzip は解凍に使われるコマンドです。 サンプル file1.txt をgzipで圧縮する $ gzip file1.txt file1.txt.gz が生成され、file1.txt が消えます。 file1.txt.gz をgunzipで解凍する $ gunzip file1.txt.gz file1.txt が生成され、file1.txt.gz が消えます。 file1.txt.gz を snorlax.txt.gz とリネームした後に、gunzip snorlax.txt.gz と実行すると snorlax.txt が生成されます。 解凍せずに格納されているファイル名を確認する ファイルを作成します。 $ touch file1.txt file2.txt archive.tar を作成します。 $ tar cf archive.tar file1.txt file2.txt archive.tar を圧縮します。 archive.tar が削除され archive.tar.gz が作成されます。 $ gzip archive.tar archive.tar.gz を解凍せずに格納されているファイル名を確認します。 $ gzip -dc archive.tar.gz | tar -tvf - -rw-r--r-- 0 snorlax staff 0 8 9 17:04 file1.
tar(LPIC)
tar アーカイブファイルの管理に使用するコマンドです。 オプション -c アーカイブファイルを作成する -t アーカイブファイルの内容を表示する -X アーカイブファイルを展開する -f アーカイブファイル名を指定する -v 詳細情報を表示する -j アーカイブに対して、bzip2を使用する -J アーカイブに対して、xzを使用する -Z アーカイブに対して、gzipを使用する サンプル file1.txt file2.txt を含む archive.tar を作成する $ tar cf archive.tar file1.txt file2.txt file1.txt file2.txt を含む archive.tar.gz を作成する $ tar cfz archive.tar.gz file1.txt file2.txt gzipで圧縮されているのでgunzipで解凍できます。 $ gunzip archive.tar.gz tarコマンドでも解凍と展開ができます。 $ tar zxf archive.tar.gz file1.txt file2.txt を含む archive.tar.bz2 を作成する $ tar cfj archive.tar.bz2 file1.txt file2.txt bzipで圧縮されているのでbunzip2で解凍できます。 $ bunzip2 archive.tar.bz2 tarコマンドでも解凍と展開ができます。 $ tar jxf archive.
chsh(LPIC)
chsh ユーザーをログインをできないようにするコマンドです。 サンプル ユーザーを対話的なログインをできないようにする sshコマンドによるログインやsuコマンドによるアカウントの変更ができなくなります。 $ chsh -s /bin/false snorlax $ cat /etc/passwd | grep snorlax snorlax:x:1000:1000::/home/snorlax:/bin/false
JavaScriptで数値か文字列か判定する
JavaScriptで数値か文字列か判定する方法です。 isNaN() を使うと数値化文字列か判定することができます。 数値ではない場合は true 、数値の場合は false を返します。
UICollectionViewでContextMenuを使う
UICollectionViewでContextMenuを使う方法です。 セルを長押しするとContextMenuを表示します。 参考: iOS13から追加されるContext Menusについて
Terraformを使ってサーバーレスでサービスを作成したので振り返る
はじめに 個人開発でサービスを作るのが趣味です。 Terraform, Lambda, DynamoDBを使ってサーバーレスで簡単なービスを作成してみました。 未来の僕が現在の僕の思考を振り返られるように記事にしました。 今までの構成 今まではSpring Boot, MySQL, AWS, Conoha VPCなどを使ってサービスを作っていました。 このような構成です。 ALB + Fargate + RDSを使った構成 ConoHa VPC + RDSを使った構成 この構成では突発的な負荷に弱かったり、お金がかかりすぎてしまうことがありました。 ALB + Fargate + RDSを使った構成では5000円/月ほど、ConoHa VPC + RDSを使った構成では3000円/月ほどサービスの維持に必要です。さらに開発環境を用意しようとすると倍のお金がかかります。 この問題を解決するためにTatteform, Lambda, DynamoDBなどを使いうことで負荷に強く低コストで運営できるサーバーレスでサービス作成することにチャレンジしました。 今回の構成 今回作成したサービスはiOSアプリにレビューが付くとSlackに通知してくれるサービスです。(作成したと言っても全然未完成です、リポジトリは こちら) このような構成です。 アプリケーション(API)は Lambdaの関数URL機能とDynamoDBを使っています。 Lambdaの言語はPythonです。 フロントは生のHTML、JSで作成し、S3とCloudFrontでホスティングしています。 アプリのレビューチェックなどの定期実行にはAmazon EventBridgeとECS Fargateを使っています。 イメージのビルドやデプロイにはGithubAction を使っています。 本番環境と開発環境の管理にはAWS OrganizationとTerraformのはWorkspace機能を使っています。 良かったこと 負荷に強くなった LambdaとDynamoDBによるサーバーレス構成にしたことで負荷に強くなりました。 いつバズっても負荷を気にしなくても済みます。バズったことないですが。 サーバー代が安くなった お金のかかるRDS, Fargateなどを使うのをやめたので(ユーザーが少ない間は)サーバー代が安くなりました。500円/月程度です。 またにコード管理をすることで簡単に開発環境のリソースを消したり作り直したりすることができるようになり、開発環境でお金がかからなくなりました。 全てをコード管理できるようになった 全てをコード管理することで、インフラ部分のコードを使いまわせるようになりました。 簡単に開発環境のリソースを消したり作り直したりすることができるようになったのは嬉しいです。 悪かったこと テストが書きにくい、ローカルで実行できない 今までSpring Boot(JUnit)を使っていたのでテストを書くのが簡単でした。 この構成では単体テストがとにかく書きにくいです。というより書くための仕組みがありません。 ローカルで実行できないのでCIでテストを回すことができません。 何かしらローカルでテストを実行する仕組みを用意する必要を感じました。 後述のServerless Frameworkで良い感じに解決できるのかもしれません。
EC2インスタンスのバックアップを作成する(AMI)
EC2インスタンスのバックアップを作成する方法です。 EC2インスタンスをバックアップする方法はいくつかありますが、今回はAMI(Amazon Machine Images)を作成します。 まずはEC2インスタンスを起動させ、Nginxのインストールと自動設定を行います。詳しくはこちら yum search nginx sudo amazon-linux-extras install nginx1 nginx -v sudo systemctl start nginx sudo systemctl status nginx sudo systemctl enable nginx EC2インスタンスのIPアドレスを入力し、Nginxのデモページが表示されることを確認します。 デモページを確認したらEC2インスタンスを停止し、「アクション」->「イメージとテンプレート」->「イメージの選択」を選択します。 EC2インスタンスの起動画面から作製したAMIを選択するすることで復元することができます。 (イメージ作成から少し待たないとEC2インスタンスを起動できませんでした) AMIの削除するにはAMIのページから「アクション」->「AMIの登録解除」から削除できます。 イメージ作製時にスナップショットも作成されるので、スナップショットも一緒に削除する必要があります。
メタキャラクター(LPIC)
メタキャラクター メタキャラクターは特別な意味や役割を持つ文字です。 サンプル .txt拡張子を持つファイルを表示 $ ls *.txt mem?.md(?部分は任意の文字)を表示 $ ls mem?.md
fileコマンド(LPIC)
file ファイルの種類を調べるコマンドです。 オプション -i MINEタイプで表示する サンプル file.txt のファイルの種類を調べる $ file file.txt file.txt: ASCII text
touchコマンド(LPIC)
touch ファイルを作成するコマンドです。 サンプル hello.txtを作る $ touch hello.txt タイムスタンプを指定してhello.txtを作る $ touch --date="2022/8/8 12:00" 8-8.txt $ ls -l 8-8.txt -rw-r--r-- 1 root root 0 Aug 8 12:00 8-8.txt
rmdirコマンド(LPIC)
rmdir ディレクトリを削除するコマンドです。 サンプル helloディレクトリを削除する $ rmdir hello helloディレクトリは空である必要があります。
rmコマンド(LPIC)
rm ファイルを削除するコマンドです。 オプション -i ファイルを削除する前にユーザーへ確認する -f ユーザーへの確認無しに削除する -R(もしくは-r) 指定されたディレクトリ内にファイル、ディレクトリが存在していても全て削除する サンプル memo3.txt を削除する $ rm memo3.txt /tmp ディレクトリの下にあるサブディレクトリを全て削除する $ rm -rf /tmp/*
mvコマンド(LPIC)
mv ファイルやディレクトリの移動に使用するコマンドです。 memo.txt を memo2.txt にリネームする $ mv memo.txt memo2.txt /tmp/snorlax ディレクトリにあるすべてのファイル、サブディレクトリをカレントディレクトリに移動させる $ mv -f /tmp/snorlax/ .
cpコマンド(LPIC)
cp ファイルやディレクトリを複製する場合に使うコマンドです。 オプション -i コピー先に同名ファイルが存在する場合、上書きするか確認する -f コピー先に同名ファイルが存在する場合、上書きするか確認する -p コピーした元の所有者、タイムスタンプ、アクセス権などの情報を保持したままコピーする -R(もしくは-r) コピー元のディレクトリ改装をそのままコピーする サンプル memo.txt を memo2.txt という名前でコピーする $ cp memo.txt memo2.txt ffmepg というディレクトリ内のすべてのファイル、サブディレクトリを ffmpeg2 という名前でコピーする $ cp -r ffmepg ffmpeg2 フォルダごとcpコマンドでコピーする $ tree . └── snorlax ├── charamander └── slowpoke $ cp -r snorlax ditto . ├── ditto │ ├── charamander │ └── slowpoke └── snorlax ├── charamander └── slowpoke コマンド1、コマンド2を終了コード関係なく順々に実行する $ コマンド1 ; コマンド2 コマンド1の終了コードが0ならコマンド2を実行する $ コマンド1 && コマンド2 コマンド1の終了ステータスが0以外ならコマンド2を実行する $ コマンド1 || コマンド2 headはテキストファイルの先頭部分を表示するコマンドです。-[数字]で行数を指定します。デフォルトは10行です。 $ head -5
lsコマンド(LPIC)
ls ファイルやディレクトリの情報を一覧表示するコマンドです。 オプション -F ファイルタイプを表す記号の表示。 /はディレクトリ、*は実行可能ファイル、@はシンボリックリンク。 -a 隠しファイル(ファイル名がドット「.」で始まるファイル)の表示 -l 詳細の情報を含めて表示 -d ディレクトリの内容ではなく、ディレクトリ自身の情報の表示 サンプル ディレクトリの情報を詳細な情報を含めて一覧を表示する $ ls -ld 隠しファイルも含めて表示 $ ls -a パーミッション、ファイルの所有者、所属するグループを表示 $ ls -l
LPICレベル1で出てくるLinuxコマンドのまとめ
LPICレベル1で出てくるLinuxコマンドのまとめです。 bzip2,bunzip2 bzip2 は圧縮に、bunzip2 は解凍に使われるコマンドです。 cat cat はテキストを表示するために使うコマンドです。 cp ファイルやディレクトリを複製する場合に使うコマンドです。 file ファイルの種類を調べるコマンドです。 gzip, gunzip gzip は圧縮に、gunzip は解答に使われるコマンドです。 ls ファイルやディレクトリの情報を一覧表示するコマンドです。 mv ファイルやディレクトリの移動に使用するコマンドです。 mkdir ディレクトリを作成するコマンドです。 rm ファイルを削除するコマンドです。 rmdir ディレクトリを削除するコマンドです。 touch ファイルを作成するコマンドです。 chsh ユーザーをログインをできないようにするコマンドです。 tar アーカイブファイルの管理に使用するコマンドです。 xz,unxz xz は圧縮に、unxz は解凍に使われるコマンドです。 tee 標準入力から読み込んだデータ尾を標準出力とファイルの両方に出力するコマンドです。 more more は1画面に収まらないような長いテキストを表示するために使うコマンドです。 less less は1画面に収まらないような長いテキストを表示するために使うコマンドです。 メタキャラクター メタキャラクターは特別な意味や役割を持つ文字です。 リダイレクト 出力結果やエラーをテキストファイルに出力したりすることができます。 コマンドを続けて実行する 出力結果やエラーをテキストファイルに出力したりすることができます。 grep テキストデータ内の文字列検索を行うコマンドです。 head テキストファイルの先頭部分を表示するコマンドです。 tail テキストファイルの末尾部分を表示するコマンドです。 tr 標準入力であるキーボードから入力した文字を指定した文字に変換し、標準出力であるディスプレイに表示するコマンドです。 sed テキストを置換するコマンドです。 cut ファイル内の行中の特定部分のみを取り出すコマンドです。 wc テキストファイルの文字数や行数を数えるコマンドです。 od ファイルの内容を8進数で表示するコマンドです。 sha256sum,sha512sum SHA256ハッシュ値を求めるコマンドです。
curlでLambdaの関数URLにデータ付きでリクエストを送る
curlでLambdaの関数URLにリクエストを送る方法です。 Lambdaと関数URLの作成方法は こちら を参考にしてください。 Lmabdaにデータを送る Lambda に snorlax というデータを送ります。 受け取ったデータは event['body'] で受け取ることができますが、base64でデコードする必要があります。 import json import base64 def lambda_handler(event, context): body = event['body'] decoded_body = base64.b64decode(body).decode() response = { 'pokemon': decoded_body } return { 'statusCode': 200, 'body': json.dumps(response) } curl -X POST -d 'snorlax' {ENDPOINT_URL} | jq { "pokemon": "snorlax" } LmabdaにJSONデータを送る Lambda に {"pokemon":"snorlax"} というデータを送ります。 受け取ったデータは event['body'] で受け取ることができますが、base64でデコードし、mapに変換する必要があります。 import json import base64 def lambda_handler(event, context): print('---') print(event['body']) print('---') body = event['body'] decoded_body = base64.
Swiftのasync,awaitを使ってAPIをフェッチする
Swiftのasync,awaitを使ってAPIをフェッチする方法です。 従来のClosureを使った方法とasyncを使った方法です。
ECS-EC2でnginxを動かす
ECS-EC2でnginxを動かす方法です。 ロール作成 ECSで使用するロール、sample-ecs-nginx-role を作成します。 CloudWatchFullAccess と AmazonECS_FullAccess のポリシーをアタッチし、信頼関係を以下のようにアタッチします。 { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": [ "ecs.amazonaws.com", "ecs-tasks.amazonaws.com" ] }, "Action": "sts:AssumeRole" } ] } ECS-EC2クラスター作成 sample-ecs-nginx-cluster を作成します。 インスタンスサイズ、インスタンス数、VPCなどを設定します。 パブリックIPインスタンス付きでEC2インスタンスを起動できるようにパブリックサブネットを指定します。 EC2インスタンスが作成されたことを確認します。 EC2インスタンスにSSH接続 作成されたEC2インスタンスにSSH接続します。 アタッチされているセキュリティグループのインバウンドルールを編集し、SSH接続します。 $ ssh -i {KEY_PAIR_PATH} ec2-user@{PUBLIC_IP} EC2インスタンスの中で docker ps コマンドを実行すると、EC2インスタンスのエージェントが動いていることがわかります。 $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a7c91bb55799 amazon/amazon-ecs-agent:latest "/agent" 5 minutes ago Up 5 minutes (healthy) ecs-agent タスク定義作成 タスク定義、sample-ecs-nginx-task-definition を作成します。 コンテナに nginx:latest を指定します。
CodeBuildでC言語をビルドする
CodeBuildでC言語をビルドする方法です。 C言語を書き、main.c というファイル名で保存します。 #include <stdio.h> int main(void){ printf("Hello World!!"); } 以下のコマンドでビルドすることができます。 $ gcc main.c -o main S3バケットを作成します。 コードをアップロードします。 コードビルドを作成します。 ソースはS3を設定します。 Buildspecは以下のように設定します。 CodeBuildのロールにはS3へのアクセス権を付与します。 version: 0.2 phases: build: commands: - gcc --version - ls - gcc main.c -o main - aws s3 cp main s3://swiswiswift-clang-bucket/output/main ビルドを実行するとS3に実行結果がアップロードされます。
AWSでEC2をプライベートサブネットに設置する
AWSでEC2をプライベートサブネットに設置する方法です。 Private-Subnetを作成します。 Private-SubnetにEC2インスタンスを作成します。 パブリックIPが無いため、外部からSSHすることはできません。 Public-Subnetに踏み台インスタンスをインスタンスを作成します。 $ ssh -i key-pair.pem ec2-user@{PUBLIC_EC2_IP} scpでPublic-Instanceにキーペア(秘密鍵)を送信します。 $ scp -i key-pair.pem key-pair.pem ec2-user@{PUBLIC_EC2_IP}:/home/ec2-user/key-pair.pem 秘密鍵の権限を設定します。 $ chmod /home/ec2-user/key-pair.pem Private Instance にアクセスします。 $ ssh -i key-pair.pem ec2-user@{PRIVATE_INSTANCE_LOCAL_IP} Private Instance の中からではインターネットにアクセスできないことを確認します。 $ curl http://abehiroshi.la.coocan.jp/ # アクセスできない NATゲートウェイを作成します。 Routeテーブルの作成し、送信元の設定とサブネットの関連付けを行います。 これでPublic-Instanceからインターネットにアクセスすることができます。 $ curl http://abehiroshi.la.coocan.jp/
Dockerイメージを作成してECSで動かす
Dockerイメージを作成してECSで動かします。 Dockerのおさらいとnginxイメージについて nginxのイメージに手を加えてカスタムイメージを作成します。 nginxのイメージをプルします。 $ docker pull nginx:1.23.1 nginxのコンテナを動かし、ブラウザからlocalhostにアクセスします。 nginxのデモページが表示されることを確認します。 $ docker run --rm -p 80:80 nginx -d オプションを付けるとバックグラウンドで動かすことができます。 $ docker run --rm -d -p 80:80 nginx docker logs コマンドでコンテナのログを確認することができます。 $ docker logs コンテナID 以下のコマンドでDockerイメージの中に入ることができます。 $ docker run --rm -it nginx /bin/sh カスタムイメージの作成 nginxのデモページは /usr/share/nginx/html にあります。 以下のような Dockerfile と index.html を同じディレクトリに作成します。 FROM nginx COPY index.html /usr/share/nginx/html/index.html <h1>Hello</h1> イメージをビルドします。 $ docker build . -t custom-nginx 作成したイメージが動くか確認します。 $ docker run --rm -p 80:80 custom-nginx ECRへイメージをプッシュする。 ECRでリポジトリを作ります。
シェル変数と環境変数
シェル変数と環境変数の違いについての解説です。 シェル変数は子プロセスでその値を呼び出すことはできませんが、環境変数は可能です。 シェル変数 シェル変数は [変数名]=[値] で設定できます。 $ MY_SHELL_VAR="This is shell variable." 環境変数 環境変数は export [変数名]=[値] で設定できます。 $ export MY_ENV_VAR="This is environment variable." シェル変数と環境変数の違い どちらも変数であるのでこのように echo で変数の値を呼び出すことができます。 $ echo $MY_SHELL_VAR // This is shell variable. $ echo $MY_ENV_VAR // This is environment variable. シェル変数と環境の違いは子プロセスでその値を使えるか使えないかです。 シェル変数は子プロセスでその値を呼び出すことはできませんが、環境変数は可能です。 たとえば以下のような script.sh を作成して実行します。 echo $MY_SHELL_VAR echo $MY_ENV_VAR $ sh script.sh 1行目のシェル変数の部分は何も表示されず、2行目の環境変数の部分のみが表示されます。 シェル変数は子プロセスに値が引き継がれないためです。 This is enviroment variable. シェル変数を環境変数にする シェル変数を環境変数にすることもできます。 export [シェル変数] で変数を環境変数にすることができます。 $ export MY_SHELL_VAR 上記コマンド実行後に sh script.
DynamoDBのItemを一度に削除する(batch-write-item)
DynamoDBのItemを一度に削除する方法です。 batch-write-item を使うことで一度に削除することができます。 今回はLocalStackで試したので、--endpoint-url オプションを使用しています。 AWSの場合は最後の行を除いて実行してください。 テーブルを作成 pokemon-table という名前でテーブルを作成します。 プライマリーキーに pokemonID を指定します。 $ aws dynamodb create-table \ --table-name pokemon-table \ --attribute-definitions AttributeName=pokemonID,AttributeType=S \ --key-schema AttributeName=pokemonID,KeyType=HASH \ --provisioned-throughput ReadCapacityUnits=1,WriteCapacityUnits=1 \ --endpoint-url=http://localhost:4566 Itemの追加 Snorlax, Ditto, Pikachu, Eevee の4つのItemを追加します。 $ aws dynamodb put-item \ --table-name pokemon-table \ --item '{"pokemonID": {"S": "Snorlax"}}' \ --endpoint-url=http://localhost:4566 | jq $ aws dynamodb put-item \ --table-name pokemon-table \ --item '{"pokemonID": {"S": "Ditto"}}' \ --endpoint-url=http://localhost:4566 | jq $ aws dynamodb put-item \ --table-name pokemon-table \ --item '{"pokemonID": {"S": "Pikachu"}}' \ --endpoint-url=http://localhost:4566 | jq $ aws dynamodb put-item \ --table-name pokemon-table \ --item '{"pokemonID": {"S": "Eevee"}}' \ --endpoint-url=http://localhost:4566 | jq テーブルの中のItemをすべて表示 4つのItemがあることがわかります。
LambdaでBMIを計算するAPIを作成してJSで呼び出す
LambdaでBMIを計算するAPIを作成してJSで呼び出す方法です。 LambdaでAPIを作成する Lambdaと関数URLを使ってAPIを作成します。 マネジメントコンソールからLambda関数を作成します。 以下のcurlコマンドを実行し、bmiが計算されることを確認します。 {ENDPOINT_URL} は関数URLの値です。 curl -X POST -H "Content-Type: application/json" -d '{"hight":170, "weight":60}' {ENDPOINT_URL} { "bmi": 20.761245674740486 } CORSの設定 オリジンが異なるJSからAPIを使うにはCORSの設定を行う必要があります。 許可ヘッダーに content-type を入力し、許可メソッドに POST を追加します。 HTMLとJSを作成 以下のコードを参考にしながら index.html と script.js を作成します。 計算ボタンを押すとBMIが計算されるとBMIがアラートで表示されます。 JS中の {ENDPOINT_URL} は関数URLの値を使用します。
LambdaでBMIを計算するAPIを作成する
LambdaでBMIを計算するAPIを作成する方法です。 以下のコードをコードタブに貼り付けLambda関数を作成します。 次に関数URLを作成します。 curl から作成した関数URLに対してリクエストを送ります。 curl -X POST -H "Content-Type: application/json" -d '{"hight":170, "weight":60}' {ENDPOINT_URL} 以下のようなレスポンスが返れば成功です。 { "bmi": 20.761245674740486 }
SwiftUIでObservableObjectの@publishedなプロパティとBindingをする
SwiftUIでObservableObjectの@publishedなプロパティとBindingをする方法です。 ここでは AddItemViewState まで ContentView の items をバケツリレーしています。
iOSのファイルアプリ(UIDocumentPickerViewController)を開いてドキュメントフォルダに保存したファイルを開く
iOSのファイルアプリ(UIDocumentPickerViewController)を開いてドキュメントフォルダに保存したファイルを開く方法です。 info.plist にファイルアプリでドキュメントディレクトリを開けるように Supports opening documents in place と Application supports iTunes file sharing を追加し、どちらも YES に設定します。
Swiftで複数のViewをドラッグで移動する
Swiftで複数のViewをドラッグで移動する方法です。 ViewController でタッチのイベントを検出し、PokemonViewであればViewを移動させています。 同時にContextMenuのinteractionも設定しています。
Swiftでドラッグで移動し、長押しでContextMenuを表示する
Swiftでドラッグで移動し、長押しでContextMenuを表示する方法です。 ViewController でタッチのイベントを検出し、その箇所にViewを移動させています。 同時にContextMenuのinteractionも設定しています。
Swiftでタップ、ドラッグした箇所にViewを移動させる
Swiftでタップ、ドラッグした箇所にViewを移動させる方法です。 ViewController でタッチのイベントを検出し、その箇所にViewを移動させています。
Swiftで配列からランダムに要素を取り出す
Swiftで配列からランダムに要素を取り出す方法です。 配列をシャッフルした後に先頭の要素を取得しています。 // 0, 1, 2, ... 9 の配列からランダムに5要素抽出する var numbers: [Int] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] print(numbers) // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] // 配列をシャッフルする numbers.shuffle() print(numbers) // [1, 7, 9, 4, 6, 2, 0, 3, 8, 5] // .prefix を使い先頭の5要素を取得する。prefix の戻り値の型は Array<T> ではなく、ArraySlice<T> なので変換する必要がある。 let arraySlicedNumbers: ArraySlice<Int> = numbers.prefix(5) let slicedNumbers: [Int] = Array(arraySlicedNumbers) print(slicedNumbers) // [1, 7, 9, 4, 6]
Swiftで16進数を使う
Swiftで16進数を使う方法です。 0x を使うことで16進数を表現できます。(1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f, 10, 11, 12, …, 19, 1a, 1b) 0x12 は10進数で18です。 let number: Int = 0x12 print(number) // 18
Swiftで桁数を指定する
e の後ろに桁数を指定することができます。 let number: Double = 123e2 print(number) // 12300.0 負の値にすると小数点にできます。 let number: Double = 123e-4 print(number) // 0.0123
Swiftで関数の引数にジェネリクスを使う
Swiftで関数の引数にジェネリクスを使う方法です。 以下のように記述することで、引数に Int でも String でも受け取ることが可能になります。 func createTuple<T>(a: T, b: T) -> (T, T) { return (a, b) } let stringTuple: (String, String) = createTuple(a: "Snorlax", b: "Ditto") print(stringTuple) // ("Snorlax", "Ditto") let intTuple: (Int, Int) = createTuple(a: 143, b: 132) print(intTuple) // (143, 132)
PlaygroundでViewのプレビューを表示する
PlaygroundでViewのプレビューを表示する方法です。 PlaygroundPage.current.liveView に表示したいViewを設定することでプレビューを表示できます。
SwiftでSetから要素を削除する
SwiftでSetから要素を削除する方法です。 remove を使うことで要素を削除することができます。 var mySet: Set = [1, 2, 3, 4] mySet.remove(3) print(mySet) // [1, 2, 4] 存在しない要素に対して remove しても例外は発生しません。 var mySet: Set = [1, 2, 3, 4] mySet.remove(6) print(mySet) // [4, 2, 3, 1]
Pythonで別ファイルの関数を実行する
Pythonで別ファイルの関数を実行する方法です。 functions.py で定義した hello() を main.py で実行しています。 $ python main.py
EC2にMySQLをインストールする
EC2インスタンスにMySQLをインストールする方法です。 # ルートユーザーに切り替える。 sudo su - # インストール可能なパッケージの一覧を更新する。 yum update # mariadbと関連パッケージを削除 yum remove mariadb-* # MySQLのリポジトリをyumに追加する yum localinstall https://dev.mysql.com/get/mysql80-community-release-el7-5.noarch.rpm # mysql-community-server, mysql-community-devel をインストールする yum install --enablerepo=mysql80-community mysql-community-server yum install --enablerepo=mysql80-community mysql-community-devel # mysqlと関連パッケージがインストールされていることを確認 yum list installed | grep mysql # MySQLのバージョンを確認 mysql --version # /var/log/mysqld.log ファイルを作成 touch /var/log/mysqld.log # MySQLの起動と確認 systemctl start mysqld systemctl status mysqld.service # 初期パスワード探す。`W.F:XG0a(c=o` が初期パスワードです cat /var/log/mysqld.log | grep root 2022-04-20T07:18:39.168643Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: W.
ターミナルのアカウント名を一時的に変更する
ターミナルのアカウント名を一時的に変更する方法です。 以下のコマンドで一時的にアカウント名を変えることができます。 $ export PS1="snorlax %# " カレントディレクトリを表示する場合は %1~ を使います。 $ export PS1="%1~ %# "
Lambdaトリガー(Lambda Permission)のStatement IDを確認する
Lambdaトリガー(Lambda Permission)のStatement IDを確認する方法です。 Terraform で API Gateway のLambdaトリガーをインポートするには関数名とLambdaトリガーのStatement IDが必要です。 以下のコマンドで確認することができました。 $ aws lambda get-policy --function-name {YOUR-FUNCTION-NAME} | jq Resource: aws_lambda_permission
API GatewayのリソースIDを取得する
API GatewayのリソースIDを取得する方法です。 Terraform で API Gateway のリソースをインポートするには REST-API-ID と RESOURCE-ID が必要ですが、マネジメントコンソール上では確認することができません。 以下のコマンドで確認することができました。 $ aws apigateway get-resources --rest-api-id {REST-API-ID} | jq Resource: aws_api_gateway_resource
SwiftUIで画像をピンチで拡大する(UIImageView + UIScrollView)
SwiftUIで画像をピンチで拡大する方法です。 UIImageViewとUIScrollViewを使って画像をピンチで拡大します。 他にはこのような方法があります。 SwiftUIで画像をピンチで拡大する(MagnificationGesture) SwiftUIで画像をピンチで拡大する(PDFView)
SwiftUIで画像をピンチで拡大する(PDFView)
SwiftUIで画像をピンチで拡大する方法です。 画像をピンチで拡大します。 他にはこのような方法があります。 SwiftUIで画像をピンチで拡大する(MagnificationGesture) SwiftUIで画像をピンチで拡大する(UIImageView + UIScrollView) 参考: Isn’t there an easy way to pinch to zoom in an image in Swiftui?
SwiftUIで画像をピンチで拡大する(MagnificationGesture)
SwiftUIで画像をピンチで拡大する方法です。 MagnificationGestureを使った方法で画像をピンチで拡大します。 ただこの方法ではドラッグすることができないので、他の方法にする必要があります。 他にはこのような方法があります。 SwiftUIで画像をピンチで拡大する(PDFView) SwiftUIで画像をピンチで拡大する(UIImageView + UIScrollView)
findコマンドでディレクトリを探す
findコマンドでディレクトリを探す方法です。 findコマンドで2階層以内のsnorlaxディレクトリを検索します。 . ├── slowpoke │ └── snorlax └── snorlax └── snorlax └── snorlax └── snorlax └── snorlax find . -type d -maxdepth 2 -name "snorlax" ./snorlax ./snorlax/snorlax ./slowpoke/snorlax
cut コマンドで文字をカットする
cutコマンドを使うことで文字列を切り取ることができます。 2文字目から4文字目をカットしています。 echo "123456" | cut -b 2-4 # 234 また区切り文字を指定して切り取ることもできます。 /区切りで配列を作り、二要素目を取り出すイメージです。 0始まりではないので注意が必要です。 echo "slowpoke/snorlax/eevee/meowth/ditto" | cut -d "/" -f 2 # snorlax
Dockerビルドに秘密情報を使う
Dockerビルドに秘密情報を使う方法です。 Dockerビルド時にアクセスキーなどの秘密情報が必要な場合は --mount=type=secret を使用します。 --mount=type=secret を使用することで秘密情報をイメージの中に残さずにビルドすることができます。 FROM ubuntu RUN echo hello RUN --mount=type=secret,id=my-secret cat /run/secrets/my-secret > secret.txt CMD cat secret.txt docker build --secret id=my-secret,src=secret.txt -t swiswiswift:latest . docker run swiswiswift:latest
Spring Bootの起動時に文字列の配列を渡す
Spring Bootの起動時に文字列の配列を渡す方法です。 以下のようなオプションを付与することで pokemons に文字列の配列を渡すことができます。 java \ -jar -Dexec.mainClass=com.swiswiswift.spring.Application build/libs/spring-0.0.1-SNAPSHOT.jar \ --pokemons='"snorlax","pikachu","ditto"'
API Gatewayに独自ドメインを設定する
API Gatewayに独自ドメインを設定する方法です。 API Gateway用のLambda関数を作成します。 API GatewayでRestAPIを作ります。 メソッドを作成します。先ほど作成した Lambda関数を設定します。 アクションから「APIのデプロイ」を選択します。 ステージが既に作られていない場合はステージを作成します。 作成されたステージ + メソッド名をブラウザに入力し、"Hello from Lambda!" と表示されることを確認します。 今回の場合は https://yyd1qtujv0.execute-api.ap-northeast-1.amazonaws.com/production となります。 API Gateway でカスタムドメインを作成します。api-gateway.swiswiswift.com というドメインを作成します。事前ににACM証明書を用意する必要があります。 API Mappingの設定を行います。 Route53でレコードを設定します。 レコード名を先に入力しないとAPI Gateway のエイリアスに候補が出てこないので注意が必要です。 https://api-gateway.swiswiswift.com/ にアクセスしてレスポンスが帰ることを確認します。http -> https のリダイレクトは無いので注意が必要がです。
API GatewayとLambdaとDynamoDBを組み合わせてToDoアプリを作る
GatewayとLambdaとDynamoDBを組み合わせてToDoアプリを作る方法です。 Lambda 関数を作ります。 API GatewayでRestAPIを作ります。 アクションから「リソースの作成」を選択します。 アクションから「メソッドの作成」を選択します。 Getを選択し、先ほど作成したLambda関数と連携させます。 アクションから「APIのデプロイ」を選択します。 デプロイ先のステージを選択します。ステージがない場合は新しいステージを作成します。 作成されたステージ + メソッド名をブラウザに入力し、"Hello from Lambda!" と表示されることを確認します。 今回の場合は https://eio7s05pk1.execute-api.ap-northeast-1.amazonaws.com/production/todo-app となります。 次にDynamoDBを作ります。 todo-table というテーブルを作り、todoMessage をパーテーションキーに、todoDate をソートキーに設定します。 todo-table にデータを入れていきます。 aws dynamodb put-item \ --table-name todo-table \ --item '{ "todoMessage": { "S": "Clean My Room" }, "todoDate": { "S": "2022-03-20T00:00:00Z" } }' aws dynamodb put-item \ --table-name todo-table \ --item '{ "todoMessage": { "S": "Shopping" }, "todoDate": { "S": "2022-03-19T00:00:00Z" } }' aws dynamodb put-item \ --table-name todo-table \ --item '{ "todoMessage": { "S": "Programing" }, "todoDate": { "S": "2022-03-18T00:00:00Z" } }' 追加したデータを確認します。
SwiftUIでMapViewを使い複数の位置情報を選択する
SwiftUIでMapViewを使い複数の位置情報を選択する方法です。 addボタンを押した位置情報を記録します。listボタンを押すとその位置情報の一覧を表示します。
AWS CLIでDynamoDBを操作する
AWS CLIでDynamoDBを操作する方法です。 AWS マネジメントコンソールから pokemon-table という名前でテーブルを作ります。 pokemonNumber というパーテーションキーを数字型設定しました。 list-tables テーブル一覧を表示します。 aws dynamodb list-tables | jq { "TableNames": [ "pokemon-table" ] } describe-table テーブル詳細を表示します。 aws dynamodb describe-table \ --table-name pokemon-table | jq { "Table": { "AttributeDefinitions": [ { "AttributeName": "pokemonNumber", "AttributeType": "N" } ], "TableName": "pokemon-table", "KeySchema": [ { "AttributeName": "pokemonNumber", "KeyType": "HASH" } ], "TableStatus": "ACTIVE", "CreationDateTime": "2022-03-14T08:50:51.248000+09:00", "ProvisionedThroughput": { "NumberOfDecreasesToday": 0, "ReadCapacityUnits": 5, "WriteCapacityUnits": 5 }, "TableSizeBytes": 0, "ItemCount": 0, "TableArn": "arn:aws:dynamodb:ap-northeast-1:xxxxxxxxxxxx:table/pokemon-table", "TableId": "20804895-068c-4096-8b9d-0dada0bdeeb1" } } put-item テーブルにアイテムを追加します。
DynamoDBのスキャン時に「Attribute name is a reserved keyword; reserved keyword: type」が出る
DynamoDBのスキャン時に「Attribute name is a reserved keyword; reserved keyword: type」が出る時の対処法です。 カラム名にDynamoDBの予約語が使われていると出ました。 具体的にはテーブルに以下のようなアイテムを追加し、type でスキャンするとエラーが起きました。 aws dynamodb put-item \ --table-name pokemon-table \ --item '{ "number": { "N": "143" }, "name": { "S": "Snorlax" }, "type": { "S": "Normal" } }' aws dynamodb scan \ --table-name pokemon-table \ --filter-expression 'type = :tp' \ --expression-attribute-values '{ ":tp": { "S": "Normal" } }' An error occurred (ValidationException) when calling the Scan operation: Invalid FilterExpression: Attribute name is a reserved keyword; reserved keyword: type expression-attribute-names を使い、type に別名を付けることで回避できました。
プロファイルを使って複数のAWSアカウントを使い分ける
プロファイルを使って複数のAWSアカウントを使い分ける方法です。 一台のPCから複数のAWSアカウントの使い分けるためにプロファイルを使います。 サンドボックス用のプロファイルを作成し、アクセスキーとシークレットアクセスキーを入力します。 aws configure --profile sandbox --profile sandbox を付与するととでアカウントを使い分けることができます。 aws s3api list-buckets | jq aws s3api list-buckets --profile sandbox | jq
LambdaのコードをCLIから更新する
LambdaのコードをCLIから更新する方法です。 list-functions コマンドで更新したい関数名を確認します。 aws lambda list-functions | jq 次にアップロードしたいファイルを zip にします。 zip -r lambda.zip . update-function-code で zip ファイルをアップロードします。 aws lambda update-function-code --function-name ${FUNCTION_NAME} --zip-file fileb://lambda.zip
ALBに独自ドメインを設定してHTTPSにする
ALBに独自ドメインを設定してHTTPSにする方法です。 ALBの向き先をnginxをインストールしたEC2インスタンスに設定し、ACMを使ってHTTPSにします。 EC2インスタンスの設定 まずEC2インスタンスをパブリックサブネットに作成します。 Amazon Linux2, インスタンスタイプは t2.nano で作りました。 無料枠が残っている場合は t2.micro で作ると良いかもしれません。 次にSSH用のキーペアに権限を調整し、SSHログインします。 パブリックIPアドレスはEC2インスタンスのコンソールから確認します。 $ chmod 400 key-pair.pem $ ssh -i key-pair.pem ec2-user@{IP_Address} nginxをインストールします。 $ yum search nginx $ sudo amazon-linux-extras install nginx1 $ nginx -v nginxを起動します。起動したことを確認します。 $ sudo systemctl start nginx $ sudo systemctl status nginx 次にインターネットからEC2インスタンスにアクセスできるようにセキュリティグループで80番ポートを許可します。 ブラウザにEC2インスタンスのパブリックIPを入力してアクセスするとnginxのページが表示されることを確認します。 ALBとターゲットグループの設定 次にALBの設定を行います。 EC2 -> ロードバランサー と進み、Application Load Balancer を選択して作成します。 ALBの作成にはターゲットグループが必要なので、Listeners and routing の項目の Create target group からターゲットグループを作成します。 ターゲットタイプにインスタンスを設定しターゲットグループを作成します。 先ほど作成したEC2インスタンスを登録します。 ALBの作成画面に戻り、先ほど作成したターゲットグループを設定し、ALBを作成します。
EC2インスタンスにnginxをインストールしてブラウザからアクセスする
EC2インスタンスを立ててnginxをインストールしてブラウザからアクセスする方法です。 まずSSH用のキーペアに権限を付与します。 chmod 400 key-pair.pem キーペアを使ってSSHログインします。 ssh -i key-pair.pem ec2-user@{IP_Address} nginxをインストールします。 yum search nginx sudo amazon-linux-extras install nginx1 nginx -v nginxを起動します。起動したことを確認します。 sudo systemctl start nginx sudo systemctl status nginx 次にインターネットからEC2インスタンスにアクセスできるようにセキュリティグループで80番ポートを許可します。 ブラウザにEC2インスタンスのパブリックIPを入力してアクセスするとnginxのページが表示されることを確認します。 次にローカルの index.html ファイルを scp コマンドでEC2インスタンスに転送します。 chmod 777 index.html scp -i key-pair.pem index.html ec2-user@{IP_Address}:/home/ec2-user nginx のページの index.html ファイルは /usr/share/nginx/html/html/index.html にあるので、先ほどアップロードした index.html で上書きします。 mv /home/ec2-user/index.html /usr/share/nginx/html/index.html 再度ブラウザにEC2インスタンスのパブリックIPを入力してアクセスするとローカルの index.html と同じ内容のものが表示されます。
PythonでWebサイトのHTMLファイルを取得して保存する
PythonでWebサイトのHTMLファイルを取得して保存する方法です。 urllibでGETアクセスし、レスポンスを文字列として保存しています。
LambdaとEvent BridgeでDiscordの目覚ましBotを作る
LambdaとEvent BridgeでDiscordの目覚ましBotを作る方法です。 「おはよう」と毎朝つぶやくDiscordのBotを作ります。 まずDiscordでウェブフックを作成します。 curlコマンドを使い、メッセージが届くことを確認します。 https://discord.com/api/webhooks/xxx/xxx は差し替えてください。 export WEBHOOK_URL="https://discord.com/api/webhooks/xxx/xxx" curl \ -H "Content-Type: application/json" \ -d '{"username": "おはようBot", "content": "おはようございます。"}' \ $WEBHOOK_URL 届いたことを確認したら上記curl文をPythonで書き換えます。 書き換えたものが以下です。 import urllib.request import json def main(): url = 'https://discord.com/api/webhooks/xxx/xxx' message = {'username': 'おはようBot', 'content' : 'おはようございます!'} data = json.dumps(message).encode("utf-8") request = urllib.request.Request( url = url, data = data, headers = {"User-Agent": "lambda/python", "Content-Type" : "application/json"}, method = 'POST' ) with urllib.request.urlopen(request) as response: response_body = response.
MKMapViewで経路を表示する
MKMapViewで経路を表示する方法です。 新宿駅から秋葉原駅への経路を表示しています。 参考: 【Swift】MapKitで経由地点を含めたルートディレクションの表示方法
MKMapViewの表示範囲を設定する
MKMapViewの表示範囲を設定する方法です。 秋葉原駅(35.6984, 139.7731)を中心として緯度経度が±0.1となるように表示されます。 参考: 【Swift】MapKitで経由地点を含めたルートディレクションの表示方法
CollectionViewに区切り線を追加する
CollectionViewに区切り線を追加する方法です。 参考: UICollectionView の Layout で悩んだら Decoration Viewを用いてCollection Viewに区切り線と背景を追加する
CollectionViewの背景にスクロールする画像を設定する
CollectionViewの背景にスクロールする画像を設定する方法です。 よくわかっていないのですが、backgroundColor に画像を設定すると背景にスクロールする画像を設定できます。
UICollectionViewのサンプル
UICollectionViewのサンプルです。 makeColor() 関数でランダムに生成した色をセルに入れています。 スクロールするたびに色が変わります。
AWS CLI を使ってS3バケットを作成する
AWS Command Line Interface(CLI)を使ってS3バケットを作成する方法です。 AWS CLIはAWSが提供するAWSサービスを管理するためのコマンドラインツールです。 参考: AWS コマンドラインインターフェイス 上記URLなどを参考にしながらAWS CLIをインストールします。 AWS CLIは1.x系と2.x系がありますが、事情がなければ2.xをインストールします。 インストールがうまくいけば以下のコマンドを実行するとバージョンが表示されます。 $ aws --version # aws-cli/2.0.42 Python/3.7.4 Darwin/21.2.0 exe/x86_64 次にAWS CLIの初期設定を行います。aws configure コマンドを実行し、アクセスキーID、シークレットアクセスキー、リージョンを設定します。 S3バケットは以下のコマンドで作成することができます。 S3バケットを作成するIAM ユーザーには S3:CreateBucket の権限が必要です。 またバケット名はS3全体で一意である必要があります。 今回は kabigon-sandbox-bucket という名前でバケットを作成します。 $ aws s3api create-bucket --bucket kabigon-sandbox-bucket --create-bucket-configuration LocationConstraint=ap-northeast-1 以下のコマンドでバケットの一覧を取得することができます。 $ aws s3api list-buckets 以下のコマンドで kabigon-sandbox-bucket バケットを削除します。 $ aws s3api delete-bucket --bucket kabigon-sandbox-bucket aws s3api のドキュメントはこちらです。 aws s3api
全画面にするとChormeのタブが表示されない
全画面にするとChormeのタブが表示されなくなってしまった時の戻し方です。(Macの場合) command + shift + F を押すと戻すことができました。 参考: 全画面表示でchromeのタブが非表示になった!?その理由と対処方法
S3に静的ファイルを置いてインターネットに公開する
S3に画像などの静的ファイルを置いて公開する方法です。 まずS3のコンソールにアクセスします。 「バケットを作成」ボタンから新しいバケットを作成します。 今回は kabigon-sandbox-bucket という名前で作成します。 バケット名はグローバルで一意でなければなりません。 ブロックパブリックアクセスの設定は後で変更しますが有効にします。 以下の設定でバケットを作成します。 バケットが作成されたことを一覧から確認できます。 バケットに静的ファイルを入れてみましょう。 今回は icon.png という画像をアップロードします。 今回はバケットの中のファイルを公開するので、ブロックパブリックアクセスの設定をオフにする必要があります。 バケット名を選択し、「アクセス許可」のタブを選択します。 ブロックパブリックアクセスの設定をオフにします。 バケットポリシーを編集します。 バケットポリシーを設定することでリソースへのアクセスを管理することができます。 以下の設定は kabigon-sandbox-bucket のオブジェクトを無制限に取得できることを意味しています。 { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": "*", "Action": "s3:getobject", "Resource": "arn:aws:s3:::kabigon-sandbox-bucket/*" } ] } これで AWS 側の設定は完了です。 以下の URL にアクセスすると画像が表示されることを確認できます。 https://kabigon-sandbox-bucket.s3-ap-northeast-1.amazonaws.com/icon.png
CollectionViewで並び替え時に選択されたセルにアニメーションを付与する
CollectionViewで並び替え時に選択されたセルにアニメーションを付与する方法です。 長押しすると移動できるようになります。 参考: iOS – Longpress drag and drop using UICollectionView with Animation
UICollectionViewのセルを並び替える
UICollectionViewのセルを並び替える方法です。 長押しすると移動できるようになります。 参考: CollectionViewの並び替えを実装する | RE:ENGINES
Xcodeで左側のファイル一覧のナビゲーションが隠れてしまって出てこない
Xcodeで左側のファイル一覧のナビゲーションが隠れてしまって出てこないときの方法です。 command + 0 で出したり引っ込めたりすることができます。
SwiftUIでさまざまなデバイスのプレビューを確認する
SwiftUIでさまざまなデバイスのプレビューを確認する方法です。 まず以下のコマンドでデバイスの一覧を確認します。 デバイス名は正確に入力する必要があります。 $ xcrun simctl list devicetypes == Device Types == iPhone 4s (com.apple.CoreSimulator.SimDeviceType.iPhone-4s) iPhone 5 (com.apple.CoreSimulator.SimDeviceType.iPhone-5) iPhone 5s (com.apple.CoreSimulator.SimDeviceType.iPhone-5s) iPhone 6 Plus (com.apple.CoreSimulator.SimDeviceType.iPhone-6-Plus) iPhone 6 (com.apple.CoreSimulator.SimDeviceType.iPhone-6) iPhone 6s (com.apple.CoreSimulator.SimDeviceType.iPhone-6s) iPhone 6s Plus (com.apple.CoreSimulator.SimDeviceType.iPhone-6s-Plus) iPhone SE (1st generation) (com.apple.CoreSimulator.SimDeviceType.iPhone-SE) iPhone 7 (com.apple.CoreSimulator.SimDeviceType.iPhone-7) iPhone 7 Plus (com.apple.CoreSimulator.SimDeviceType.iPhone-7-Plus) iPhone 8 (com.apple.CoreSimulator.SimDeviceType.iPhone-8) iPhone 8 Plus (com.apple.CoreSimulator.SimDeviceType.iPhone-8-Plus) iPhone X (com.apple.CoreSimulator.SimDeviceType.iPhone-X) iPhone Xs (com.apple.CoreSimulator.SimDeviceType.iPhone-XS) iPhone Xs Max (com.apple.CoreSimulator.SimDeviceType.iPhone-XS-Max) iPhone Xʀ (com.apple.CoreSimulator.SimDeviceType.iPhone-XR) iPhone 11 (com.
iOS15でPickerを横に並べるとタップ領域が重なってしまう
iOS15でPickerを横に並べるとタップ領域が重なってしまう不具合に悩まされたのでその忘備録です。 以下の様なコードをiOS15の実機で実行し、左側の行を動かそうとすると右側の行が動いてしまいます。iOS14やシミュレーターでは問題なく動作します。 Pickerを複数並べると.clip()を使ってもタップ領域が広がってしまうって問題です! View Hierarchyを見たところ、タップ領域がclipされていないことが原因かと思われます。 Apple Developer Technical Support に助けを求めたところ「現時点では回避策がない既知の問題です。」と言われたので UIViewRepresentable を使って自分で作るしかなさそうです。
2022年の目標
あけましておめでとうございます、2022年もよろしくお願いします! 今年の目標は以下の通りです。 個人開発で一万円/月を稼ぐ ずっと赤字を垂れ流しているので今年ことは利益を出すぞ!!!! Rustに強くなる Javaで動いているサーバーサイドをRustに置き換えるなど 自作エフェクターを作る 開発が止まっているので今年は自作エフェクターを完成させたい。 計算を勉強する 化学への未練あるので、計算科学を勉強してハートリーフォック近似ぐらいはプログラムで書き起こせるぐらいになりたい。 今年も頑張ります、よろしくお願いします!!
SwiftUIでMapViewの中央に十字を用意し、その中央の座標を取得する
SwiftUIでMapViewの中央に十字を用意し、その中央の座標を取得する方法です。 MapViewが動いたタイミングでラベルの文字列が更新されます。
RustでキャメルケースのJSONをスネークケースにデシリアライズしたり、キャメルケースのJSONにする
RustでキャメルケースのJSONをスネークケースにデシリアライズしたり、キャメルケースのJSONにする方法です。 JSONはキャメルケース、Rustはスネークケースは多いので重宝します。 参考
RustでEnumのプロパティがあるstructをシリアライズしたりデシリアライズする
RustでEnumのプロパティがあるstructをシリアライズしたりデシリアライズする方法です。 Enumにすることでパターンマッチと相性が良いの良いですよね。
RustでVecやArrayをシリアライズしたりデシリアライズする
RustでVecやArrayをシリアライズしたりデシリアライズする方法です。 VecでもArrayでもシリアライズ&デシリアライズすることができました。
SpringBootでログをファイルに出力する
SpringBootでログをファイルに出力する方法です。 application.properties に logging.file.name=spring.log を追加するとログがファイルとしても出力されます。 ローカルではコンソールにログを出す、サーバーではコンソールとファイルにログを出したい場合は実行時にプロパティを渡すことで実現できます。 java spring.jar --server.port=80 --logging.file.name=spring.log 参考
SwiftでMapViewの中央に十字を用意し、その中央の座標を取得する
SwiftでMapViewの中央に十字を用意し、その中央の座標を取得する方法です。 スクロールしたりピンチしたタイミングで regionDidChangeAnimated が呼ばれるので、その時の中心の座標を取得しています。
Rustでコマンドライン引数を渡す
Rustでコマンドライン引数を渡す方法です。 use std::env; fn main() { let args: Vec<String> = env::args().collect(); println!("{:?}", args); } rustc main.rs ./main snorlax 143 ["./main", "snorlax", "143"]
RustでHelloWorldをする
RustでHelloWorldをする方法です。 main.rs というファイルを作成します。 fn main() { println!("Hello, World"); } 以下のコマンドでコンパイルします。 rustc main.rs コンパイルすると main というファイルが出るので実行すると Hello, World と表示されます。 ./main Hello, World
SwiftUIでPHPickerViewControllerを使って画像を選択する
SwiftUIでPHPickerViewControllerを使って画像を選択する方法です。 ImagePickerというクラスを使って実現しました。
SwiftでJSONエンコードするときに数字の桁数を指定する
SwiftでJSONデコードするときに数字の桁数を指定する方法です。 文字列になってしまいましたが、以下のように encode メソッドを書くことで桁数を指定します。 import Foundation struct MyStruct: Encodable { let number: Double enum CodingKeys: String, CodingKey { case number } func encode(to encoder: Encoder) throws { var container = encoder.container(keyedBy: CodingKeys.self) try container.encode(String(format: "%05f", number), forKey: .number) } } let myStruct = MyStruct(number: 1.0 / 3.0) let data = try! JSONEncoder().encode(myStruct) print(String(data: data, encoding: String.Encoding.utf8)!) {"number":"0.333333"}
Swiftの細かい文法のメモ
関数の引数は呼び出し側で省略したり、別名をつけたりすることができる。 func buyA(product: Int, price: Int, quantity: Int) { print(product, price, quantity) } buyA(product: 1200, price: 1500, quantity: 1) func buyB(_ product: Int, _ price: Int, _ quantity: Int) { print(product, price, quantity) } buyB(123, 123, 123) func buyC(a product: Int, b price: Int, c quantity: Int) { print(product, price, quantity) } buyC(a: 123, b: 123, c: 123) 関数が1行の場合は return を省略できる。 func messageA() -> String { return "Hello" } func messageB() -> String { "Hello" } return と同じ行に書いたコードは実行される。もちろんそれよりも下の行は実行されない。
Swiftで引数を参照渡しをする
Swiftで引数を参照渡しをする方法です。 まず普通に書いた場合です。 プログラム実行後 x = 2, y = 4 となります。 import UIKit let x: Int = 2 func double(num: Int) -> Int { return x * 2 } let y: Int = double(num: 2) print("x = \(x), y = \(y)") // x = 2, y = 4 Swiftで引数を参照渡しをする方法です。 inout で引数を参照私にすることができます。 プログラム実行後 x = 4, y = 4 となります。 import UIKit var x: Int = 2 func inoutDouble ( num: inout Int) -> Int{ num = num * 2 return num } let y = inoutDouble(num: &x) print("x = \(x), y = \(y)") // x = 4, y = 4
PHPickerViewControllerを使って画像を選択する
PHPickerViewController を使って画像を選択する方法です。 UIImagePickerController が将来的に非推奨になり PHPickerViewController に置き換わっていくみたいです。 参考: Meet the new Photos picker
SpringBootでマークダウンをHTMLに変換してThymeleafで表示する
SpringBootでマークダウンをHTMLに変換してThymeleafで表示する方法です。 マークダウンをHTMLに変換するライブラリとして flexmark-javaを使用しました。 build.gradle の dependencies に flexmark-java を追加します。 implementation 'com.vladsch.flexmark:flexmark-all:0.62.2' markdown.html を作成し、Templateフォルダに追加します。 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Markdown</title> </head> <body> [(${html})] </body> </html> /markdown エンドポイントを追加します。 markdown 変数を変換し、 html 変数に入れています。 @GetMapping("/markdown") public String getMarkdown(Model model) { // create parser and renderer instance Parser parser = Parser.builder().build(); HtmlRenderer renderer = HtmlRenderer.builder().build() String markdown = "# hello\n## world\n![Fried Shrimp Triangle](http://imgur.com/Jjwsc.jpg \"Sample\")" // convert to markdown to html Node document = parser.
SwiftUIでカメラを使う
SwiftUIでカメラを使う方法です。 録画を可能にする CameraView を作成しそれを SwiftUI 側で呼び出すようにします。 SwiftUIでカメラを使ったり、写真を保存するには色々とプライバシーの許可を Info.plist に設定する必要があります。 [Swift] AVFoundation による動画撮影の設定: カメラ種類 / ズーム / 録画時間 / 画質](https://superhahnah.com/swift-avcapture-settings/)
Springを使ってお問い合わせフォームを作るその6
Springを使ってお問い合わせフォームを作るその6です。 今回は作ったアプリケーションをサーバーにデプロイしていきます。 conoha にログインし、サーバーを立てます。 OS は Ubuntu の20系で、一番小さい(安い)インスタンスを作成します。 サーバーが起動したらIPアドレスが表示されるのでそのIPアドレスをコピーします。 ここでは 160.251.74.232 がサーバーのIPアドレスです。 このIPアドレスはサーバーを起動する度に変わるので 160.251.74.232 ではなく表示された値を使用してください。 サーバーにログインします。 ssh root@160.251.101.154 初回接続時は以下の警告が出るので yes と入力します。 Are you sure you want to continue connecting (yes/no/[fingerprint])? パッケージの一覧、パッケージ本体の更新を行います。 何か聞かれたらとりあえず Y を入力します。 apt -y update apt -y upgrade Java11をインストールします。 apt -y install openjdk-11-jdk 11系が入ったことを確認します。 java --version openjdk 11.0.11 2021-04-20 OpenJDK Runtime Environment (build 11.0.11+9-Ubuntu-0ubuntu2.20.04) OpenJDK 64-Bit Server VM (build 11.0.11+9-Ubuntu-0ubuntu2.20.04, mixed mode, sharing) MySQLをインストールします。 apt -y install mysql-server MySQLが入ったことを確認します。
Springを使ってお問い合わせフォームを作るその5
Springを使ってお問い合わせフォームを作るその5です。 前回自体でアプリケーションは大体できたので、今回からはサーバーへのアップロードの準備していきます。 作成したアプリケーションを .jar ファイルにします。 .jar ファイルにするとアプリケーションを1つのファイルにまとめることにできます。 ./gradlew build .jar は build/libs に spring-0.0.1-SNAPSHOT.jar という名前で書き出されるので確認します。 .jar ファイルがある場所で以下のコマンドが実行するとアプリケーションが起動します。 たとえば以下のコマンドを実行すると localhost:8080 で起動します。 java -jar spring-0.0.1-SNAPSHOT.jar プロパティを追加して実行することも可能です。 以下の例では localhost:80 でアプリケーションを起動します。 java -jar spring-0.0.1-SNAPSHOT.jar --server.port=80
Springを使ってお問い合わせフォームを作るその4
Springを使ってお問い合わせフォームを作るその4です。 今回はフォームから DB に追加できるようにします。 getFormResult にインサートするメソッドを追加します。 @PostMapping("/form/result") public String getFormResult(@ModelAttribute ContactForm form, Model model) { model.addAttribute("form", form); jdbcTemplate.update("INSERT INTO contact(name,email,message) Values(?,?,?)", form.getName(), form.getEmail(), form.getMessage()); return "result"; } フォームから送られた情報が DB に保存されます。 最後に index.html を作成して完成です。 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Index</title> </head> <body> <ul> <a href="/form"><li>Form</li></a> <a href="/form/list"><li>List</li></a> </ul> </body> </html> @GetMapping("/") public String getIndex() { return "index"; } 最終的なファイルはこちらです。
Springを使ってお問い合わせフォームを作るその3
Springを使ってお問い合わせフォームを作るその3です。 今回は Spring と DB を接続して前回作成した contact テーブルの一覧を表示します。 build.gradle を開き dependencied に org.springframework.boot:spring-boot-starter-data-jpa と mysql:mysql-connector-java:8.0.20 を追加します。 implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'mysql:mysql-connector-java:8.0.20' src/main/resources/application.properties を開き、DBへの接続先情報を追加します。 spring.datasource.url=jdbc:mysql://127.0.0.1:3306/swiswiswift-db spring.datasource.username=root spring.datasource.password=password spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver list.html を作成します。 <!DOCTYPE HTML> <html xmlns:th="https://www.thymeleaf.org"> <head> <title>Form List</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> </head> <body> <h1>List</h1> <div> <div th:each="contact : ${contacts}"> <p th:text="'Name: ' + ${contact['name']}"></p> <p th:text="'Email: ' + ${contact['email']}"></p> <p th:text="'Message: ' + ${contact['message']}"></p> <hr> </div> </div> </body> </html> MyController にエンドポイントを追加します。localhost:8080/form/list にアクセスすると contact テーブルの一覧を取得して表示させます。
Springを使ってお問い合わせフォームを作るその2
Springを使ってお問い合わせフォームを作るその2です。 今回はDBまわりを作っていきます。 まずDockerを使ってMySQLサーバーを立ち上げます。 以下のような docker-compose.yml を作成します。 version: "3.8" services: mysql: image: mysql:8.0.20 container_name: swiswiswift-mysql environment: MYSQL_ROOT_PASSWORD: password MYSQL_DATABASE: swiswiswift-db command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci ports: - 3306:3306 ターミナルなどで docker-compose.yml が存在するディレクトリに移動し、以下のコマンドで MySQL のコンテナを起動します。 docker-compose up -d mysql:8.0.20 という名前のイメージを使って swiswiswift-mysql という名前のコンテナ port 3306 で起動させます。 また docker-compose.yml に記載があるように、Root のパスワードは password です。 起動が完了したら以下のコマンドで MySQL にログインします。 mysql -u root -h 127.0.0.1 --port 3306 -p # password swiswiswift-db を選択します。 use swiswiswift-db お問い合わせフォームで入力する値は名前、Email、お問い合わせ内容なのでそれらを保存する contact テーブルを作成します。 create table contact( name varchar(255) not null, email varchar(255) not null, message varchar(1023) not null ); テーブルを作成したらお問い合わせ内容が入ることを確認します。
Springを使ってお問い合わせフォームを作るその1
Springを使ってお問い合わせフォームを作ります。 ユーザーがフォームにお問い合わせ内容を書いて投稿することができ、それを一覧で確認できるシステムを作ります。localhost:8080/form にアクセスするとフォームが表示され、入力後に投稿ボタンを押すとお礼メッセージと投稿内容が表示されます。 Spring Initilizer を使ってプロジェクトを作成します。 Spring Web, Spring Boot Actuator, Thymeleaf を追加し、プロジェクトを作成します。 作成したプロジェクトを IntelliJ で開き問題なく起動することを確認します。 ContactForm.java というファイルを作成します。 このファイルは Data Transfer Object(DTO)と呼ばれる種類のファイルで、ひとまとまりのデータを受け渡す時に便利なファイルです。 package com.swiswiswift.spring; public class ContactForm { private String name; private String email; private String message; public String getName() { return name; } public void setName(String name) { this.name = name; } // ...略 } form.html を作成します。localhost:8080/form へアクセスがあった場合表示されるフォームです。 <!DOCTYPE HTML> <html xmlns:th="https://www.thymeleaf.org"> <head> <title>Form</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> </head> <body> <h1>Contact Form</h1> <form action="#" th:action="@{/form/result}" th:object="${form}" method="post"> <p>Name: <input type="text" th:field="*{name}"/></p> <p>Email: <input type="text" th:field="*{email}"/></p> <p>Message: <input type="text" th:field="*{message}"/></p> <p><input type="submit" value="Submit"/></p> </form> </body> </html> MyController を作成します。localhost:8080/form へアクセスしたら form.
Dockerを使ってMySQLを練習する
Dockerを使ってMySQLを練習する方法です。 まず以下のような docker-compose.yml を作成します。 version: "3.7" services: mysql: image: mysql:8.0.20 container_name: swiswiswift-mysql environment: MYSQL_ROOT_PASSWORD: password MYSQL_DATABASE: swiswiswift-db command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci ports: - 3306:3306 ターミナルなどで docker-compose.yml が存在するディレクトリに移動し、以下のコマンドで MySQL のコンテナを起動します。 docker-compose up -d mysql:8.0.20 という名前のイメージを使って swiswiswift-mysql という名前のコンテナ port 3306 で起動させます。 また docker-compose.yml に記載があるように、Root のパスワードは password です。 起動が完了したら以下のコマンドで MySQL にログインします。 docker exec -it swiswiswift-mysql mysql -u root -p # password ローカルに MySQL クライアントがインストールされている場合は以下のコマンドでも MySQL にログインできます。 mysql -u root -h 127.0.0.1 --port 3306 -p # password 以下のコマンドで起動したコンテナを削除することができます。
Golangでtext/templateを使ってhtmlファイルを生成する
Golangでtext/templateを使ってhtmlファイルを生成する方法です。 Pokemon構造体の配列を作成し、一覧表示する htmlファイル(index.html)を作成しています。
MapViewのタップした箇所に黒丸を描画する
MapViewのタップした箇所に黒丸を描画する方法です。 タップした箇所に黒丸を描画しています。黒丸のサイズは地図に対して相対的ではなく絶対的(地図を拡大すると黒丸も大きくなる)になります。 相対的なものにしたいときはMKPointAnnotationを使うと良いかもしれません。
PCBEで作った基板をPCBGOGOで注文する
PCBEで作った基板をPCBGOGOで注文する方法です。 ファイル -> 基盤見積もり作成 -> 画像のように「データ作成(ドリル=NC)」を選択 -> データ作成 を選択。 作成された zip ファイルを PCBGOGO に送れば大丈夫でした。 参考: PCBEからガーバーファイルを出力する方法 このような中身の zip ファイルが作成されます。
AppStoreConnectで「銀行振り込みが完了しませんでした」というメッセージが現れて消えない
AppStoreConnectで「銀行振り込みが完了しませんでした」というメッセージが現れて消えない時の方法です。 契約/税金/口座情報 -> 口座情報 -> 銀行名をクリック -> 住所を入力で消すことができました。
MacOSでフォルダをzipに圧縮する
MacOSでフォルダをzipに圧縮する方法です。 zipにすることで LINE とかで送ることができるようになります。 フォルダを作り、その中にファイルを入れます。 フォルダを右クリックし、圧縮を選択します。 zipファイルが生成されます。
Golangで配列のJSONを構造体の配列に変換する
Golangで構造体をJSONファイルとして出力する方法です。 このコードではローカルのJSONファイルを読みとり、構造体の配列に変換しています。
iOSで実機ビルドだと動けどTestFlightから配信すると動かない
iOSアプリ開発中に実機ビルドだと動けどTestFlightから配信すると動かない。ということがありました。 以下の記事を参考にリリーズビルド時も最適化を無効化したら動くようになりました。 App crashes in Release build but not in debug Xcodegen を使っている場合は settings の base に以下を追加してあげます。 SWIFT_OPTIMIZATION_LEVEL: -Onone
複数の型を持つJSONをemumでDecodeする
複数の型を持つ JSON を enum を使って Decode する方法です。 とある API を叩くと JSON が返ってきますが、その中身がポケモンなのかトレーナーなのかジムリーダーなのかわかりません。 以下のコードのように enum の Character の中に Pokemon, GymLeader, Trainer を定義することで、どのような JSON が来ても Decode できるようになります。
自分で定義したStructをUserDefaultsに保存する
自分で定義したStructをUserDefaultsに保存する方法です。 そのままでは保存することができないので、一度 JSONEncoder で Data に保存してから保存します。
Identifiableに適合していないStructでListを使う
Identifiableに適合していないStructでListを使う方法です。 id でプロパティユニークとなるプロパティを指定することで List で使うことができます。
SwiftUIのTabViewのタブをコードから動的に切り替える
SwiftUIのTabViewのタブをコードから動的に切り替える方法です。 コードで動的にタブを切り替える方法です 参考: Programmatically change to another tab in SwiftUI
JetpackComposeで画面遷移する
JetpackComposeで画面遷移する方法です。 以下の記事を参考にしながら画面遷移してみました。 まだまだ分からないことだらけです。 参考: Compose を使用して移動する
iOSでバージョンとビルド番号を取得する
iOSでバージョンとビルド番号を取得する方法です。 バージョンとビルド番号を文字列で取得します。 オプショナルで取得することになるので、if let でアンラップしてます。
SwiftUIでListにButtonを設定してパラメーターの違う画面に遷移する
SwiftUIでListにButtonを設定してパラメーターの違う画面に遷移する方法です。 詳細ページに遷移するような使い方を想定しています。
SwiftUIで少しカスタマイズしたActivityIndicatorを表示する
SwiftUIで少しカスタマイズしたActivityIndicatorを表示する方法です。背景色をつけたActivityIndicatorを表示したり隠したりしています。
Swiftでデフォルト引数を使う
Swiftでデフォルト引数を使う方法です。 favorite 関数に引数を渡さず呼び出すと "I love Snorlax が返り、任意の名前を渡すとその値が使われます。
SwiftUIでUIActivityViewControllerを表示する
SwiftUIでUIActivityViewControllerを表示する方法です。 ボタンを押すと URL を共有するシートを表示します。 参考: Showing ‘UIActivityViewController’ in SwiftUI
DockerのMySQLでdocker-entrypoint-initdb.dの完了を待つ
DockerのMySQLでdocker-entrypoint-initdb.dの完了を待つ方法です。 docker-compose up -d のタイミングで実行する sql, sh などが長いと立ち上がりに時間がかかり実行が遅くなります。 CIの時とかはそれだと困るので待つ方法のメモです。
waitコマンドで複数の処理の完了を待つ
waitコマンドで複数の処理の完了を待つ方法です。 sh script.sh を実行すると sleep.sh の完了を待ち、最後の Echo 文を実行します。
SwiftUIでSearchBar(TextField)にクリアボタンをつける
SwiftUIでSearchBar(TextField)にクリアボタンをつける方法です。 TextFiled に文字を入力するとポケモンを検索します。 そして右側のボタンを押すと TextField がクリアされます。 参考サイト SwiftUI: Add ClearButton to TextField
SwiftUIでSearchBar(TextField)を使って検索する
SwiftUIでSearchBar(TextField)を使って検索する方法です。 TextFiled に文字を入力するとポケモンを検索します。
SwiftUIのListの中にボタンを複数設置する
SwiftUIのListの中にボタンを複数設置する方法です。 buttonStyle(PlainButtonStyle()) を設定することできました。 参考サイト SwiftUI pick a value from a list with ontap gesture
SwiftUIのListでSpacerの部分にもタップ判定をつける
SwiftUIのListでSpacerの部分にもタップ判定をつける方法です。 .contentShape(Rectangle()) を設定することでタップ範囲を広げています。 参考サイト SwiftUI pick a value from a list with ontap gesture
ElmでIntをStringに変換する
ElmでIntをStringに変換する方法です。 String.fromInt で変換することができました。 Elmは慣れるまで難しいですが書いていると少しずつ楽しくなってきますね。
SwiftUIでListをEditModeにして並び替える
SwiftUIでListをEditModeにして並び替える方法です。 UITableViewのEditModeのようにして並び替えることができます。 Listの中にforを定義する必要があります。最初ハマりました。
Swiftでプロジェクトの中に含まれるJSONファイルを読み込む
Swiftでプロジェクトの中に含まれるJSONファイルを読み込む方法です。 まずプロジェクトに読み込みたい JSON ファイルを追加します。 画像のように追加します。 追加した JSON ファイルの中身は以下です。 { "number": 143, "name": "Snorlax" } 次に追加した JSON ファイルをデコードするためのstructをJSON の中身に合わせて作成します。 ボタンを押すとプロジェクト中の pokemon.json を読み込み、Pokemon構造体にデコードし、State を更新させて文字列を表示しています。
SwiftUIでシートを表示し、プッシュ遷移後にシートを閉じる
SwiftUIでシートを表示し、プッシュ遷移後にシートを閉じる方法です。 遷移後のシートでもisPresentedの情報を保持するのがポイントです。
SwiftUIで初めの画面に遷移する(popToRootViewController)
SwiftUIで初めの画面に遷移する(popToRootViewController)方法です。 isDetailLink がポイントです。
SwiftUIのTextFieldで表示するキーボードを指定する
SwiftUIのTextFieldで表示するキーボードを指定する方法です。 keyboardType を指定することで表示するキーボードの種類を設定することができます。
QGridを使ってCollectionViewを実装する
QGridを使ってCollectionViewを実装する方法です。 iOS13のSwiftUIではCollectionViewに相当するものがありません。 QGridを使うことでCollectionViewに似たものを実装することができます。
SwiftUIでアラートを入れ子にして使うことができない
SwiftUIでアラートを入れ子にして使うことができなかったのでそのメモです。 以下のコードの様に HStack の中に VStack を入れ、それぞれに .alert を使うと内側の .alert がうまく動かなかったです。 .alert は入れ子にしない方が良さそうです。
iOSでGoogle-Mobile-Ads-SDKの8系が入らない
iOSでGoogle-Mobile-Ads-SDKの8系が入らない時の対処法です。 Firebase/adMob を外したらうまくいきました。 参考: pods使うとadmob sdkのバージョンは7.69になるなぁ。最新の8.1入れたかったんだけどな。
SwiftUIでBMIを計算し、結果を別のViewで表示する
SwiftUIでBMIを計算し、結果を別のViewで表示する方法です。 身長と体重を入力し、計算ボタンを押すことで計算したBMIを表示しています。 ただ上の例では bmi と showingSheet の二つのプロパティが必要です。 新しく ContentActionSheetを定義する必要がありますが、以下の方法だとプロパティの数を減らしたりenumの種類によってシートの出し分けをすることができます。
@Stateと@Bindingの使い分け
@Stateと@Bindingの使い分けについです。 @State のついた変数を変更することでViewにその変更が反映されます。 以下の例ではボタンを押すことで 変数textの値を変えています。 変数textの値を変えることでその変更が反映され、文字列が変わります。 @Binding は親のViewのプロパティを子のViewで変えたい時に使います。 ContentViewでは変数textの値を表示しています。 ChangeTextボタンを押してSecondViewに遷移し、そこで値を変えると親である ContentView のプロパティも変更され、画面にその変更が反映されています。
TableViewのセルを長押しでContextMenuを表示する
TableViewのセルを長押しでContextMenuを表示する方法です。 手軽にメニューが表示することができ、とても使い勝手が良いので積極的に使っていきたいです。
SwiftUIで複数のモーダルをEnumで出し分ける
SwiftUIで複数のモーダルをEnumで出し分ける方法です。 enumを使うことでスッキリと書くことができました。 iOS13では使えないので気をつけてください。
SwiftUIでフルスクリーンモーダルを表示する(iOS14以上)
SwiftUIでフルスクリーンモーダルを表示する方法です。(iOS14以上) いままでSwiftUIでフルスクリーンのモーダルを表示するのは大変でしたが、iOS14からはこの方法で表示することができるようになります。お手軽ですね。 iOS13でフルスクリーンモーダルを表示させたい場合はこの記事をご参照ください。 SwiftUIでフルスクリーンモーダルを表示する 参考: How to present a full screen modal view using fullScreenCover()
SwiftUIでモーダルを表示する時に値を渡す
SwiftUIでモーダルを表示する時に値を渡す方法です。 TextFieldでname変数に文字列を入力します。その入力した文字列をPokemonView に渡して表示しています。
Swiftで文字列を圧縮して保存し、そのデータを読み取る
Swiftで文字列を圧縮して保存し、そのデータを読み取る方法です。 zlib というアルゴリズムで文字列を圧縮し、保存しています。 Java の Deflater, Inflater に相当する方法ですが、header、チェックサムの情報が抜けている生のデータが保存されるので気をつける必要があります。 static void saveCompressedData() { try { // Encode a String into bytes String text = "hello"; byte[] data = text.getBytes(StandardCharsets.UTF_8); // Compress the bytes ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); DeflaterOutputStream outputStream = new DeflaterOutputStream(byteArrayOutputStream); outputStream.write(data); outputStream.finish() String path = "/Users/kabigon/Desktop/data.data"; try (FileOutputStream fos = new FileOutputStream(path)) { fos.write(byteArrayOutputStream.toByteArray()); } System.out.println("----------------------"); System.out.println("Save Completed!!"); System.out.println(String.format("Path: %s", path)); System.out.println("----------------------"); } catch (Exception e) { e.
SwiftUIでAVAudioPlayerNodeで音楽を再生し、再生終了を検知する
SwiftUIでAVAudioPlayerNodeで音楽を再生し、再生終了を検知する方法です。 AVAudioPlayer は Delegate で再生終了を検知しますが、AVAudioPlayerNodeは再生終了時に呼ばれるハンドラーが用意されているのでそちらを使います。 参考: AVAudioEngine & AVAudioPlayerNode didFinish method like AVAudioPlayer
SwiftUIでAVAudioPlayerで音楽を再生し、再生終了を検知する
SwiftUIでAVAudioPlayerで音楽を再生し、再生終了を検知する方法です。 SwiftUIは struct を使うので AVAudioPlayerDelegate に準拠することができません。 そのため、ViewModel を作成し、SwiftUI(View)から呼び出してあげるます。 参考: AVAudioPlayerDelegate SwiftUI
ビック光(IIJmioひかり)の接続パスワードを忘れた時のメモ
ビック光(IIJmioひかり)の接続パスワードを忘れた時のメモです。 WiFiルーターを変えたタイミングで接続パスワードを忘れてしまい、インターネットに繋げなくなってしまいました。 https://www.iijmio.jp/ にログインし、接続パスワードを変更することでインターネットに接続することができました。 ユーザー名はパスワード変更ページに表示されているユーザーID + @iij.ad.jp でした。
AVAudioPlayerNodeを使って音楽の再生、一時停止、再生速度変更、ピッチ変更、ボリューム変更を行う
AVAudioPlayerNodeを使って音楽の再生、一時停止、再生速度変更、ピッチ変更、ボリューム変更を行う方法です。 AVAudioPlayerNodeはAVAudioPlayerではできないようなことができます。 たとえばピッチの変更などAVAudioPlayerでは実現することはできないので、AVAudioPlayerNodeを使う必要があります。
AVAudioPlayerを使って音楽の再生、一時停止、停止、ボリューム変更、再生速度変更を行う
AVAudioPlayerを使って音楽の再生、一時停止、停止、ボリューム変更、再生速度変更を行う方法です。 AVAudioPlayerを使うと簡単に音楽の再生などに関することするができます。 ただ AVAudioPlayer にできることは限られており、より複雑な操作をするためには AVAudioPlayerNode を使う必要があります。
SwiftUIでImageを長押しするとContextMenuを表示する
SwiftUIでImageを長押しするとContextMenuを表示する方法です。 アイコンが表示されているImageを長押しするとContextMenuが表示されます。 少しのコードを書くだけでリッチなUIが実現できて便利です。
ImageViewを長押しするとContextMenuを表示する
ImageViewを長押しするとUIMenuを表示する方法です。 アイコンが表示されているImageViewを長押しするとContextMenuが表示されます。 少しのコードを書くだけでリッチなUIが実現できて便利です。
SwiftUIでMapを表示してアノテーションを表示する
SwiftUIでMapを表示してアノテーションを表示する方法です。 iOS14からSwiftUIでMapKitを使えるようになりました。地図を表示するとかだけならSiwftUIで完結します。
Xcodeでプロジェクトを作成してGithubにプッシュする
Xcodeでプロジェクトを作成してGithubにプッシュする忘備録です。 まずプロジェクトを作成します。 作成したプロジェクトのフォルダを SourceTree にドラッグアンドドロップします。 gitignore.ioにアクセスして .gitignore を作成します。生成された .gitignore をリポジトリ限定無視リストに貼り付けます。 新しいリポジトリを作ります。 矢印のURIをコピーします。 SourceTreeの設定からリモートリポジトリを追加します。コピーしたURIを貼り付けます。
SwiftでSpringBootで作られたAPIに文字列を渡す
SwiftでSpringBootで作られたAPIに文字列を渡した時にちょっと詰まったのでそれの忘備録です。 @RequestMapping(value = "", method = RequestMethod.POST, produces = "application/json;charset=UTF-8") public SampleBean request(@RequestBody String text) { SampleBean sampleBean = new SampleBean(); sampleBean.setText(text); return sampleBean; } @Data public class SampleBean implements Serializable { private String text; } このような Bean を返すエンドポイントを作りました。curl コマンドでエンドポイントを叩くと以下のようなレスポンスが返ってきます。想定通りの挙動です。 curl "http://localhost:8080/sample" \ -X POST \ -H 'Content-Type: application/json' \ -d 'Kabigon' \ | jq { "text": "Kabigon" } 次にこのエンドポイントを Swift から叩きます。 レスポンスを SampleBean にデコードしてその中の text プロパティを表示すると ダブルクオート付きの文字列が表示されてしまいます。 それはSwift がダブルクオートを含めて Spring 側にデータを送信しているからです。 Swiftが行っているリクエストを curl コマンドに翻訳すると以下になります。
SpringBootでBeanを返すとプロパティ名のisが省略される
SpringBoot で boolean型 で isXXX という名前のプロパティを持つ Bean を返すとisが省略されたので、それ周りの挙動の確認のメモです。 @RequestMapping(value = "", method = RequestMethod.GET, produces = "application/json;charset=UTF-8") public SampleBean request() { SampleBean sampleBean = new SampleBean(); sampleBean.setName("Kabigon"); sampleBean.setStudent(false); sampleBean.setIsHuman(true); return sampleBean; } @Data public class SampleBean implements Serializable { private String name; private boolean isStudent; private Boolean isHuman; } このような Bean を返すエンドポイントを作り、curl コマンドでそのエンドポイントを叩きます。 curl "http://localhost:8080/" \ -X GET \ -H 'Content-Type: application/json' \ | jq { "name": "Kabigon", "isHuman": true, "student": false } このような JSON が返ってきます。boolean型の isStudent は is が省略されています。
UIAlertControllerの中でTextFieldを使い、文字数を制限する
UIAlertControllerの中でTextFieldを使い、文字数を制限する方法です。 このサンプルでは6文字以上入力できないようにしています。
SwiftUIでMapを使う。Mapにピンを立てる
SwiftUIでMapを使う。Mapにピンを立てる方法です。 UIViewRepresentableを使って MKMapViewをSwiftUIで表示しています。
画面内にPageViewControllerがあるウォークスルー画面を実装する
画面内にPageViewControllerがあるウォークスルー画面を実装する方法です。 一番最後のページを開くとボタンの色が変わります。
SwiftUIで端末のシェイクを検知する
SwiftUIで端末のシェイクを検知する方法です。 端末をシェイクすると Text 内の文字が変わります。 ReactNativeは端末をシェイクするとデバッグメニューが出てくるのが面白いです。
SwiftUIでAppStorageを使ってUserDefaultの値を監視する
SwiftUIでAppStorageを使ってUserDefaultの値を監視する方法です。 UserDefaultが変更されると画面が再描画されます。
SwiftUIでListの中に複数のNavigationLinkを設置する
SwiftUIでListの中に複数のNavigationLinkを設置する方法です。 素直に実装すると画面遷移が暴発してしまいます。 それを修正するために List のタップジェスチャーを無効化したりする必要がありました。
ディレクトリにあるwavファイルをcafに変換する
ディレクトリにあるwavファイルをcafに変換する方法です。ディレクトリに存在する全ての.wavファイルをcafファイルに変換したいときによく使います。
SwiftUIでVStackの周りに影をつける
SwiftでUIViewの周りに影をつける方法です。 ImageのViewの周りに影をつけています。 shadowOffset で影の位置を移動させることができ、サンプルコードでは影を右下に移動させています。
UIPageViewControllerでウォークスルー画面を実装する
UIPageViewControllerでウォークスルー画面を実装する方法です。 ウォークスルー画面はチュートリアルなどでよくありますね。
SwiftUIでViewの周りに影をつける
SwiftでUIViewの周りに影をつける方法です。 ImageのViewの周りに影をつけています。 shadowOffset で影の位置を移動させることができ、サンプルコードでは影を右下に移動させています。
Swiftで文章を読み上げる(音声合成)
Swiftで文章を読み上げる(音声合成)方法です。 AVFoundation を import し、以下のコードを書くことで iPhone に文字列を読み上げてもらうことができます。
SwiftUIでButton内の画像やテキストの色を変えない
SwiftUIでButton内の画像やテキストの色を変えない方法です。 .buttonStyle(PlainButtonStyle()) ではフルーツの一覧を表示しています。 フルーツが表示されたセルを押すと SecondView を設定することで実現できました。
SwiftUIで画面遷移時に値を渡す
SwiftUIで画面遷移時に値を渡す方法です。 ContentView ではフルーツの一覧を表示しています。 フルーツが表示されたセルを押すと SecondView に遷移し、選択されたセルのフルーツ名が表示されます。
GithubのAPIを叩き、SwiftUIでリポジトリを取得する。一番最後までいくと追加で取得しIndicator を表示する
GithubのAPIを叩き、リポジトリを取得する。一番最後までいくと追加で取得しIndicator を表示する方法です。 Infinite List Scroll with SwiftUI and Combine を参考にさせていただきました。
GithubのAPIを叩き、SwiftUIでリポジトリの情報をリストに表示する。一番下までスクロールされたら追加する
GithubのAPIを叩き、リポジトリの情報をリストに表示する。一番下までスクロールされたら追加する方法です。 Infinite List Scroll with SwiftUI and Combine を参考にさせていただきました。
GithubのAPIを叩き、SwiftUIでリポジトリの情報をリストに表示する(Combine)
GithubのAPIを叩き、リポジトリの情報をリストに表示する方法です。 Infinite List Scroll with SwiftUI and Combine を参考にさせていただきました。
GithubのAPIを叩き、SwiftUIでリポジトリの情報をリストに表示する(Closure)
GithubのAPIを叩き、SwiftUIでリポジトリの情報をリストに表示する方法です。 Infinite List Scroll with SwiftUI and Combine を参考にさせていただきました。
SwiftUIでアラートとシートを出し分ける
SwiftUIでアラートとシートを出し分ける方法です。 TextField に入力された文字列が Double に変換できるかチェックします。 もし Double に変換できるのであればシートを表示し、もし Double に変換できないのであればアラートを表示します。
curl で iOSにVoIPプッシュを送る
curl で iOSにVoIPプッシュを送る方法です。 まず VoIPプッシュ通知用の .p12 ファイルを .pem に変換します。 openssl pkcs12 -in file-name.p12 -out file-name.pem -nodes -clcerts .pem ファイルを使ってプッシュ通知を送ります。apple の URL は配布方法によって異なるので気をつけてください。 たとえば Xcode から実機に送ると以下の URL で良いですが、TestFlightやストアから配布する場合は URL 中の develop は不要です。 curl --http2 \ -E file-name.pem \ --header "apns-topic: {YOUR_BUNDLE_ID}.voip" \ -d "{\"message\":\"Hello\"}" \ https://api.development.push.apple.com/3/device/{YOUR_TOKEN}
SwiftUIでプログラムで前の画面に戻る
SwiftUI でプログラムで前の画面に戻る方法です。 NavigationView と NavigationLink を使うと画面遷移することができます。 戻るボタンは自動で付与されますが、戻るボタン意外の方法で前の画面に戻りたいときは、PresentationMode を使うことで実現できます。
Swiftで仮引数を持つイニシャライザをスマートに書く
Swiftで仮引数を持つイニシャライザをスマートに書く方法です。 仮引数がついたイニシャライザをもち、イニシャライズ時の値を定数として保持する Struct を作る時、private(set) var name = “snorlax” を使うと短くスマートに書くことができます。 プロパティが増えてもイニシャライザを編集する必要が無くなります。
Xcodeで行を入れ替える
Xcodeで行を入れ替える方法です。 command + option + [ でカーソルのある行を上に持ってくることができます。 また command + option + ] でカーソルのある行を下に持ってくることができます。 ![Format]](1.gif)
UIAlertControllerでアラートを表示する
UIAlertControllerを使ってアラートを出すサンプルです。 UIAlertControllerStyle.alert を UIAlertControllerStyle.actionSheet にするとニュッと下から出るタイプのアラートになります。
SwiftUIのPreviewを横向きにする
SwiftUIのPreviewを横向きにする方法です。 Previewのサイズを変更することで実現しました。 Landscape Right, Landscape Left にチェックを入れアプリを横向きにします。 Previewのサイズを端末のサイズに変更します。
Buttonからプッシュ遷移をする(NavigationLinkを無効にする)
Buttonからプッシュ遷移をする方法です。 この方法であれば、NavigationLink を擬似的に無効にすることができます。
SwiftUIでNavigationBarを隠す
SwiftUI で NavigationBar を隠す方法です。 .navigationBarHidden(true) を設定すると隠すことができます。 理由は不明ですが、空文字で仮のタイトルを設定する必要がありました。
UIGestureRecognizer でジェスチャーイベントを取得する
UIGestureRecognizer でジェスチャーイベントを取得する方法です。 UITapGestureRecognizer, UIPinchGestureRecognizer, UILongPressGestureRecognizer, UISwipeGestureRecognizer などを使ってスワイプ、ピンチなどのイベントを取得することができます。
UIPickerViewを使って値を選択する
UIPickerViewを使って値を取得するサンプルコードです。 PIPickerViewは選択肢の中から要素を選ぶときによく使いますね。 今回は食べ物とドリンクとフードを選ぶアプリを作ってみました。
IntelliJでJavaのGradleのプロジェクトを作成する
IntelliJでJavaのGradleのプロジェクトを作成する方法です。 IntelliJを使うと簡単にプロジェクトを作ることができます。 build.gradle にメインクラスを指定する。 jar { manifest { attributes 'Main-Class': 'com.charalarm.batch.Main' } } $ ./gradlew build # ビルド $ ./gradlew test -i # テスト $ java -jar ./build/libs/batch-1.0-SNAPSHOT.jar com.charalarm.batch # 実行
Spring InitializrでアプリをSpringアプリを作成する
Spring Initializr でアプリをSpringアプリを作成する方法です。 Spring Initializr を使うとアプリの雛形を作ることができます。 Spring Initializr Project は Gradle、Language は Java にしました。 今回のプロジェクトは API サーバーなので、Spring Web と Spring Boot Actuator を追加しました。 html をサーバーサイドでレンダリングする場合は Thymeleaf も追加する必要があります。 Reference: Spring Initializrでアプリケーションのひな型を作成する
削除、セルの移動が可能なUITableViewを作る
削除、セルの移動が可能なUITableViewを作る方法です。 TableViewを使うと簡単に編集可能なTableViewを作ることができます。
よくあるチュートリアル画面をUIPageViewControllerとSwiftUIで作る
UIPageViewControllerとSwiftUIでよくあるチュートリアル画面を作ります。 画面をスワイプすると次の画面が表示されます。
UserDefaults に配列を保存してTableViewに表示する
UserDefaults に配列を保存してTableViewに表示する方法です。 FirstViewController のボタンを押すと UserDefaults に現在の時刻が文字列として保存されます。 SecondViewController を表示すると UserDefaults のデータが読み込まれ、テーブルに表示されます。
UINavigationBar, UITabBar の色を変える
iOSでUINavigationBar, UITabBar の色を変える方法です。 エヴァンゲリオンをイメージしたカラーリングです。今度のエヴァの映画が楽しみです。
UITabBarControllerにUINavigationControllerを入れ子で実装する
UITabBarControllerにUINavigationControllerを入れ子で実装する方法です。 ついでに色もカラフルにしてみました。
SwiftUIでUITestを動かす
SwiftUIでUITestを動かす方法です。 UIKit の時と違って sleep を入れないと良い感じに動かなかったです。 State が変わると際レンダリングが走るせいでしょうか?
SwiftUIで続きを読む。。。ボタンがあるViewを実装する
SwiftUIで続きを読む。。。ボタンがあるViewを実装する方法です。 背景を透明色にし、そのサイズを PreferenceKey で取得することで実現しています。
Swiftで録画開始とスクリーンショットが取られたことを検知する
Swiftで録画開始とスクリーンショットが取られたことを検知する方法です。 画面録画開始前に captureStatusDidChange を実行させることができるのですが、スクリーンショット撮影前に captureStatusDidChange を実行させることはできませんでした。 もしスクリーンショットを取られてしまっては不味いものがある場合、動画であれば DRM を使用したり、サードパーティーの ScreenShieldKit を使用する必要があります。
XcodeでAtCoderをC++でやってみる
XcodeでAtCoderをC++でやってみました。 AppStore から Xcode をインストールし、Create a new Xcode project で macOS の Command Line Tool を選択して新しいプロジェクトを作成します。 言語は C++ を選択します。 これで C++ を書き始めることが出来ました。 試しに ABC-88-B - Card Game for Two を解いてみました。 AtCoder 楽しいですね!
SwiftUIで閉じることができないモーダルを表示する
SwiftUIで閉じることができないモーダルを表示する方法です。 以下の記事の応用です、UIKit を使わないでもできるようになって欲しいです。 SwiftUIでフルスクリーンモーダルを表示する
シミュレーターのスクリーンショットを影無しで撮影する(ツールバー無しで撮影する)
シミュレーターのスクリーンショットを影無しで撮影する(ツールバー無しで撮影する)方法です。 command + shift + 4 でスクリーンショットの撮影モードにしたあとに、スペースで撮影対象となる画面を選択し、クリックすることでスクリーンショットを撮ることができます。 そのときに option を押ながら撮影することで影無しでスクリーンショットを撮ることができます。 そして、ツールバーを画像編集ツールで取り除けば、ツールバー無しのスクリーンショット画像が手に入ります。 通常の方法で撮ったスクリーンショット 影無しで撮ったスクリーンショット
SwiftUIでアプリ起動時に画面を遷移させる
SwiftUIでアプリ起動時に画面を遷移させる方法です。 登録の導線で途中離脱したらその途中から再開させるようなUXを実現させようとしました。 NavigationLink の isActive を使って遷移していますが、遅延時間を設定しないとアプリの挙動がおかしくなってしまうので気をつけてください。
FunctionBuilderを使ってViewに影をつける
FunctionBuilderを使ってViewに影をつける方法です。 FunctionBuilderとViewModifier、どっちを使うか迷う時が良くあります。 関連してこちらもどうぞ。 ViewModifierを使ってViewに影をつける
ViewModifierを使ってViewに影をつける
ViewModifierを使ってViewに影をつける方法です。 FunctionBuilderとViewModifier、どっちを使うか迷う時が良くあります。 関連してこちらもどうぞ。 FunctionBuilderを使ってViewに影をつける
SwiftUIでNavigationViewのタイトルやテーブルビューの背景を変える
SwiftUIでNavigationViewのタイトルやテーブルビューの背景を変える方法です。 TableView と UITextView の appearance を変更しました。
SwiftUI で文字列中にタップ可能なリンクを追加する
SwiftUI で文字列中にタップ可能なリンクを追加するを作成する方法です。 UIViewRepresentable と UITextView を使って実現しました。 Reference: UITextViewにタップ可能なリンクを挿入する
SwiftでPDFを作成する
Swift で PDF を作成する方法です。 PDFKit で簡単に PDF を作ることができました、素敵ですね。 参考: Creating a PDF in Swift with PDFKit
UIActivityViewControllerでText, JSON, PDFを共有する
UIActivityViewControllerでText, JSON, PDFを共有する方法です。 簡単にファイルが共有できて実装が簡単なので重宝しています。 画像、PDFなどは Data を渡しても認識しますが、JSON などは Data を渡しても認識しないので、ファイルパスを指定しています。
SwiftUIでListの要素を削除した入り増やしたりする
SwiftUIでListの要素を削除した入り増やしたりする方法です。 Closure で渡すのはあまりよくない気がします。 もっと良い方法がありましたら教えてください。
SwiftUIでキーボードをボタンで隠す
SwiftUIでキーボードをボタンで隠す方法です。 UIApplicationを拡張して実現しています。 SwiftUIでキーボードを下げる(非表示にする)方法
SwiftUIで複数行の文字列を入力する
SwiftUIで複数行の文字列を入力する方法です。 UIKitのTextViewを使って実現しています。 早く公式でTextView 相当のものが出て欲しいです。
SwiftUIで下からPickerを出す
SwiftUIで下から Picker を出す方法です。 下からモーダルのように表示させています。 Importing an image into SwiftUI using UIImagePickerController
SwiftUIでUIImagePickerControllerを使う
SwiftUIでSwiftUIでUIImagePickerControllerを使う方法です。 UIKit と同じように任意の画像を取得することができました。 Importing an image into SwiftUI using UIImagePickerController
SwiftUIでButton内の画像の色を変えない
SwiftUIでButton内の画像の色を変えない方法です。 デフォルトのままだと以下の画像のように色が青く変わってしまいます。 renderingMode(.original) と設定することで、元の画像の色が表示されました。
iOS13のModalPresentationStyleを全部試してみた
iOS13のModalPresentationStyleを全部試してみました。 PopPage モーダルのことを弊社弊部所では「おしゃれモーダル」と呼んでいます。
Swiftで動画の終了を検知する
Swiftで動画の終了を検知するサンプルです。 動画はこちらのサイトからお借りしました。 Hybrid Creative Movies SAKURA こちらのサイトを参考にさせて頂きました。 動画の再生 How to detect when AVPlayer video ends playing?
Swiftで動画を再生する
Swiftで動画を再生するサンプルです。 動画はこちらのサイトからお借りしました。 Hybrid Creative Movies SAKURA こちらのサイトを参考にさせて頂きました。 動画の再生
SwiftUIでSwiftUIでサイドメニュー(ハンバーガーメニュー)を表示する
SwiftUIでサイドメニュー(ハンバーガーメニュー)を表示するサンプルです。 ドラッグで消す箇所などいくつか妥協しました。もっと良いサイドメニューをかけたら再度記事を投稿します。 How To Create A Side Menu (Hamburger Menu) In SwiftUI
SwiftUIのListのSectionの色を変える
SwiftUIのListのSectionの色を変えるサンプルです。 Appearanceを使って背景色を変えている記事がいくつかありますが、以下の方法でもできました。 Remove/change section header background color in SwiftUI List
タップでセクション区切りのListViewにチェックを入れる
タップでセクション区切りのListViewにチェックを入れるサンプルです。 タップすることで State が変化し、✔︎を描画するようになります。
SwiftでCSVを集計する
Swift で CSV を集計する方法です。 まず前処理として、CSV ファイルを utf8 に変換する必要があります。 Mac の場合は Numbers で開き、CSV で保存すると上手く行きました。 $ swift main.swift
UIViewの背景をグリッドにしたり、ドットにしたりする
UIView の背景をグリッドにしたり、ドットにしたりする方法です。 今回は GridView という UIView のサブクラスを作り、ボタンを押すことでドットが切り替わるようにしました。
ReplayKitを使って画面を録音する
ReplayKit を使うと画面を録画することができます。 凄く簡単に使うことができる上に、マイクで実況?をしたりすることができます。 今回は動画として保存しましたが、WebRTC と組み合わせたりと、いろいろなことに使うことができます。
SwiftUIでUICollectionViewのようにViewを並べる
SwiftUI で UICollectionView のように表示する方法です。 Q-Mobile/QGrid というライブラリを使うと簡単です。 QGrid を参考にしながら書いてみました。 参考: Q-Mobile/QGrid
SwiftUIでFirestoreの画像を表示する
SwiftUI で Firestore の画像を表示する方法です。 UIImage は SDWebImage を使えば簡単に表示できますが、SwiftUI ではそれができません。 SDWebImage/SDWebImageSwiftUIを使って以下のように書いてみました。 もっと良い書き方がある気がします、これだとトークンも含めてキャッシュされちゃうような。。。 参考: iOS でファイルをダウンロードする SDWebImage/SDWebImageSwiftUI
SwiftUIのToggleの変更を検知する
SwiftUIのToggleの変更を検知し、print 文を実行します。 参考: How can I trigger an action when a swiftUI toggle() is toggled?
SwiftUIで複数行のPickerを作成する
UIPickerView のような複数行の Picker を作成する方法です。 UIPickerView と使い勝手がかなり異なり、戸惑いました。 参考: Multi-Component Picker (UIPickerView) in SwiftUI 追記 iOS15では compositingGroup を追記する必要があります。
SwiftUIのPickerでLabelを表示しない
SwiftUIのPickerでLabelを表示しない方法です。 labelsHidden を設定することで可能です。 参考: How to hide the label of a Picker, Stepper, Toggle, and more using labelsHidden()
SwiftUIでPicker を表示する
SwiftUI で Picker を表示するサンプルです。 複数行の場合はこちらです。 SwiftUIで複数行のPickerを作成する 参考: Is there a way to call a function when a SwiftUI Picker selection changes?
SwiftUI で画面遷移先の View から遷移元のメソッドを呼び出す
SwiftUI で画面遷移先の View から遷移元のメソッドを呼び出すサンプルです。 delegate を使ったのですが、Combine で書いた方がよいかもしれません。
MVPアーキテクチャを使ったサンプルアプリ
MVPアーキテクチャを使ったサンプルアプリです。 Unitテスト、UIテストも書きました。 以下のような数字を足し合わせるアプリです。 リポジトリはこちら↓ MVP-Sample
StoryboardsをiOS13以上のプロジェクトから削除する
Swift & Storyboard でファイルを作成します。 Main.storyboard を削除します。 Main storyboard file base name の項を削除する。 Application Scene Manifest -> Application Session Role -> Item0 -> Storyboard Name を削除する。 SceneDelegate.swift で表示する ViewController を設定します。 func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { guard let windowScene = (scene as? UIWindowScene) else { return } window = UIWindow(frame: UIScreen.main.bounds) let viewController = ViewController() window?.rootViewController = viewController window?.makeKeyAndVisible() window?.windowScene = windowScene } 参考 Creating Apps Without Storyboards in iOS 13
HugoでGistが表示されない
Hugo のバージョンを更新したところ、以下のような Gist のページが表示されなくなりました。 <script src="https://gist.github.com/takoikatakotako/5aba51305d74c009a2c878897837e006.js"></script> 以下のように書き換えることで動作しました。 参考: Shortcodes 置換は Atom の正規表現置換機能を使い一括置換を行いました。
Dockerで Alpineベースのコンテナに入る
Docker コンテナの中に入ってシェルを使いたい時ありますよね。 普通は以下のようなコマンドでコンテナの中に入るのですが、Alpine ベースの時は bash の代わりに ash を使って入ります。 $ docker run --rm -t -i centos:centos7 /bin/bash s $ docker run --rm -t -i alpine:latest /bin/ash 参考 Dockerコンテナのシェルの中に入る dockerでalpine linux ベースのcontainerに入って、shellを使いたいとき。
SwiftUI でアラートを表示する
SwiftUI でアラートを表示する方法です。 UIAlertController とはかなり書き方が異なります。 Property Wrapper の @State がまだ慣れません。
Swift5.1で追加されたFunctionBuilderを使ってStructを作る
Swift5.1で追加されたFunctionBuilderを使ってStructを作る方法です。 SwiftUI でも活躍していますね。
SwiftUIでリストを編集する
SwiftUIでリストを編集する方法です。 UITableView よりも短いコードで書くことができました。 参考: How to enable editing on a list using EditButton
Dockerを使ってPostgreSQLを立て、テーブルを作成する。
Docker を使って PostgreSQL を立てる方法です。 開発環境を Docker をで立てて整備すると自分のローカル環境を汚さずに済むのでとても良いですよね。 postgres-Docker Hub 以下のコマンドで、ローカルの 5432ポートに postgres11 を立てることができ、kabigon というユーザーでログインすることができます。(パスワードはpassword) また pokemon というデータベースも同時に作られます。 $ docker run -d -p 5432:5432 -e POSTGRES_USER=kabigon -e POSTGRES_PASSWORD=password -e POSTGRES_DB=pokemon postgres:11 $ psql -h localhost -p 5432 -U kabigon -d pokemon ``` ログインができたら `\l` コマンドでデータベースの一覧を表示し、pokemon データベースが表示されていることを確認します。 また `docker-entrypoint-initdb.d` に `.sql` を置くと初期化時に実行してくれます。 初期テーブルなどを作りたい時に便利です。 `initdb` ディレクトリ の中に `setup.sql` を作成し、ディレクトリをマウントすることで、コンテナ初期化時に `.sql` が実行されます。 ```setup.sql create table pokemon ( id int8, name varchar ); create table pokemon_gym ( id int8, area varchar ); $ docker run -v $PWD/initdb:/docker-entrypoint-initdb.
TabViewを使って画面を切り替える(SwiftUI)
TabViewを使って画面を切り替えるサンプルです。 かなり簡単に書くことができますね。 TabView - SwiftUI | Apple Developer Documentation
Alamofireで受け取ったJsonをCodableを使ってパースする
お天気Webサービス(Livedoor Weather Web Service) の API を Alamofire から叩き、帰ってきた JSON を struct にパースする方法です。
SwiftUIでStructが使いまわされる
画面遷移をするたびに異なる ID を表示させたかったのですが、それができませんでした。(毎回同じ ID が表示される) onDisappear で id を再生成することで回避しました。 @State に変化が無い場合はキャッシュを使い回したりするということでしょうか? 勉強していきます!!
インフラエンジニアなりたてで知らなかった単語をまとめ
インフラの勉強をし始めて分からなくて調べた単語をまとめました。 コンソリデーティッドビリング(Consolidated Billing) 一括請求機能。AWS Organizations で利用することができ、組織の連結アカウントのすべての料金を支払者アカウントに一括請求することができる。連結アカウントのコストを追跡することが可能となる。 ルートアカウント AWSアカウントを作成するときに使用した Eメールアドレスとパスワードで AWSマネジメントコンソールにサインインするとルートアカウントとしてログインすることができる。 ルートアカウントはAWSアカウントのすべてのリソースへの完全かつ無制限なアクセスが可能になり、そのアクセス権限を制限することはできない。 普段はルートアカウントでサインインしない AWS アカウント(ルート)のアクセスキーを使用しない AWS 多要素認証(MFA)を有効にする IAM: Identity and Access Management AWS リソースへのアクセスを安全にコンソールするためのウェブサービス。IAM を使用して、リソースを使用するために認証 (サインイン) され、許可された (アクセス許可を持つ) ユーザーを制御する。 IAMユーザー IAM ユーザーは、AWS を操作するために IAM ユーザーを使用する人物またはサービス。 IAM ユーザーは主に、ユーザーが対話型タスクを実行するために AWS マネジメントコンソールにサインインする場合や、API または CLI を使用して AWS サービスに対しプログラムによるリクエストを行う場合に使用する。 GUI用とCLI用の二種類が存在する。 IAMグループ IAM グループとは、IAM ユーザーの集合。 グループを使用して、ユーザーの集合に対してアクセス権限を指定でき、ユーザーのアクセス権限を容易に管理することができる。 ポリシー ポリシーは、ユーザーが実行できるアクションと、アクションが影響を与えることができるリソースを登録したドキュメント。 IAM ユーザーを IAM グループにまとめ、そのグループにポリシーをアタッチできる。そのグループのすべてのユーザーは、グループにアタッチされているポリシーの内容通りのアクセス許可を持っている。 リージョン 物理的なサーバーが置いてある地理的に離れた領域。ap-northeast-1 が日本。us-west-2 がオレゴン。 アベイラビリティゾーン データセンターの場所。ap-northeast-1a が品川、ap-northeast-1c が埼玉にあるという噂を聞いた。 ローリングデプロイ(Rolling Deployment) 複数の稼働中サーバーに対して一定数づつ新しいアプリケーションをデプロイ、リリースしていく方法。 In-Place Deployment と Immutable Deployment がある。
PHP で本当に簡単なモックサーバーを作る
ローカルにモックサーバーが必要だったので簡単なものをPHPで作ってみました。 signup.php でユーザー登録を行い、list.php でユーザーの一覧を表示し、deleate.php でユーザーを全て削除します。 # サーバー起動 $ php -S localhost:8000 # ユーザー登録 $ curl http://localhost:8000/signup.php -X POST -H "Content-Type: application/json" -d '{"name":"onojun", "age":24}' # ユーザー一覧 $ curl http://localhost:8000/list.php # 全てのユーザーを削除 $ curl http://localhost:8000/deleate.php
cURL(curl)でアプリにプッシュ通知を送信する
curl コマンドで iOS端末にプッシュ通知を送信する方法です。 証明書と秘密鍵の両方を含めたpemファイルを作成します。 $ openssl pkcs12 -in xxxx.p12 -nodes -out certificate-and-privatekey.pem curl コマンドでプッシュ通知を送信します。 プッシュペイロード、トピック、デバイストークンは使用している環境のものを使ってください。 また、本番環境(テストフライトなど)と開発環境ではドメイン (https://api.push.apple.com/3/device/ or https://api.development.push.apple.com) が違うことに気をつけてください。 # for 本番環境 $ curl -v -d '{"aps":{"alert":"hello"}}' -H "apns-topic: com.swiswiswift.myapp" --http2 --cert certificate-and-privatekey.pem https://api.push.apple.com/3/device/{your_device_token} # for 開発環境 $ curl -v -d '{"aps":{"alert":"hello"}}' -H "apns-topic: com.swiswiswift.myapp" --http2 --cert certificate-and-privatekey.pem https://api.development.push.apple.com/3/device/{your_device_token}
p12ファイルから証明書と秘密鍵を取り出す
.p12 ファイルから証明書と秘密鍵を取り出す方法です。 AWS SNS を Terraform で書くときに必要でした。 $ openssl pkcs12 -in xxxx.p12 -nodes -nokeys -out certificate.pem $ openssl pkcs12 -in xxxx.p12 -nodes -nocerts -out privatekey.pem ただ、この方法では、ファイルの先頭に NoArgument から始まるテキストが入ってしまいます。 NoArgument が入っても悪さはしないのですが、気になったので消そうとしました。 以下のコマンドを実行すると秘密鍵は NoArgument 無しで変換できました。 証明書はそのテキストを消す方法が見つから無かったのでいったん諦めました。 もし分かりましたら追記します。 $ openssl pkcs12 -in xxxx.p12 -nodes -nocerts | openssl rsa -out privatekey.pem 参考: Push通知の証明書、p12 -> pem変換について
gem でインストールした cocoapods をアップデートする
gem でインストールした cocoapods のバージョンをアップデートする方法です。 cocoapods のライバル?の carthage が気になっています。 gem update cocoapods pod --version
iOSDC Japan 2019のDay1において、ルーキーズLT枠で登壇させていただきました
iOSDC Japan 2019のDay1において、ルーキーズLT枠で登壇させていただきました。 聞いたセッションについてはまた別ブログで。 まとめ ルーキーズLT枠で申し込んでよかったです!楽しかったです! ルーキーズLT 私はルーキーズLT枠で発表させていただきました。 「iOSDCでのトークが初めての方のみ応募が可能な枠」で、基本的なルールは通常のLTと同じです。 この枠で採択されたスピーカーは iOSDC の2-3週間前に開かれる「iOSDCルーキーズLT練習会」に参加することができます。 ルーキーズLT練習会では、運営スタッフの方に発表予定のスライドを添削して頂くことができます。 僕のスライドもたくさん添削していただき、かなり良い感じにして頂きました。 添削の他にも、友達(少なくとも僕からは一方的に思ってます)ができたのもとても嬉しいです。 同期?のような感覚で、iOSDC が終わった後も Twitter で絡んで貰え、とても嬉しいです。 発表 発表はとても緊張しました。発表中の記憶がありません。 プログラミング初心者の僕にいろいろ教えてくださった亀仙的な師匠な人(少なくとも僕からは一方的に(ry)の @tdakakさんや、ルーキーズLTで知り合った人が聞きにきてくれたのがとても嬉しかったです。 また、Twitterをエゴサしたらコメントが何件かありました。 発表のためにWindowsのPCを組んだり、ガジェットを作ったり大変でしたが、発表してよかったです。 発表スライド iOSエンジニアでもできるIoTガジェット作成 基板発注もう何も怖くない まとめ ルーキーズLT枠で申し込んでよかったです!楽しかったです! 事前に添削してもらえますし、友達もできるのでルーキーズLTで申し込んでも良いと思います。 追記 最後のネットワークスタッフの方のLTがとても面白く、カッコよかったです。 僕の本業はインフラエンジニアなので、ネットワーク周りを一年かけてもっと勉強して強くなり、スタッフとして貢献できたら良いなと思いました。時期が来たら応募してみたいです。 ネットワークスタッフの方には「来年に備えて八の字巻き練習しといて!!」と言われました、練習します。
TableViewのセルの高さを変更する(Swift5.0.1)
TableView のセルの高さを変更する方法です。 一括で帰るときは .rowHeight を使い、個別に変えたいときは heightForRowAt を使うと実現できました。 サンプルコードはこちら。 https://github.com/takoikatakotako/swiswiswift-ios
ビズリーチキャンパスでアカウントがロックされた時の解除方法
パスワードをリセットする事で、アカウントのロックが解除されました。 運営への問い合わせをしなくても解除できました。 https://br-campus.jp/password/reset
ログイン時にメッセージを表示する(CentOS7)
サーバーを複数管理していると間違えて異なるサーバにログインしてしまう事があります。 ログイン時に表示したい文字は $/etc/motd に記述します。 ただのテキストだと気が付きにくいので、figlet コマンドを使ってAAを作成するのがマイブームです。
iOSでUITest(E2Eテスト)を行う(Swift5.0)
Swift でUITest を行うサンプルコードです。 左右のテキストフィールドに数字を入れ、ボタンを押すとその積を計算するアプリを作りました。 そしてそのアプリのUITest を実装しました。 参考: 【Swift】初めてのUITest導入
RootViewController をアニメーション付きで切り替える(Swift4.2)
RootViewController をアニメーション付きで切り替えるサンプルコードです。 チュートリアルの後とかでの使用を想定しています。
id_rsa’ are too open.
以下のエラーが出てssh接続ができなくなりました。 原因は秘密鍵の権限を制限してあげることで解決しました。 WARNING: UNPROTECTED PRIVATE KEY FILE! @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ Permissions 0777 for '/root/.ssh/id_rsa' are too open. It is recommended that your private key files are NOT accessible by others. This private key will be ignored. bad permissions: ignore key: /root/.ssh/id_rsa $ chmod 600 /root/.ssh/id_rsa 参考 Error permission denied through ssh
ローカルのJsonファイルをParseしてテーブルビューに表示する(Swift4.2)
ローカルに追加したJsonファイルをパースし、TableViewに表示するサンプルコードです。 SwiftyJsonなどを使うともっと良い感じにかけますが、今回は使わないで書いてみました。
SwiftでUITestを導入(Swift4.2)
プロジェクトにUITestを追加します。 プロジェクト作成時に作らなかった場合は以下の画像の手順で追加することができます。 @testable import Swiswiswift(Swiswiswiftはプロジェクト名) と書くことで、テストクラスの中から参照できるようになります。 関数名の頭にtestと付けることで、テストとして実行できるようになります。
UITableViewでテーブルにアイテムを表示(Swift4.2)
UITableViewはリストのような形でテキストを表示するクラスです。データ一覧などを表示する時などに役立ちます。 UITableViewのクラス階層 NSObject ↑ UIResponder ↑ UIView ↑ UIScrollView ↑ UITableView AppleDeveloperリファレンスUITableView
NavigationControllerで画面遷移を行う(Swift4.2)
#Swift4.2 NavigationContorollerのサンプルコードです。 NavigationContorollerは横にニュッと動いて画面遷移をします。
NavigationControllerのRootを切り替える(Swift4.2)
`# Swift4.2` `setViewControllers`でNavigationControllerのRootを切り替えています。
tar (child): gzip: Cannot exec: No such file or directory
`tar` コマンドで解答ができずに困りました。 $ tar -zxvf openjdk-11.0.1_linux-x64_bin.tar.gz tar (child): gzip: Cannot exec: No such file or directory tar (child): Error is not recoverable: exiting now tar: Child returned status 2 tar: Error is not recoverable: exiting now 依存パッケージの gzip を入れてあげることで解決しました。 $ yum install gzip
sudo 時に PATH を引き継ぐ
which java と sudo which java でパスが違ったのでその解決 参考: sudo「コマンドが見つかりません」PATHが初期化されているときの対処法
ImagePickerControllerで画像を選択する(Swift4.2)
# Swift 4.2 Swift3の記事はこちら UIImagePickerControllerで画像の選択 iPhoneのフォトライブラリから画像を取得するサンプルプログラムです。 フォトライブラリから画像を選択するために、プロジェクトの info.plistにフォトライブラリを使用する旨を記述します。 これを書いておかないとUIImagePickerControllerは使えません。 キーの値は以下の値を使います。 NSPhotoLibraryUsageDescription TypeはStringでValueの中に使用理由を書きます。 使用理由を書かないと審査の時に落とされるらしいです。
UITableViewの中身をUISearchBarで検索する(Swift4)
#Swift4.2 UITableViewとUISearchBarを組み合わせたサンプルです。 ナビゲーションバーにある虫眼鏡を押すとSearchBarが現れ、そこに文字を入力することで検索結果が表示されます。 Swift3 での記事はこちら
アプリ使用中に位置情報を取得する
#Swift 4.2 アプリ使用中に緯度と経度を取得するサンプルコードです。 端末の緯度と経度が変わるとラベル文字列が更新されます。 参考 [iOS] 位置情報の取得 (Swift3編) 【CoreLocation】位置情報を取得する LocationManagerを使用する場合は、「位置情報を利用する目的」をInfo.plistに記載する必要があります。 起動中のみ位置情報を取得する場合 NSLocationWhenInUseUsageDescription このアプリは、マップで道案内するため、位置情報を取得します 常に位置情報を取得する場合 NSLocationAlwaysUsageDescription åこのアプリは、移動距離取得のため、常に位置情報を取得します 位置情報が変更されるとラベルに文字が表示されます。
Lifesumアプリのインタラクションが素敵だったので再現してみた
#Swift4.2 Lifesumというアプリの登録導線のインタラクションがとても素敵だったので再現してみました。 インタラクションの凄さと登録導線離脱率の相関が気になりますね。
押すとクニュっとするボタンを実装する
#Swift 4.2 押すとクニュっとするボタンのサンプルコードです。 iOSでよくあるマイクロインタラクションです。 僕はマイクロインタラクション大好きなんですが、エンジニアやデザイナーの自己満なんでしょうかね? わからんとです。
SSH で入ることのできるDockerイメージ(Ubuntu14.04)
Ansibleの練習のため、SSHで入ることができるイメージが欲しくて書きました。 CentOS7はこちら CentOS6はこちら 参考 Docker 初心者 — ssh で接続できるサーバーを立てる $ docker build -t ssh_ubuntu14:latest . --no-cache $ docker run -d -p 2222:22 ssh_ubuntu14:latest $ ssh-keygen -R [localhost]:2222 $ ssh -p 2222 kabigon@localhost
SSH で入ることのできるDockerイメージ(CentOS7)
Ansibleの練習のため、SSHで入ることができるイメージが欲しくて書きました。 docker build -t ssh_centos7:latest . --no-cache docker run -d -p 2222:22 ssh_centos7:latest ssh-keygen -R [localhost]:2222 ssh -p 2222 kabigon@localhost
食洗機の分岐水栓取り付け工事を自分で行う。
例のPayPyaの20%キャッシュバックキャンペーンに釣られてビックカメラで食洗機を買いました。 パナソニック 食器洗い機(ホワイト)【食洗機】 Panasonic プチ食洗 NP-TCB4-W 食洗機の分岐水栓の取り付け工事は1万5千円(工事五千円+分岐水栓1万円)かかると言われたので、自分でやってしまおう!と思い自分でやりました。 分岐水栓と、様々な大きさのナットに対応できるモンキーレンチを購入します。 分岐水栓の工事にはモンキーレンチは二つ必要です。(ナットを抑える用+ネジを回す用) SANEI 【食器洗い機用分岐ソケット】混合栓本体と偏心管の間に取り付けて分岐するタイプ PB515S 私のマンションの蛇口がTOTO製で、ナットのサイズが違うため分岐水栓(PB515S)がつけらえれなかったので、以下のアダプターも購入しました。 蛇口のサイズと分岐水栓のサイズを確認し、もしアダプターが必要なら急いで分岐水栓と蛇口を持ってホームセンターに駆け込んで購入すれば良いと思います。 SANEI 偏心管アダプター PT243S SANEI 偏心管アダプター PT242S 材料、道具が揃ったら早速工事をしていきます。水道の元栓を止め蛇口を取り外します。 水道の元栓を止めずに蛇口を外すと大惨事になりますので気をつけてください。 蛇口を外したら分岐水栓やアダプターとサイズが合っているか確認します。 この段階でサイズが合っていなかったら蛇口を元に戻すが、急いでホームセンターに駆け込みます。 分岐水栓、蛇口、アダプターを接続して完了です。 接続が甘いと水が吹き出します、その場合はすぐに元栓を止めてください。
Alamofireを使ってAPIからJSONを取得する(Swift4.2)
古い記事(Swift3)は こちら Alamofireを使ってAPIからJSONを取得する #Xcode 10.1 #Swift 4.2 swiftの有名な通信ライブラリであるAlamofireとこれまたSwiftで有名なJSONを扱うライブラリであるSwiftyJSONを使って、 お天気APIから情報を取得するサンプルです。 今回のサンプルでは非同期でJSONを取得し、アラートを表示します。 ATS の設定も必要なのでお忘れなく。
Android Studio でアイコンを設定する
– File -> Image Assets で Configure Image Asset を開く – Pathの…ボタンを押し、アイコンにしたい画像を選択する。 – Resize でサイズの微調節を行う。 – Nextボタンを推し、アイコン画像の名前やサイズを確認し、Finish。
BottomNavigationViewで切り替え時に色を変える
res/color ディレクトリ以下に bottom_navigation_color.xml ファイルを作成し、そこにstateごとの色を書くことで実現できます。
SSH で入ることのできるDockerイメージ(CentOS6)
Ansibleの練習のため、SSHで入ることができるイメージが欲しくて書きました。 $ docker build -t docker_ssh:latest . $ docker run -d -p 2222:22 docker_ssh:latest $ ssh -p 2222 kabigon@localhost
Fragmentsを入れ子にしたBottomNavigationを実装する
BottomNavigationはiOSのTabBarControllerによく似たAPIです。 BottomNavigationのタブを選択するとFragmentが切り替わるサンプルコードです。 参考にさせていただいたページ。 BottomNavigationView入門 Bottom Navigation Android Example using Fragments
Xcode10でプロジェクト名を変更する
こちらの記事を参考にさせていただきました。 ありがとうございます! 参考記事の方が丁寧に書いてありますので、わからないことがあったら是非そちらを Xcodeでプロジェクト名を変更する方法 (Xcode8.0) 今回は WebRTCHandsOn というプロジェクト名を、simple-video-chat-ios というプロジェクト名に変更します。 1.Xcodeからプロジェクト名を変更する 右側ペインにその詳細が表示されるので「Identity and Type」のNameを新しいプロジェクト名(ここではsimple-video-chat-ios)に修正する。 確認とアラートが出るので、 rename ボタンを押してリネームする。 2.Schemeの変更 画面上部のメニューから「Product」-> 「Scheme」->「Manage Schemes」 を選択します。 アラートが表示されたら左下の 「+」 ボタンを選択し、新しいターゲット(リネーム後のターゲーット)を追加します。 新しいターゲットを追加したら、古いターゲットを削除し、 close します。 3.Podfileの修正 CocoaPodsを使っている場合は、podファイルも修正が必要です。 targetの箇所に新しいプロジェクト名を入力してください。 podfileの修正が完了したら、Podディレクトリを削除し、 もう一度 pod install を行います。 前のプロジェクト名の.workplaceファイルは不要なので削除します。 pod installが終わったら、General の Linked Frameworks and Libraries を開き、半透明になっている古いプロジェクト名のLinkを削除します。 この状態でビルドし、エラーが出ないことを確認してください。 5.ディレクトリ名の修正 最後に手作業でディレクトリ名を新しい名前に修正します。 ディレクトリ名を修正するとXcodeが認識しなくなってしまうので、 Identity and Type で新しいディレクトリを登録します。 info.plist の読込先も間違っているので修正します。 これで完了です! 2019/06/20 追記 リネームを行うとUnitTest, UITest が実行できなくなってしまいました。 Target を一度削除して、作り直すとうまく動作しました。
Build input file cannot be found: Libraries/WebSocket/libfishhook.a’
//参考 Xcode 10 libfishhook.a cannot be found Xcodeを10.0 にアップデートしたら上記のエラーが出てReactNativeのコンパイルできなくなった。 RTCWebSocket.xcodeproject -> RCTWebSocket -> Build Phasesを選択 -> Link Binary WithLibraried にlibfishhook.aを追加。 すでに追加されている場合は削除 を行うことで解決した。
KotlinでListViewを内包したTabを作成する
KotlinでListViewを内包したTabを作成しました。 参考にさせて頂いたWebページです。 すごく良い記事なので、この記事より彼の記事をみてください。 Getting Started with Tabs in Android — Kotlin build.gradle に以下のdependencyを追加します。 implementation 'com.android.support:design:26.1.0'
SafeAreaを取得する
iPhoneXが登場したことで、iPhoneXのレイアウト(SafeAreaの取得)には気を使うようになりました。 SafeAreaはviewDidLayoutSubviews メソッド内で、safeAreaInsets プロパティを参照することで取得することができます。
iOSでバーコードを読み取る
Swiftでバーコードを読み取るサンプルコードです。 Swift 4.1 // 参考にさせて頂いたサイトです Swift 4でQRコードを読み取る AVFoundation(AVCaptureMetadataOutput)でバーコードリーダーを作ってみた まず、info.plistに Privacy - Camera Usage Description のキーを追加し、使用理由を記述します。 「バーコードリーダー読み込みます」などなど。 この文言は使用許可を求める時に表示されます。
ReactNativeで画像をボタンにする(TouchableOpacity)
ReactNativeで画像などのViewをボタンにするTouchableOpacityの実装サンプルです。 カビゴンの画像をタップするとアラートが表示します。 react-native: 0.56.0
ReactNativeでたまにしか使わないコマンドのメモ
ReactNativeでたまにしか使わないけど大事なコメントのメモです。 react-native-cliをnpmでグローバルにインストールする npm install -g react-native-cli react-native -v プロジェクトを作成する *Sample(react-native init Sample)などReactNativeとか内部で使っている何かと名前が被るとエラーが出るみたいなので気をつけてください。 react-native init ReactNative iosのエミュレーター起動する cd ReactNative react-native run-ios
ReactNativeで画像を表示する
ReactNativeで画像を表示するサンプルです。 iOSで画像をインターネットから取得する場合はATSを設定する必要があるので気をつけてください。 react-native: 0.56.0
FlexBoxでViewの大きさを指定する
FlexBoxでViewの大きさを指定するサンプルコードです。 react-native: 0.56.0 紫、黄土色、水色のViewが 1 : 2 : 3 の高さになっています。 横にするには flexDirection: ‘row’と設定します。
流れるように動く背景を実装する
私が作っている4択化学というアプリの背景の実装方法をたまに聞かれるので、それのサンプルコードを書きました。 アプリのアイコン画像がViewの背景を流れます。 またviewDidLoadにアニメーション関係のメソッドを書くと、NavigationBarの遷移によりアニメーションが止まってしまうことがあります。 その場合はアニメーション関係のメソッドをviewWillAppearに書き出すことで解決します。
UITabBarControllerにUINavigationControllerを入れ子で実装する
UITabBarControllerにUINavigationControllerを入れるコードです。 UITabBarControllerにUINavigationBarControllerを入れて実装しています。 新しい記事があります。 UITabBarControllerにUINavigationControllerを入れ子で実装する
UITabBarControllerを実装する
Viewの切り替えに使われるUITabBarControllerを実装サンプルです。 UITabBarControllerのアイコンは30×30の透過pngです。
let’s encryptでさくらサーバーをhttpsにする
以下のサイトを参考にして証明書の設定をして以下の.htaccessをrootにおけば完成です。 ちょっとだけ詰まりました。 さくらのサポート情報 【無料SSL】サーバコントロールパネルからの導入手順
Asset CatalogでColor Setを使って色を管理する
Xcode9(iOS 11)から、色をAssetで管理することができるようになりました。 UIColorのExtensionを作って色を登録して関数作ったりしてごにょごにょしなくて良くなりました。 色の管理がしやすくなりましたし、デザイナーさんとの連携もちょっとしやすくなったのかな?って思いました。 とても良い機能なんですが、iOS11以上でしか動かないので注意が必要です。 Deployment Targetを11.0以上にしないと警告が出ます。 Assetを開いて右クリック -> 「New Color Set」を選択 ここでは「original」という名前で濃い緑色を登録
Appleのエンジニアさんにコードレベルの質問を送ってみた
「AppleDeveloperの登録料が高すぎる」と友達からよく言われるんですが、高いだけあって良いところもたくさんあります。 その中の一つがTechnical Support Incident(TSI)で、修正できないバグや問題をコードのレベルでAppleのエンジニアさんが質問に答えてくれたり、相談に乗ってくれます。 AppleDeveloperProgramを登録or更新すると2回テクニカルサポートの権利がもらえます。 以前、目覚まし時計のアプリを作っており、その途中で解決できないバグがありました。 具体的には「iPhoneのロック中に通知の音が鳴らない」というもので、シミュレーターでは動くのに、実機ではそのバグが現れます。 自分では解決できなかったため、DTIを使うことにしました。 まず、バグの部分を切り出したXcodeのプロジェクトを作り、githubに上げました。 次に「タイトル」、「バグの説明」、「再現手順」、「(リリース済みアプリの場合は)App NameとApp ID」を英語で書き、アカウントページの Code-Level Support のフォーム(https://developer.apple.com/account/?view=support)から送りました。 すぐに自動返信メールがくるので、そのメールにバグの部分を切り出したXcodeのプロジェクト(github に上げたものと同じもの)を添付して返信しました。 2日後にAppleのエンジニアさんから返事が届きました。 「Xcodeプロジェクトと再現手順ありがとう!君の手順どうりにやったんだけど、僕の環境ではバグは出なかったよ。他の端末でチェックしてみて」といった内容で、妻と友達の端末を借りて動かしたらちゃんと動きました。 僕のiPhoneが壊れていたみたいです。。。orz つまらないオチですが、Appleのエンジニアさんが実際にコードを動かして試してくれるのはとてもありがたく、本当に詰まった時はありがたいなと思いました。 それでは良いSwiftライフをーー! AppleDeveloper -テクニカルサポートのリクエスト- https://developer.apple.com/jp/support/technical/
UIViewの背景をグラデーションさせる
UIViewの背景をグラデーションさせるサンプルコードです。 参考にさせていただいたページ 【Swift x iOSアプリ開発】Viewの背景色にグラデーションを設定する方法 Swift UIViewの背景をグラデーションさせる方法 -iPhoneアプリ開発-
カスタムボタンクラスを実装する
UIButtonを拡張したカスタムボタンクラスを作成して貼り付けるサンプルコードです。 見た目を別ファイルに切り分けることでViewControllerがすっきりします。
TableViewを編集してCellを削除する
TableViewを編集してCellを削除するサンプルコードです。 NavigationBarに編集ボタンを追加し、そのボタンを押すことでセルを削除することができます。 NavigationControllerについてはこの記事を参考にしてください。 NavigationControllerを実装する
TableViewを編集してCellを削除する(横スライド)
TableViewを編集してCellを削除するサンプルコードです。 以下の関数を追加することで、セルを横スライドで削除できる機能を付けることができます。 func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath)
数字を三桁ごとにカンマ区切りにする(日本円の表示)
日本円を表示するときのように3桁ごと,で区切る方法を調べてみました。 123,456,789円 みたいな感じです。 参考に指せて頂いた記事 [Swift]数字を三桁ごとにカンマ区切りにする
現在の日付と曜日、現在時間を取得する
Swift4.1で現在の日付と曜日、現在時間を取得するサンプルコードです。 以下の形式の文字列で取得してくれます。 2018/04/03 (木) 19:03:34 上のような形式で取得するサンプルコードです。 Calendar.currentで取得すると、設定によっては和暦(平成〇〇年)で取得してしまう可能性があるので(2018/04/03が欲しいのに30/04/03が帰ってくる)、グレゴリオ暦で取得する方が無難です。 逆に和暦が欲しいときは和暦で取得する方法もあります。 このサイトが詳しいです。 Swift 3 の日時操作チートシート その他参考にさせていただいたサイト Swift3での日時に関する処理 【Swift3】現在時刻の取得とDataFormatterでの文字列化
CustomTableViewCellとaccessoryViewを使ってTableVIewのレイアウトをカスタマイズ
CustomTableViewCellを作ると好きなレイアウトのCellをTableViewで使うことができます。 そしてTableViewCellのアクセサリービューにはUISwitchやチェックマークなどのアクセサリをつけることができます。 今回はその両方を使ったサンプルコードです。 参考にさせて頂いたウェブサイト [Swift]UITableViewCellのaccessoryViewでaccessoryButtonTappedForRowWithIndexPathが来ない件の対応
Arduinoでボタンを使う(プルアップ抵抗無し)
Arduinoでボタンを使うときのサンプルコードです。 あんまり知られていないんですが、プルアップを使うとプルアップ抵抗が無しで簡単にボタンを使うことができるんですよ。 グラウンドとDegitalの2番ポートを繋げると(ボタンを押すと)そのことを認識できます。
Google Cloud FunctionでHelloWorld
Google様のCloud Functionを触ってみたので、そのメモです。 HelloWorldとJsonでの出力とgetの受け取りです。
ESP32でRTCモジュールを使う
ESP32でRTCモジュールを使おうとしたら少し詰まったので記事にしました。 結論を先に書くと、#include DS1307RTC.h を一番上に持ってくることで解決しました。 サンプルコードのReadTestのESP32バージョンになります。 使用ライブラリと機材は以下の通りです。 DS1307RTCライブラリ github.com/PaulStoffregen/DS1307RTC ESPr® Developer 32 HiLetgo 3個セット DS3231 AT24C32 時計モジュール リアル時間時計モジュール IICモジュール RTCモジュール Arduinoに対応 並行輸入品 配線図
文字列やURLからQRコードを生成する
文字列やURLからQRコードを生成するサンプルコードです。 This is a sample code that generates a QR code from a character string or URL. これらの記事を参考にさせていただきました。 CIImageをData型に変換したときにハマった時の対処法(Swift3.0) SwiftでQRコードを生成してみた 生成したQRコードはこちらです。
UIAlertControllerでアラートを表示する
UIAlertControllerを使ってアラートを出すサンプルです。 UIAlertControllerStyle.alert をUIAlertControllerStyle.actionSheet にするとニュッと下から出るタイプのアラートになります。
UIAlertControllerで下からニュッと出す(UIActionSheet)
下からニュッと出てくるアラートはUIAlertControllerを用いて実装します。 遥か昔、下からニュッと出てくるアラートはUIActionSheetなんて呼ばれている時期もありましたが、UIAlertControllerに統合されました。
iPhoneアプリのプログラミングの勉強法
「iPhoneアプリを作るには何から勉強したらいい?」と友達にちょくちょく聞かれるのでオススメの勉強法をまとめてみました。 iPhoneアプリの勉強方に王道が無いと思いますが、良かったら参考にしてください。 1.書籍で勉強する まずはじめに書籍で勉強することをオススメします。 Webページは見返すことが難しかったり、情報が古かったりすることが多いので、やはり初めに書籍を写経することを勧めます。 最近の本はどれも良い本なので、どれを買っても良いと思いますが、以下の本が特にオススメです。 また、書籍は環境に合わせたもの(可能であれば新しいもの)を買ってください。 Swift4でだいぶ落ち着いてきたのですが、Swiftの書き方とXcodeのUIはバージョンでだいぶ異なります。 初めてXcodeに気をつけてください。 2.アプリをリリースしてみる 「いきなりかよ!」と思うかもしれませんが、書籍で勉強したらアプリをリリースしてみることをオススメします。 初めてのアプリなので、本当に簡単なもの、書籍のアプリを少し手を加えたものを作り、リリースします。(実際にリリースしなくても審査には出す) あまりに簡単なアプリは審査でリジェクトされてしまうので、一捻りを加えたアプリを出しましょう。 開発者の登録や、審査など苦しむことも多いですが、とても勉強になります。 「こういう機能はどうやって実現したら良いの?」みたいな質問は大歓迎です。 気軽にコメント欄にご記入ください。(ブログのネタ不足で困っています。。。) 3.Cocoa Podsを覚える、ライブラリを使う iOSアプリ開発用にPodsと呼ばれるライブラリ管理ツールがデファクトスタンダードです。 gemやnpmやHomeBrewに近いのかもしれません。 ライブラリを入れるとカッコいいUIが簡単に作れたり、通信周りの処理が楽になったりします。 何か参考になりましたら幸いです。
UserDefaultsを使ってパラメーターを保存する
UserDefaultsはアプリを落としても保持しておきたいデータを保存するときに使います。 使い方はいたってシンプルです。 サンプルコードでは、まず最初に userDefaults.register(defaults: ["KEY_LabelText": "Hello"]) で初期値を設定しています。 .register() はとても便利で、指定したキーに対応するデータが存在しない場合に、初期値を入れてくれます。 次にラベルにUserDefaultで保存した値を読み取り、ラベルのテキストに反映。 そしてボタンを押されたらuserdefaultsとラベルの値を更新しています。
UIPickerViewを使って値を選択する
はいどーも! UIPickerViewを使って値を取得するサンプルコードです。 PIPickerViewは選択肢の中から要素を選ぶときによく使いますね。 今回は食べ物とドリンクとフードを選ぶアプリを作ってみました。 新しい記事は こちら AppleDeveloperDocuments UIPickerView
カスタムレイアウトを持つコレクションビューをつくる
今作成しているアプリに画像が入れ子となったデザインをつくることになったので、実装方法について調べました。 主なコードは以下のサイトを参考にさせていただきました。 本当にありがとうございました。 Swift2->4の変換は大変でした。。。 iOS UICollecionViewFlowLayout でカスタムレイアウトを作ろう ~ Swift版
SwiftでUDP通信を行い、文字列を送る
SwiftでUDP通信するメモです。 SwiftSocket をcocoapodsで入れて、こんな感じで書きました。 woom-02と通信するのに使いました。
Swift3からSwift4への移行時に出る@objc inference warningsを消す
Xcode8からXcode9へ乗り換えてSwift4へ変換すると以下のエラーが出ます。それの消し方です。 The use of Swift 3 @objc inference in Swift 4 mode is deprecated. Please address deprecated @objc inference warnings, test your code with “Use of deprecated Swift 3 @objc inference” logging enabled, and then disable inference by changing the "Swift 3 @objc Inference" build setting to "Default" for the "TargetName" target. 各ターゲットを選択 -> Build Settings -> 検索窓で inference と検索 -> Swift @objc inference を Default に設定する 他にもターゲット(UITest,UnitTest)がある場合はそれも Default に設定する。
UINavigationControllerの戻るボタンの戻るを消す
UINavigationControllerの戻るボタンの文字を消します。 「<戻る」を「<」にします。 let backButton = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil) self.navigationItem.backBarButtonItem = backButton self.navigationController?.pushViewController(picDetailView, animated: true)
UICollectionViewにCustomセルを追加する
UICollectionViewにCustumCollectionセルを追加してみました。 クラス名を文字列に変換する NSStringFromClass(CustumCollectionViewCell.self) は、UITableViewやUICollectionView を使うときにとても便利です。
UICollectionView
新しい記事 があります。 UICollectionViewのサンプルです。 UICollectionViewを使う を参考にさせていただきました。 このサイトは見やすくて、swiftをやる人にとてもオススメです。 makeColor() 関数でランダムに生成した色をセルに入れています。 スクロールするたびに色が変わります。
ESP32でSDカードのテキストファイルを読み書きする。
ESP32でSDカードに保存されたテキストファイルを読み書きするサンプルです。 読み込んで書き込むシンプルなサンプルコードがネットにあまりな無かったので描いてみました。 SDカードとESPとの配線はこちらのサイトを参考にしました。 mgo-tec電子工作 いろいろ調べたのですが、プルアップ抵抗はあった方が良いっぽいです。 そして、 mgo-tec電子工作 にはいつもお世話になっています、ありがとうございます。 そしてこちらのコードを参考にさせていただきました。 ArduinoでSDカードにデータを保存する
ymf825boardのサンプルコードのピンを変更
YMF825のサンプルコード (yamaha-webmusic/ymf825board)のピンを変更する。 シールドの関係で、規定のピンNo9,No10が使えなかったので、ピンを変更しました。
輸出コンプライアンスのウィザードをスキップする
アプリをTestFlightなどに提出すると、暗号化が含まれていないか聞かれます。 毎回聞かれるとスキップしたくなります。 Info.plist の ITSAppUsesNonExemptEncryption を NO にするとスキップすることができます。
curlでpostでJson送るときにレスポンスヘッダーも確認したい
curlでpostでJson送るときにレスポンスヘッダーも確認したい時に使いました。 最後に --include をつけるとレスポンスヘッダーも表示されます。 http://localhost:3000/api/url -X POST -H "Content-Type: application/json" -d '{"email":"user@swiswiswift.com", "password":"password"}'--include
curlでpostでJson送る
Macのターミナルからcurlコマンドでjsonをpostする方法です。 ローカルで開発をしていて、apiの確認をしたい時によく使います。 curl http://localhost:3000/api/url -X POST -H "Content-Type: application/json" -d '{"email":"kabigon@swiswiswift.com", "password":"password"}'
Alamofireを使ってAPIからJSONを取得する
新しい記事(Swift4)はこちらAlamofireを使ってAPIからJSONを取得する(Swift4.2) swiftの有名な通信ライブラリである Alamofire とこれまたSwiftで有名なJSONを扱うライブラリであるSwiftyJSONを使って、お天気API から情報を取得するサンプルです。 今回のサンプルでは非同期でJSONを取得し、アラートを表示します。
delegateで別のViewからメソッドを呼び出す
あるViewから他のViewControllerにある関数などを実行するデリゲートのサンプルです。 今回はモーダル表示したViewから、元々いたViewの背景色をデリゲートを使って変えています。
Swiftでクラス名と関数名と行番号を取得、表示する
「ここは動いたらヤバい!」的な箇所に書くとでデバックが捗ります。 クラス名と行番号、取得表示することができます。 print("Class name : \(NSStringFromClass(type(of: self))) ") print(#function, #line)
UIImagePickerControllerで画像の選択
iPhoneのフォトライブラリから画像を取得するサンプルプログラムです。 フォトライブラリから画像を選択するために、プロジェクトの info.plist にフォトライブラリを使用する旨を記述します。 これを書いておかないとUIImagePickerControllerは使えません。 キーの値は以下の値を使います。 NSPhotoLibraryUsageDescription Typeは String でValueの中に使用理由を書きます。 使用理由を書かないと審査の時に落とされるらしいです。 下の画像のような感じです。 コードは以下のようになります。
rootのログインを禁止にする
VPSを借りて一番最初に行うrootのログインの禁止のメモです。 rootでサーバーにログインしてパスワードを入力します。 $ ssh -l root xxx.xxx.xxx.xxx ユーザーの追加をします。onojunというユーザーを追加します。 $ adduser onojun パスワードを設定します。OSによってはadduserの時に設定するはずです。 $ passwd onojun 一旦ログアウします。 $ exit 作成したonojunでログインできるか確かめます。SSHのログインコマンドはお好みで $ ssh onojun@xxx.xxx.xxx.xxx ログインできたらrootに切り替えます。 $ su - sshの設定ファイルを編集します。バックアップも作って上げます。 $ cd /etc/ssh $ cp sshd_config sshd_config.old vimで設定ファイルを編集します。PermitRootLogin noにしてあげます。 $ vim sshd_config 40行目ぐらいにあります。 PermitRootLogin no ssshの再起動 $ service sshd restart rootでログインできなかったら終わり!!
texworksのURL
Windowsのパソコンを自作し、texworksを入れたのですがショートカットを間違えて消してしまい、困りました。 C:\w32tex\share\texworks\texworks.exe にありました。 TeXインストーラ 3 簡単LaTeXインストールWindows編(2016年4月版)
Igorでグラフの背景を白にする
グラフ中で右クリック -> Colors -> both background -> 白色を選択 でできました。 データの解析にすごい便利ですが、先輩のマクロを読むのは辛いです。。。
UIStatusBarを白くする
UIStatusBarを白くする方法についてです。 UIStatusBarを白くする方法その1 UIStatusBarを白くする方法その1です。特定のViewControllerを白くする方法です。白くしたいUIViewControllerに書きます。 NavigationController以下にあるStatusBarはこの方法では白くはなりませんので注意してください。 UIStatusBarを白くする方法その2 全てのStatusBarを白くする方法です。 プロジェクトのターゲットのinfoに[Status bar style]と[UIStatusBarStyleLightContent]、[View controller-based status bar appearance]と[NO]を追加します。NavigationController以下にあるStatusBarも白くなります。 わかりやすいようにViewの背景色をオレンジにしています。
UITableViewとUISearchBar
UITableViewとUISearchBarを組み合わせたサンプルです。 ナビゲーションバーにある虫眼鏡を押すとSearchBarが現れ、そこに文字を入力することで検索結果が表示されます。 UITableView 基本的なテーブルビューの例文を以下に示します。
UserNotification(LocalNotification)
UserNotificationはユーザーに対して通知を発行する時に使用します。 UserNotificationは大きく分けて二種類あり、外部から通知を発行できるRemoteNotification(LineやTwitterのような通知)とLocalNotification(時計アプリなどの内部的に発行する通知)があります。 ここではLocalNotificationを取り扱います。 UserNotificationサンプル 初めにオリジナル通知音の発行に使用する音データ(.cafファイル)をプロジェクトに登録します。 .caf ファイルをプロジェクトに追加し、BundleResoucesに登録されていることを確認します。 また使用したcafファイルはこちらです。 UserNotificationの仕様として、使用するオリジナル通知音に不具合がある場合、デフォルトの通知音が再生されます。
音声認識(SFSpeechRecognizer)
iOS10からSpeech Frameworkが登場しました。 ここではSFSpeechRecognizerを使って音声認識をしてみようと思います。 そしてシミュレーターでは動かないから気をつけてください。 参考: AppleDeveloper:SpeakToMe: Using Speech Recognition with AVAudioEngine 参考: あたも開発ブログ 参考: 【iOS 10】Speechフレームワークで音声認識 – 対応言語リスト付き プライバシー設定をinfo.plistに記入 iOS10になってから、プライバシーに関する機能(通知、カメラ、フォトライブラリへのアクセス)を使う際に、Info.plistにあらかじめ使うことを書いておかないとアプリが落ちてしまうようになりました。 音声認識機能を使う場合は以下のプライバシー設定を行う必要があります。 参考: アプリ開発ブログ(仮) info.plistを開き、Privacy – Speech Recognition Usage DescriptionをStringで追加し、右側に使用目的を記入します。 Privacy – Microphone Usage Description to practice programingもまたStringで追加し、右側に使用目的を記入します。 使用目的が書かれていないと審査で落とされるらしいです。 サンプルコード 音声認識の結果をAlertで表示するプログラムです。
UITextField
UITextFieldは文字の入力に使われます。 UITextFieldのクラス階層 NSObject ↑ UIResponder ↑ UIView ↑ UIControl ↑ UITextField AppleDeveloperリファレンスUITextField UITextField例文 UITextField、生成し、ボタンが押されるとUITextFieldから文字列を取り出してラベルにコピーします。
cafファイルの作成
.cafファイルはiOSに用いられる音声ファイル形式です。以下はwavファイルを同名で出力するコマンドです。 afconvert -f caff -d ima4 ファイル名.wav
UINavigationBar
iOSアプリの画面上部によく使われているUINavigationBarについてです。 UINavigationBarのクラス階層 NSObject ↑ UIResponder ↑ UIView ↑ UINavigationBar AppleDeveloperリファレンスUINavigationBar UINavigationBar例文 UINavigationBarを生成し、タイトルとボタンを付けます。
UILabel
UILabelクラスは文字表示を管理するクラスです。画面に文字を表示させたい時に使用します。 UILabelのクラス階層 NSObject ↑ UIResponder ↑ UIView ↑ UILabel AppleDeveloperリファレンス UILabel UILabelサンプル サンプルコード UILabelのカスタマイズ UILabelにタッチイベントを実装 参考: [Swift2.0] UILabelとUIImageViewのタップイベント処理を実装する
UITableView
UITableViewはリストのような形でテキストを表示するクラスです。データ一覧などを表示する時などに役立ちます。 UITableViewのクラス階層 NSObject ↑ UIResponder ↑ UIView ↑ UIScrollView ↑ UITableView AppleDeveloperリファレンスUITableView UITableView 二つのグループの場合です。
UIButton
UIButtonクラスはボタンを設置するためのクラスです。 ボタンタップでアクションを起こすことができます。 UIButtonのクラス階層 NSObject ↑ UIResponder ↑ UIView ↑ UIControl ↑ UIButton AppleDeveloperリファレンスUIButton UIButton例文 様々なUIButtonのサンプルです
UIBarButtonItem
UINavigationBarの要素追加、カスタマイズに用いられるUIBarButtonItemについてです。 UIBarButtonItemのクラス階層 NSObject ↑ UIBarItem ↑ UIBarButtonItem AppleDeveloperリファレンスUIBarButtonItem UIBarButtonItem例文 UINavigationBarを生成し、タイトルとボタンを付けます。 UIBarButtonItemの色の変更 UIBarButtonItemはデフォルトでは青色ですが、以下の方法で色を指定することができます。 Change color of Back button in navigation bar //ナビゲーションボタンの色を変更する UINavigationBar.appearance().tintColor = UIColor.black UIBarButtonSystemItem UIBarButtonSystemItemを用いることで、デフォルトに入っているボタンを使用することができます。 https://developer.apple.com/reference/uikit/uibarbuttonsystemitem //barButtonSystemItem:に [.add]を設定することで[+]ボタンを設定する,上のコード参照 let leftNavBtn = UIBarButtonItem(barButtonSystemItem: .add, target: self, action: #selector(leftBarBtnClicked(sender:))) Add Done Cancel Edit Save Compose Reply Action Organize Bookmarks Search Refresh Stop Camera Trash Play Pause Rewind Undo Redo PageCurl