- 投稿日:2020-12-16T23:38:01+09:00
DockerでMacに超絶シンプルなPHP&Apache環境を整える
はじめに
PHP案件を頂いたため、MAMPでやるかぁーと思ったのですが、ふと、「MAMPの必要あるか…?
」となりました。
というのも、今回はDB使わないし、MacにはPHPもApacheも入ってるよなと思ったのです。
Terminal$ php -v PHP 7.3.11 (cli) (built: Jun 5 2020 23:50:40) ( NTS ) Copyright (c) 1997-2018 The PHP Group Zend Engine v3.3.11, Copyright (c) 1998-2018 Zend Technologies $ httpd -v Server version: Apache/2.4.41 (Unix) Server built: Jun 5 2020 23:42:06うんうん入ってる。
ただし、ソースが動く本番環境のPHPバージョンは5系だったので、PHPのバージョンを切り替える必要がありました。
開発環境を整える方法として思いついたのは3つ。
- HomebrewでPHPバージョンを切り替えて開発する
- MAMPをちょっといじってPHPバージョンを切り替えて開発する
- Dockerを建てちゃう
そんなにPHP案件が多いわけではないですが、ローカル環境をガチャガチャするのが嫌だし、LinuxライクにコマンドポチポチーでApache起動できる方が慣れているので、今回は3つめのDockerを採用することにしました。
前提
環境 バージョン等 MacBook Pro 2019年モデル OS macOS Catalina Docker Engine v19.03.13 PHP 5.4 1. Docker Desktopをインストールする
公式サイトのDownload for Macを選択し、Docker Desktopをダウンロードします。
Docker.dmgを実行し、インストールします。
インストール完了したら実行します。
実行後、パスワードを求められることがありますが、適宜入力してください。実行すると上のメニューバーの右側にクジラさんが現れます。(ちっちゃくてすみません)↓
試しにターミナルでコマンドを打ってみて確認します。
$ docker version Client: Docker Engine - Community Cloud integration: 1.0.2 Version: 19.03.13 API version: 1.40 Go version: go1.13.15 Git commit: 4484c46d9d Built: Wed Sep 16 16:58:31 2020 OS/Arch: darwin/amd64 Experimental: false Server: Docker Engine - Community Engine: Version: 19.03.13 API version: 1.40 (minimum version 1.12) Go version: go1.13.15 Git commit: 4484c46d9d Built: Wed Sep 16 17:07:04 2020 OS/Arch: linux/amd64 Experimental: false containerd: Version: v1.3.7 GitCommit: 8fba4e9a7d01810a393d5d25a3621dc101981175 runc: Version: 1.0.0-rc10 GitCommit: dc9208a3303feef5b3839f4323d9beb36df0a9dd docker-init: Version: 0.18.0 GitCommit: fec36832. Dockerfileを作成してビルドする
2.1. Dockerfileの作成
Dockerfileを書いてイメージを作成します。
適当なディレクトリを作成し、Dockerfileを作成します。
$ mkdir php5_apache $ cd php5_apache $ vim Dockerfile公式のDockerイメージを拝借しちゃいましょう。
php:<version>-apache
と記述することで、Apacheも含んだコンテナを建てられます。
今回使用するバージョンは5.4ですのでその通り記述します。DockerfileFROM php:5.4-apache2.2. ビルド
docker build <Dockerfileのパス> -t <イメージ名>:<タグ名>
でビルドをかけます。ここでは、イメージ名はphp5_apache、タグはバージョンとして1.0と指定しておきます。
-t
: 名前とタグを指定するオプション$ docker build ./ -t php5_apache:1.0ビルドできたか確認しましょう。
$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE php5_apache 1.0 7246b9f23253 5 years ago 470MBちなみに、Docker Desktopのダッシュボードからも確認することができます。
3. コンテナを作成し、起動する
早速起動させていきましょう。
動かしたいソースは既に手元にあるので、マウントしちゃいます。
コマンドは以下の通り。
docker run -d -p <ホスト側ポート>:<コンテナ側ポート> -v <ホスト側パス>:<コンテナ側パス> php5_apache:1.0
今回使用したオプションの説明は以下。
-d
: デタッチドモードで起動する(バックグラウンド実行)-p
: コンテナのポートをホスト側に公開する-v
: ホスト側のディレクトリをコンテナにマウントする$ docker run -d -p 80:80 -v <作業ディレクトリ>:/var/www/html php5_apache:1.0無事に起動できたか確認しましょう。
$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 469f65bd6a4f php5_apache:1.0 "apache2-foreground" About a minute ago Up About a minute 0.0.0.0:80->80/tcp recursing_hodgkin4. ブラウザで確認
80番ポートで開いたのでポート指定なしで
localhost
をブラウザのアドレスバーに入力し開きます。
無事にPHP等が出力されていればOKです。5. コンテナの開始と停止
コンテナを一度作成してしまえば、
docker start <コンテナIDまたはコンテナ名>
で起動、docker stop <コンテナIDまたはコンテナ名>
で停止できます。今回はコンテナ名でやってみます。
recursing_hodgkinと名付けられていましたので、それで停止、開始してみます。$ docker stop recursing_hodgkin $ docker start recursing_hodgkin6. コンテナにログインする
以下でrootでログインできます。
ちなみにOSはDebianです。$ docker exec -it recursing_hodgkin /bin/bash出るときはおなじみの
exit
。# exit7. おまけ
7.1. Apacheのエラー
ふとログを見てみるとなんかエラーっぽいログが吐かれていました。
$ docker logs recursing_hodgkin AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message [Thu Dec 10 09:58:54.402679 2020] [mpm_prefork:notice] [pid 1] AH00163: Apache/2.4.10 (Debian) PHP/5.4.45 configured -- resuming normal operations [Thu Dec 10 09:58:54.402792 2020] [core:notice] [pid 1] AH00094: Command line: 'apache2 -D FOREGROUND'「ドメイン名設定されてないよぉー困るよぉー
」という内容です。
ご親切に「ServerNameディレクティブを設定しろ」と解決策まで書いてくれていますね。多分設定しなくても問題ないんですが、エラーが残っているのが気持ち悪いので設定してあげます。
(私はCentOSばっかりいじってたので、DebianのApacheの設定ファイルとかどこ〜〜〜〜ってなりました。)
まずは、dockerにログイン。
$ docker exec -it recursing_hodgkin /bin/bashvimが慣れているので一応インストール。
apt updateしないとvimがインストールできなかったのでやむなくしてます。
Dockerfileに最初から書いとけばよかったと思いつつ……コンテナ内# apt update # apt -y upgrade # apt install -y vim # vim /etc/apache2/conf-enabled/httpd.conf/etc/apache2/conf-enabled/*.confをconfigファイルとして読み込んでいるようなので、この中に記述していきます。
httpd.confServerName localhost:80Apacheサービス再起動。
# /etc/init.d/apache2 reload [ ok ] Reloading web server: apache2.CentOSいじってると
systemctl restart httpd
で再起動なので、service apache2 restart
で再起動したくなるんですが、これを実行したらコンテナも一緒にお亡くなりになられたので、上記コマンドを叩きます。7.2. マルチバイト文字使えないんだが
モジュール入れてないやろ。
どこからかそんな声が聞こえてきました。
モジュールを入れて、
# docker-php-ext-install mbstringiniに追記し有効化します。
php.iniextension=mbstring.so恒例のapache再起。
# /etc/init.d/apache2 reload終わりに
私もDockerに明るいわけではないので、備忘録的に残しました。
phpのエラーログとか出すようにしたり、おまけに書いた部分をDockerfileに記述したり等、実際に開発始める上で躓いたところがあったので、そこらへんもあとで記事にしておきたいと思います。
- 投稿日:2020-12-16T23:05:10+09:00
gitのバージョンアップ
はじめに
gitちゃんと勉強して使えるようになろう!
と思ってバージョン確認してみたら古かった。で,バージョンアップしようとしたけど手こずったのでメモします。でもちゃんと自分で解決できた!嬉しい!
ちなみにMacです。そもそもよく理解してないままQiitaとかの記事見てそのままコピペするからいけないんだよね。。
で,本題
まずはバージョン確認
$ git --version git version 2.20.1 (Apple Git-117)今2.29.2とかなんで古いですね。
$ brew updateこれはこのまま戻ってこなくなった。よくわかってないです。
あんまり待っても返ってこないから ctrl+C しました。$ brew install git Updating Homebrew... ...ここから下つらつらつらーっと続きます。
どうやら上の2行だけでできるらしいんですが。$ git --version git version 2.20.1 (Apple Git-117)変わってないじゃん!!!
で,よくわかってないからインストールできてないのかなってまた同じことしたりしてました。。$ which git /usr/local/bin/gitよくわからないままパスがなんちゃらって読んで,確認して,わからん!!ってなり。
Summaryにどこにインストールされたかが書いてあることを知り,遡って探して…
(無駄にいじったんで探すの大変でした笑)インストール文の途中,
==> Summary ? /usr/local/Cellar/git/2.29.2: 1,480 files, 39.2MB見つけた!
そこだけコピペして,ちょっと付け足して,$ /usr/local/Cellar/git/2.29.2/bin/git --version git version 2.29.2できてたーー!
で,多分このデフォルトになってるApple Gitじゃなくこれにパス指定した方がいいんだよね?ってことで
$ echo 'export PATH="/usr/local/Cellar/git/2.29.2/bin:$PATH"' >> ~/.zshrc $ source ~/.zshrc$ git --version git version 2.29.2終わりに
一応,インストールは初めにできてたんだけど,確認ができなくて手こずった,って話でした。
簡単に言うと場所が違ったってことですね。
ひとつ成長!
- 投稿日:2020-12-16T22:19:51+09:00
Homebrew >=2.6.1 で brew update に失敗したメモ(GitHub からの shallow clone 禁止)
環境
- macOS Catalina 10.15.7
- Homebrew 2.6.2
何が起きたか
brew update
しようとしたら以下のエラーが出ました。% brew upgrade Error: homebrew-core is a shallow clone. To `brew update` first run: git -C "/usr/local/Homebrew/Library/Taps/homebrew/homebrew-core" fetch --unshallow This restriction has been made on GitHub's request because updating shallow clones is an extremely expensive operation due to the tree layout and traffic of Homebrew/homebrew-core. We don't do this for you automatically to avoid repeatedly performing an expensive unshallow operation in CI systems (which should instead be fixed to not use shallow clones). Sorry for the inconvenience!原因と解消方法
GitHub から Homebrew に shallow clone を控えるように リクエストがあったようです。
そのため、full clone する設定が必要なように Homebrew が対応しました。Also, as mentioned in Homebrew/brew#9383, this change was made due to a direct request from GitHub to reduce our shallow clone usage.
https://github.com/Homebrew/discussions/discussions/226#discussioncomment-147710
エラーメッセージに書かれている通りに、以下のコマンドを実行。
自分の場合、homebrew-core
を解決した後にhomebrew-cask
でも同じことで怒られたのでそちらも対応しました。# homebrew-core git -C "/usr/local/Homebrew/Library/Taps/homebrew/homebrew-core" fetch --unshallow # homebrew-cask git -C "/usr/local/Homebrew/Library/Taps/homebrew/homebrew-cask" fetch --unshallow参考リンク
この事象についてのディスカッション
https://github.com/Homebrew/discussions/discussions/226
この対応が入った PR
https://github.com/Homebrew/brew/pull/9383
- 投稿日:2020-12-16T18:40:19+09:00
RubyでGoogleの問題を解く
Googleの問題を解く
問題
「e(自然対数の底)の値で連続する10桁の数のうち、最初の素数」を求める。
- 素数判定
回答
def getNums() line = readlines len = line.length num = '' (0..len-1).each do |i| num = num + line[i].chomp end return num end def prime?(num) (2..Math.sqrt(num).to_i).each do |i| if(num%i == 0) return false end end return true end digits = 10 if $PROGRAM_NAME == __FILE__ num = getNums().delete('.') res = 0 (0..num.length-digits).each do |i| res = num[i, digits].to_i prime?(res) ? break : next end puts "e(自然対数の底)の値で連続する10桁の数のうち, 最初の素数は#{res}" end解説
- 問題が、外部ファイルに記述された e の数字を入力としていたので
getNums()
で複数行の入力を結合するようになっています。が、まぁそこは気にせずに、数値の標準入力を受け取ります。prime? の実装
require 'prime'
によってPrime.prime?(n)
が利用でき、高速に素数判定できますが面白く無いので今回は利用しません。自力でprime?
を実装します。def prime?(num) (2..Math.sqrt(num).to_i).each do |i| if(num%i == 0) return false end end return true end短っ!いや、もっと高速にするなら 偶数は弾く とかもあるけど、とりあえずこれでいいや。
- 理論的には、自分より低い数字で割り切れるかを見て、
true
orfalse
を出力しているだけ。(2..Math.sqrt(num).to_i).each do |i|
(2..Math.sqrt(num).to_i).each do |i|
ここが重要な部分です。(2..num).each do |i|
とするのが理論的ですが、これだと桁が多いときに処理が終わりません。いや、終わるけど時間がかかりすぎます。Math.sqrt(num).to_i までの演算でいい理由
合成数(素数とは逆の意味) に関する性質$x$ が合成数ならば $\sqrt{x}$ 以下の約数を持つ
を利用しています。ですので、num
が合成数(=素数でない)なら(2..Math.sqrt(num).to_i).each do |i| if(num%i == 0) return false end endここで引っかかって
false
を返します。逆に、ここをすり抜けたnum
は合成数でない(=素数)ので、true
を返します。実行結果
- テキストファイルに e の値を記述します。
2.71828182845904523536028747135266249775 7247093699959574966967627724076630353547 5945713821785251664274274663919320030599 2181741359662904357290033429526059563073 81323286279434907632338298807531952510190これをプログラムに渡してあげます。
$ ruby google_recruit.rb < in.txt e(自然対数の底)の値で連続する10桁の数のうち, 最初の素数は7427466391答えは
7427466391
である!
- source ~/Library/Mobile Documents/com~apple~CloudDocs/KG/class/M1/multi_scale_sim/grad_members_20f/members/ryomichi56/./qiita/google_recruit.org
- 投稿日:2020-12-16T18:26:49+09:00
Rubyでローマ数字を求める
ローマ数字(roman numerals)
アラビア数字を入力としてローマ数字を返すメソッドを作成する。
回答(リファクタリング前)
無駄が多いし長くて見ない方がいいレベルなので折り畳んでます。
def getNums() lines = readlines len = lines.length (0..len-1).each do |i| lines[i] = lines[i].chomp.to_i end return lines end class Integer def to_roman sym = ['I', 'V', 'X', 'L', 'C', 'D', 'M'] roman = '' to_arr(4).each_with_index do |num, i| case i when 0 then roman += sym[6] * num when 1 then case num when 0..3 then roman += sym[4] * num when 4 then roman += sym[4] + sym[5] when 5..8 then roman += sym[5] + sym[4] * (num-5) when 9 then roman += sym[4] + sym[6] end when 2 then case num when 0..3 then roman += sym[2] * num when 4 then roman += sym[2] + sym[3] when 5..8 then roman += sym[3] + sym[2] * (num-5) when 9 then roman += sym[2] + sym[4] end when 3 then case num when 0..3 then roman += sym[0] * num when 4 then roman += sym[0] + sym[1] when 5..8 then roman += sym[1] + sym[0] * (num-5) when 9 then roman += sym[0] + sym[2] end end end roman end def to_arr(n) arr = [] (Math.log10(self).to_i + 1).upto(n-1) do arr.unshift(0) end arr + digits.reverse end end if $PROGRAM_NAME == __FILE__ getNums().each do |i| puts i.to_roman end end回答(リファクタリング後)
def getNums() lines = readlines (0..lines.length-1).each do |i| lines[i] = lines[i].chomp.to_i end lines end class Integer def to_roman sym = ['I', 'V', 'X', 'L', 'C', 'D', 'M'] roman = '' base = sym.length-1 to_arr(4).each_with_index do |num, i| case num when 0..3 then roman += sym[base-i*2] * num when 4 then roman += sym[base-i*2] + sym[base-i*2+1] when 5..8 then roman += sym[base-i*2+1] + sym[base-i*2] * (num-5) when 9 then roman += sym[base-i*2] + sym[base-(i-1)*2] end end roman end def to_arr(n) arr = Array.new(n - Math.log10(self).to_i - 1, 0) arr + digits.reverse end end if $PROGRAM_NAME == __FILE__ getNums().each do |i| # puts "#{i} => #{i.to_roman}" printf("%4d => %s\n", i, i.to_roman) end end解説
アラビア数字の入力受け取り
def getNums() lines = readlines (0..lines.length-1).each do |i| lines[i] = lines[i].chomp.to_i end lines endここは標準入力から入力を受け取る部分です。
- 複数行の入力を対象としているので、改行区切りで入力できます。
- 改行コードを取り除いた文字列から Integer にキャストして、lines に配列として格納していきます。
実行部分
if $PROGRAM_NAME == __FILE__ getNums().each do |i| # puts "#{i} => #{i.to_roman}" printf("%4d => %s\n", i, i.to_roman) end endここはプログラムを
$ ruby roman_numerals.rb
等で実行した場合に実行される部分です。
- 先程の
getNums()
で入力を受け取り、その返りオブジェクト(配列) に対して標準出力します。- この後の解説で記述しますが、Integerクラスにオーバーライドしているので、
(Integer).to_roman
で文字列としてローマ数字が取得できます。ローマ数字を返すメソッド
class Integer def to_roman sym = ['I', 'V', 'X', 'L', 'C', 'D', 'M'] roman = '' base = sym.length-1 to_arr(4).each_with_index do |num, i| case num when 0..3 then roman += sym[base-i*2] * num when 4 then roman += sym[base-i*2] + sym[base-i*2+1] when 5..8 then roman += sym[base-i*2+1] + sym[base-i*2] * (num-5) when 9 then roman += sym[base-i*2] + sym[base-(i-1)*2] end end roman end def to_arr(n) arr = Array.new(n - Math.log10(self).to_i - 1, 0) arr + digits.reverse end endここが今回の実装部分になります。
- Integer クラスにオーバーライドするような実装にしています。
4要素の配列へ(to_arr(n))
- ローマ数字は 1〜3999 を表現できます。
to_arr(n)
- 入力されたアラビア数字を各桁で分けて配列化するメソッドです。
n
は最大桁数を意味し、その桁より少ない数字に対しては 0 埋めされます。- 例
n = 8 n.to_arr(4) # [0, 0, 0, 8]ローマ数字へ
- ローマ数字の各シンボルに関しては Wikipedia 等を参照してください。
- 組み立てるローマ数字は文字列の変数
roman
に格納していきます。
to_arr(4).each_with_index
self
は省略可能なので省略して記述しています。to_arr(4)
で 4 要素の配列に変換してから、それぞれの桁に対して処理をおこないます。case
文によって場合分けします。 ローマ数字で重要なのは 4 と 9 です。
- それぞれの数字に対しての処理は上記 Wikipedia のローマ数字の概念と配列
sym = ['I', 'V', 'X', 'L', 'C', 'D', 'M']
を照らし合わせれば理解できます。- 最後に出来上がったローマ数字
roman
を出力します。- 例
n = 8 n.to_roman # "VIII" n = 1999 n.to_roman # "MCMXCIX"実行結果
まず入力として以下のテキストファイル(in.txt)を用意します。
1 2 4 5 6 9 10 11 14 15 19 38 42 49 51 97 99 439 483 499 732 961 999 1999これを入力として与えた時の実行結果が以下。
$ ruby roman_numerals.rb < in.text 1 => I 2 => II 4 => IV 5 => V 6 => VI 9 => IX 10 => X 11 => XI 14 => XIV 15 => XV 19 => XIX 38 => XXXVIII 42 => XLII 49 => XLIX 51 => LI 97 => XCVII 99 => XCIX 439 => CDXXXIX 483 => CDLXXXIII 499 => CDXCIX 732 => DCCXXXII 961 => CMLXI 999 => CMXCIX 1999 => MCMXCIX動いた!!!!!
- source ~/Library/Mobile Documents/com~apple~CloudDocs/KG/class/M1/multi_scale_sim/grad_members_20f/members/ryomichi56/./qiita/roman_numerals.org
- 投稿日:2020-12-16T16:44:31+09:00
M1 Macが届いたので触ってみた
PONOS Advent Calendar 2020 の16日目の記事です。
昨日は@lovericeさんの Stateパターンを使ってみる でした。はじめに
流行りのM1搭載MacBook Airを購入しました。?
メモリを増やしたりUSキーボードにしたら出荷が遅くなって、届いたのはつい数日前です。ここまで試したり設定したことを書いておきます。
所感
予想よりも遥かにRosetta2が優秀です。
全然違和感なく使えてて凄い。インストール済みのアプリだと、GitHub DesktopやDiscordあたりがIntel版バイナリだったんですが、今調べるまで気づかなかったくらいです。
特に、Discordはカメラとかマイクのハードウェアを使うのに、普通に使えてるの凄い。CPUアーキテクチャ周りのTips
アプリごとのアーキテクチャ切り替え
アプリケーション情報で「種類」欄を見れば、どのタイプか分かります。
「Universal」は、Intel版もArm版も両方のバイナリを同梱しています。(スクショでかいな・・・
)
「Rosettaを使用して開く」にチェックを入れると、Intel版として動きます。
Intel版しかないアプリについては、このチェックボックスは出てきません。(暗黙的にRosettaを使用する。)アプリがどのアーキテクチャに対応しているか調べる
lipo
コマンドで、アプリ内にどのアーキテクチャ用のバイナリが含まれているかを調べることができます。
参考: ユニバーサルバイナリ再登板ということは「lipo」の出番かも$ lipo -info /usr/local/bin/fish Architectures in the fat file: /usr/local/bin/fish are: x86_64 arm64 $ lipo -info /usr/bin/vim Architectures in the fat file: /usr/bin/vim are: x86_64 arm64e $ lipo -info /Applications/GitHub\ Desktop.app/Contents/MacOS/GitHub\ Desktop Non-fat file: /Applications/GitHub Desktop.app/Contents/MacOS/GitHub Desktop is architecture: x86_64上の例だと、GitHub DesktopはIntel版しか入ってないみたいですね。
シェルが動いているアーキテクチャを調べる
uname -m
もしくは'arch'をオプション無しで叩くことで調べられます。# Rosetta2(Intel)で動いているとき $ uname -m x86_64 $ arch i386 # ネイティブ(ARM)で動いているとき $ uname -m arm64 $ arch arm64アーキテクチャを切り替えて実行
archコマンドで、アーキテクチャを指定して実行できます。
$ arch -x86_64 bash
man arch
を見てみると、指定できるのはIntel系のアーキテクチャだけみたいです。The arch_name argument must be one of the currently supported architectures:
i386 32-bit intel
x86_64 64-bit intel
x86_64h 64-bit intel (haswell)ので、ネイティブで実行しているシェルから、Intel版バイナリを使いたいときに使用できます。(逆は駄目。)
fish
ログインシェルはfishを使っています。
fish自体もM1 Mac対応していて、特に違和感なく使えています。プロンプトにアーキテクチャを表示
当面の間はアーキテクチャを切り替え・意識して使うことが多そうなので、プロンプトに表示するようにしました。
honeniq/shellder/fish_prompt.fish
function prompt_arch -d "Display current CPU architecture." switch (uname -m) case arm64 prompt_segment white cyan "arm" case x86_64 prompt_segment cyan white "x64" end endfishのテーマをちょっといじって、「arm」とか「x64」と表示するようにしました。
かわいい。?Homebrew
パッケージマネージャとしてHomebrewを使っています。
公式サイトによると、バージョン2.6.0からM1 Mac対応も始まっているようです。macOS Homebrew running natively on M1/Apple Silicon/ARM has partial functionality. We recommend installing into /opt/homebrew and forbid installing into /usr/local (to avoid clashing with the macOS Intel install and allow their usage side-by-side). We currently recommend running Homebrew using Intel emulation with Rosetta 2.
とはいえ、まだIntel版をRosetta2経由で使うことを推奨 との事。
ARM版を使う場合は、Intel版とかち合わないよう、Homebrewで管理するパッケージは /opt/homebrew に入れるのが推奨です。
(デフォルト設定だと、推奨通り /opt/homebrew にインストールされます。)Intel版を使うように強制
推奨通り、当面はIntel版だけを使うことにしました。
シェルがARMで動いているときもIntel版を使えるように、fish functionでbrew
コマンドをラップしてみました。honeniq/dotfiles/.config/fish/functions/brew.fish
## wrap 'brew' command on M1 Mac function brew if test (uname -s) = "Darwin" and test (uname -m) = "arm64" command arch -x86_64 brew $argv else command brew $argv end end問題なく動いてそう。
しばらくこの形で使ってみます。
明日は @nisei275 さんです!
- 投稿日:2020-12-16T15:59:44+09:00
Class '~~~' has no 'objects' memberpylint(no-member)のエラー/警告について(@Python/Django)
はじめに
今回は、Djangoでアプリ作成する際に発生したエラー・警告について触れていきます。
参考記事はこちら
エラー詳細
Djangoのクラスであるmodelsのオブジェクトを参照する際にエラー検知されてしまいました。。
実行した処理
①pylint-djangoをインストール
ターミナルを開き以下のコマンドを実行します。$ pip install pylint-django②VSCodeの設定変更
VSCodeを利用しているため設定に変更を加えていきます。
画面左下の歯車マークから設定を開き(command+,)、
Python › Linting: Pylint Argsの箇所に以下の項目を追加します。
--load-plugins=pylint_django
以上で完了しました。
まとめ
エラーや警告の内容を深掘ると興味深いですが、
気付いたら1日経ってたりします。。
頑張っていきます!!?参考にさせていただいた記事の作成者様ありがとうございました。
- 投稿日:2020-12-16T13:34:01+09:00
特定のパッケージを使用しているローカルリポジトリを探す
はじめに
この記事は、grepコマンドによる依存パッケージの調査方法についてのメモです。
GitHubのDependabotなど、依存パッケージの脆弱性警告ツールが普及しました。しかしその警告に従い、複数のリポジトリをまたいで依存パッケージを調査するのは骨の折れる作業です。
こうした状況で便利なコマンドがgrepです。grepは多くの環境に移植されていますので、使い方を一度憶えてしまえば役立つ資産となります。
grep
grepは正規表現によりファイルを検索するUNIXコマンドです。
このコマンドを利用すれば、ファイルを横断した本文検索ができます。
使用例
% grep -lr <pattern> --include="package.json" --exclude-dir=node_modules ./*このコマンドの内容を書き下すと、以下のようになります。
カレントディレクトリ
./*
以下で、ファイル名package.json
の<pattern>
を含む行を探す。ただしディレクトリnode_modules
は除外する。使用しているオプションは以下の通りです。
-r
: ディレクトリを再帰処理(デフォルトではディレクトリ直下のファイルを検索する)-l
: ファイル名のみを表示(デフォルトでは該当する行も同時に表示する)他にも検索パターンやオプションを変更すれば、grepは様々な問題の解決に役立ちます。皆様の問題に合わせてオプションを変更してみてください。
以上、ありがとうございました。
- 投稿日:2020-12-16T06:13:16+09:00
AndroidエミュレータのFlutterアプリ内でネットワーク接続ができない
パーミッションとDNS
環境
macOS Big Sur バージョン11.0.1
Android Studio 4.0.1
Android Emulator 30.0.12エラー
socketexception: failed host lookup: 'hoge.com' (os error: no address associated with hostname, errno = 7)解決方法
アプリのパーミッション設定
android/app/src/main/AndroidManifest.xml
<manifest>下に以下を追加AndroidManifest.xml<uses-permission android:name="android.permission.INTERNET"/>これでもエラーが変わらなければ↓
macのDNS設定
システム環境設定>ネットワーク>Wi-Fi>詳細...>DNS
DNSサーバに8.8.8.8を追加
参考
- 投稿日:2020-12-16T00:55:13+09:00
macでbioawkを使用する
背景
bioawkはawkによる表形式ファイルのデータ処理をfastqやsam、gtfなどバイオデータのファイル形式に拡張したものです。-cオプションでファイル形式を指定することでそのファイル形式に対応した変数を使用することができます。
方法
Homebrewでインストールできます。
brew tap brewsci/bio; brew install bioawk結果
helpが出ることを確認します。bioawkが対応する入力ファイル形式と各フィールド(列)の変数が表示されます。awkでフィールドは「$数字」ですがbioawkではこの変数を用いて処理を行うことができます。
bioawk -c help bed: 1:chrom 2:start 3:end 4:name 5:score 6:strand 7:thickstart 8:thickend 9:rgb 10:blockcount 11:blocksizes 12:blockstarts sam: 1:qname 2:flag 3:rname 4:pos 5:mapq 6:cigar 7:rnext 8:pnext 9:tlen 10:seq 11:qual vcf: 1:chrom 2:pos 3:id 4:ref 5:alt 6:qual 7:filter 8:info gff: 1:seqname 2:source 3:feature 4:start 5:end 6:score 7:filter 8:strand 9:group 10:attribute fastx: 1:name 2:seq 3:qual 4:comment使用例
fastqファイルをfasta形式に変換します。
※ファイル及びコードはVince Buffalo著、片山俊明『バイオインフォマティクスデータスキル』(オライリー・ジャパン、ISBN978-4-87311-863-5、177頁)より。#ファイルのダウンロード(下記で使用するfastqファイル以外も含まれます) git clone https://github.com/vsbuffalo/bds-files.git #fastqファイル cat contam.fastq | head -n 8 @DJB775P1:248:D0MDGACXX:7:1202:12362:49613 TGCTTACTCTGCGTTGATACCACTGCTTAGATCGGAAGAGCACACGTCTGAA + JJJJJIIJJJJJJHIHHHGHFFFFFFCEEEEEDBD?DDDDDDBDDDABDDCA @DJB775P1:248:D0MDGACXX:7:1202:12782:49716 CTCTGCGTTGATACCACTGCTTACTCTGCGTTGATACCACTGCTTAGATCGG + IIIIIIIIIIIIIIIHHHHHHFFFFFFEECCCCBCECCCCCCCCCCCCCCCC #fastaファイルへ変換(#nameでヘッダー情報、$seqで配列情報を取得しています) bioawk -c fastx '{print ">"$name"\n"$seq}' contam.fastq | head -n 4 >DJB775P1:248:D0MDGACXX:7:1202:12362:49613 TGCTTACTCTGCGTTGATACCACTGCTTAGATCGGAAGAGCACACGTCTGAA >DJB775P1:248:D0MDGACXX:7:1202:12782:49716 CTCTGCGTTGATACCACTGCTTACTCTGCGTTGATACCACTGCTTAGATCGG
- 投稿日:2020-12-16T00:26:41+09:00
Pycharmでバックスラッシュを入力する方法【Mac】
- 投稿日:2020-12-16T00:07:22+09:00
macでいきなりはじめるPHPにチャレンジする!(1) MAMP導入編
初めまして!
僕は某プログラミングスクールの夜間・休日コースで半年間勉強をしていました。
某プログラミングスクールでは、rubyおよび、rubyonrailsを中心に学習してきたので、次の一歩として、web開発に用いることができるPHPを学ぼうと思い、それにあたって学んだことをまずは記事にしたいと思います!特に同じような学習の進め方をする人に少しでも参考になれば幸いです。
なお、初学者であり知識の偏りもあるので、理解が不足している部分があるかと思います。もし何かありましたら教えていただけると幸いです。僕はPHPを学ぶにあたって、タイトルにある「いきなりはじめるPHP: ワクワク・ドキドキの入門教室」を購入しました。少し古い本ではありますが、とても理解しやすく、また実際に動かしながら作ることができるのと、説明が簡潔ながらまとまっていて、とても読みやすい本でした。初学者でまだまだ理解できていないことが多い僕でもスラスラと読みながら1つのアプリを開発できました。
・・・しかし、この本は古いのはともかく、あくまでもwindowsでの開発方法が中心で、macのことはほとんど触れられていません、そこでmacで進めるにあたって苦労したこと、別で調べたことなどをまとめていきたいと思います。
今回はMAMPの導入についてです。MAMPとは「Mac Apache MySQL PHP」の略で、Mac向けに作られたmysqlとPHPの開発環境ツールです。
本ではXAMPPを導入すると書いていますが、XAMPPはMacとの相性が悪く、エラーが出やすいとのことであり、mac用は存在しますが避けた方がいいとのことです。僕はXAMPPを導入してからその事実を知り、やり直すことになりました・・・このMAMPを導入することで、PHPを導入できるということはもちろん、仮想のサーバーを立てて、ローカル環境での開発、動作確認ができます。railsの場合は「rails s」コマンドで出来たのは・・・と思ったんですが、これはrailsにセットで入っているPumaというやつが頑張ってくれているようです。知らないうちに便利なものを享受しているものだと改めて思いました。今回もMAMPという便利なものに頼らせてもらいましょう。
それではMAMPの導入です。まずはMAMPのダウンロードページにアクセスしましょう。
https://www.mamp.info/en/downloads/
このような画像の画面になるので、macユーザーの方は迷うことなくmacOS用を選びましょう。ちなみにOSのアップデートがされていないと動作保証はされないようなので注意です。ダウンロードし、開くとおなじみインストーラーが表示されます。
日本語化されているので、迷わず進められそうです、続けるを押して、どんどん進めるとインストールされます。
無事インストールし起動するとこんな画面になります、ちなみに起動するとpro版をかなり勧められますが、僕はあくまでも初学者なのでとりあえずスルーしました、pro版との違いはこちらのサイトに比較が書かれていました。バージョンが少し古いので変更あるかもしれませんが、参考になりそうです。
https://webrandum.net/mamp-mamp-pro/
startボタンを押すとローカルサーバーが起動します。画像のような案内画面が表示されますね。XAMPPだとMySQLの起動は別なのですが、MAMPの場合は同時に起動されるようです。この辺りがまた学習、開発を進めていく上で大きな違いを産んでいきそうな予感がしますね。
左上の「preferences」をクリックすると設定画面に移ります。案内ページをoffにする設定などもありますが、注目したのはPortsの設定です、デフォルトだと画像のようになっています。
このままだとlocalhostへのアクセスがhttp://localhost:8888となります。そこで80&3306ボタンをクリックするとhttp://localhostになります。mysqlのポートも3306になります。ただしskypeなどを利用している場合、80のポート争いが起きてサーバーが起動できないこともあるそうです。僕は現状80&3306でうまく動作していますが、うまく行かない場合は他のアプリの見直しや、ポートの変更も必要になりそうです。MAMPの導入は以上です。次回はPHPを実際に動かすまでを書いてみたいと思います。何か意見などありましたらコメントお願いします。