20201216のMacに関する記事は12件です。

DockerでMacに超絶シンプルなPHP&Apache環境を整える

はじめに

PHP案件を頂いたため、MAMPでやるかぁーと思ったのですが、ふと、「MAMPの必要あるか…?:thinking:」となりました。

というのも、今回は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つ。

  1. HomebrewでPHPバージョンを切り替えて開発する
  2. MAMPをちょっといじってPHPバージョンを切り替えて開発する
  3. 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をダウンロードします。

スクリーンショット 2020-12-10 17.40.49.png

Docker.dmgを実行し、インストールします。

インストール完了したら実行します。
実行後、パスワードを求められることがありますが、適宜入力してください。

実行すると上のメニューバーの右側にクジラさんが現れます。(ちっちゃくてすみません)↓
スクリーンショット 2020-12-10 17.47.05.png

試しにターミナルでコマンドを打ってみて確認します。

$ 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:        fec3683

2. Dockerfileを作成してビルドする

2.1. Dockerfileの作成

Dockerfileを書いてイメージを作成します。

適当なディレクトリを作成し、Dockerfileを作成します。

$ mkdir php5_apache

$ cd php5_apache

$ vim Dockerfile

公式のDockerイメージを拝借しちゃいましょう。
php:<version>-apacheと記述することで、Apacheも含んだコンテナを建てられます。
今回使用するバージョンは5.4ですのでその通り記述します。

Dockerfile
FROM php:5.4-apache

2.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のダッシュボードからも確認することができます。
スクリーンショット 2020-12-10 18.31.52.png

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_hodgkin

4. ブラウザで確認

80番ポートで開いたのでポート指定なしでlocalhostをブラウザのアドレスバーに入力し開きます。
無事にPHP等が出力されていればOKです。

5. コンテナの開始と停止

コンテナを一度作成してしまえば、docker start <コンテナIDまたはコンテナ名>で起動、docker stop <コンテナIDまたはコンテナ名>で停止できます。

今回はコンテナ名でやってみます。
recursing_hodgkinと名付けられていましたので、それで停止、開始してみます。

$ docker stop recursing_hodgkin
$ docker start recursing_hodgkin

6. コンテナにログインする

以下でrootでログインできます。
ちなみにOSはDebianです。

$ docker exec -it recursing_hodgkin /bin/bash

出るときはおなじみのexit

# exit

7. おまけ

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'

「ドメイン名設定されてないよぉー困るよぉー:disappointed_relieved:」という内容です。
ご親切に「ServerNameディレクティブを設定しろ」と解決策まで書いてくれていますね。

多分設定しなくても問題ないんですが、エラーが残っているのが気持ち悪いので設定してあげます。

(私はCentOSばっかりいじってたので、DebianのApacheの設定ファイルとかどこ〜〜〜〜ってなりました。)

まずは、dockerにログイン。

$ docker exec -it recursing_hodgkin /bin/bash

vimが慣れているので一応インストール。
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.conf
ServerName localhost:80

Apacheサービス再起動。

# /etc/init.d/apache2 reload
[ ok ] Reloading web server: apache2.

CentOSいじってるとsystemctl restart httpdで再起動なので、service apache2 restartで再起動したくなるんですが、これを実行したらコンテナも一緒にお亡くなりになられたので、上記コマンドを叩きます。

7.2. マルチバイト文字使えないんだが

モジュール入れてないやろ。

どこからかそんな声が聞こえてきました。

モジュールを入れて、

# docker-php-ext-install mbstring

iniに追記し有効化します。

php.ini
extension=mbstring.so

恒例のapache再起。

# /etc/init.d/apache2 reload

終わりに

私もDockerに明るいわけではないので、備忘録的に残しました。

phpのエラーログとか出すようにしたり、おまけに書いた部分をDockerfileに記述したり等、実際に開発始める上で躓いたところがあったので、そこらへんもあとで記事にしておきたいと思います。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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

終わりに

一応,インストールは初めにできてたんだけど,確認ができなくて手こずった,って話でした。
簡単に言うと場所が違ったってことですね。
ひとつ成長!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

RubyでGoogleの問題を解く

Mac OS-11.1 ruby-2.6.6p146

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 or false を出力しているだけ。

(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
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Rubyでローマ数字を求める

Mac OS-11.1 ruby-2.6.6p146

ローマ数字(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
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

M1 Macが届いたので触ってみた

PONOS Advent Calendar 2020 の16日目の記事です。
昨日は@lovericeさんの Stateパターンを使ってみる でした。

はじめに

流行りのM1搭載MacBook Airを購入しました。?
メモリを増やしたりUSキーボードにしたら出荷が遅くなって、届いたのはつい数日前です。

ここまで試したり設定したことを書いておきます。

所感

予想よりも遥かにRosetta2が優秀です。
全然違和感なく使えてて凄い。

インストール済みのアプリだと、GitHub DesktopやDiscordあたりがIntel版バイナリだったんですが、今調べるまで気づかなかったくらいです。
特に、Discordはカメラとかマイクのハードウェアを使うのに、普通に使えてるの凄い。

CPUアーキテクチャ周りのTips

アプリごとのアーキテクチャ切り替え

アプリケーション情報で「種類」欄を見れば、どのタイプか分かります。
「Universal」は、Intel版もArm版も両方のバイナリを同梱しています。

image.png

(スクショでかいな・・・:sweat_smile:)
「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
end

fishのテーマをちょっといじって、「arm」とか「x64」と表示するようにしました。
image.png
かわいい。?

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 さんです!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Class '~~~' has no 'objects' memberpylint(no-member)のエラー/警告について(@Python/Django)

はじめに

今回は、Djangoでアプリ作成する際に発生したエラー・警告について触れていきます。

参考記事はこちら

エラー詳細

Djangoのクラスであるmodelsのオブジェクトを参照する際にエラー検知されてしまいました。。

スクリーンショット 2020-12-16 15.13.22.png

実行した処理

①pylint-djangoをインストール
ターミナルを開き以下のコマンドを実行します。

$ pip install pylint-django

②VSCodeの設定変更

VSCodeを利用しているため設定に変更を加えていきます。

画面左下の歯車マークから設定を開き(command+,)、
Python › Linting: Pylint Argsの箇所に以下の項目を追加します。

--load-plugins=pylint_django

以上で完了しました。

まとめ

エラーや警告の内容を深掘ると興味深いですが、
気付いたら1日経ってたりします。。
頑張っていきます!!?

参考にさせていただいた記事の作成者様ありがとうございました。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

特定のパッケージを使用しているローカルリポジトリを探す

はじめに

この記事は、grepコマンドによる依存パッケージの調査方法についてのメモです。

GitHubのDependabotなど、依存パッケージの脆弱性警告ツールが普及しました。しかしその警告に従い、複数のリポジトリをまたいで依存パッケージを調査するのは骨の折れる作業です。

こうした状況で便利なコマンドがgrepです。grepは多くの環境に移植されていますので、使い方を一度憶えてしまえば役立つ資産となります。

grep

grepは正規表現によりファイルを検索するUNIXコマンドです。

man page of grep

このコマンドを利用すれば、ファイルを横断した本文検索ができます。

使用例

% grep -lr <pattern> --include="package.json" --exclude-dir=node_modules ./*

このコマンドの内容を書き下すと、以下のようになります。

カレントディレクトリ./*以下で、ファイル名package.json<pattern>を含む行を探す。ただしディレクトリnode_modulesは除外する。

使用しているオプションは以下の通りです。

  • -r : ディレクトリを再帰処理(デフォルトではディレクトリ直下のファイルを検索する)
  • -l : ファイル名のみを表示(デフォルトでは該当する行も同時に表示する)

他にも検索パターンやオプションを変更すれば、grepは様々な問題の解決に役立ちます。皆様の問題に合わせてオプションを変更してみてください。

以上、ありがとうございました。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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-16 5.51.47.png

参考

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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

root_cb6ba2bbd7c6___Users_tt.png

使用例

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
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Pycharmでバックスラッシュを入力する方法【Mac】

はじめに

最近Pycharmを使い始めたのはいいもののバックスラッシュの入力ができずに困ったので解決法を載せておきます。

症状

  • Pycharmでバックスラッシュ(\)の入力ができない
  • Pycharm以外だと問題なく入力できる

解決法

USキーボードとJISキーボードの違いが原因のようです。
環境設定→キーボード→入力ソースにUSを追加。終わり!

念のため画像で手順を残しておくのでよくわからない人は参考にしてください。
Screen Shot 2020-12-16 at 0.06.34.png
Screen Shot 2020-12-16 at 0.08.43.png
Screen Shot 2020-12-16 at 0.12.08.png
Screen Shot 2020-12-16 at 0.12.30.png
Screen Shot 2020-12-16 at 0.13.35.png

これでoption + ¥をすればバックスラッシュを入力できます。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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/
PHP8.png
このような画像の画面になるので、macユーザーの方は迷うことなくmacOS用を選びましょう。ちなみにOSのアップデートがされていないと動作保証はされないようなので注意です。

ダウンロードし、開くとおなじみインストーラーが表示されます。
PHP9.png
日本語化されているので、迷わず進められそうです、続けるを押して、どんどん進めるとインストールされます。

PHP10.png
無事インストールし起動するとこんな画面になります、ちなみに起動するとpro版をかなり勧められますが、僕はあくまでも初学者なのでとりあえずスルーしました、pro版との違いはこちらのサイトに比較が書かれていました。バージョンが少し古いので変更あるかもしれませんが、参考になりそうです。
https://webrandum.net/mamp-mamp-pro/

PHP13.png
startボタンを押すとローカルサーバーが起動します。画像のような案内画面が表示されますね。XAMPPだとMySQLの起動は別なのですが、MAMPの場合は同時に起動されるようです。この辺りがまた学習、開発を進めていく上で大きな違いを産んでいきそうな予感がしますね。

PHP11.png
左上の「preferences」をクリックすると設定画面に移ります。案内ページをoffにする設定などもありますが、注目したのはPortsの設定です、デフォルトだと画像のようになっています。
このままだとlocalhostへのアクセスがhttp://localhost:8888となります。そこで80&3306ボタンをクリックするとhttp://localhostになります。mysqlのポートも3306になります。ただしskypeなどを利用している場合、80のポート争いが起きてサーバーが起動できないこともあるそうです。僕は現状80&3306でうまく動作していますが、うまく行かない場合は他のアプリの見直しや、ポートの変更も必要になりそうです。

MAMPの導入は以上です。次回はPHPを実際に動かすまでを書いてみたいと思います。何か意見などありましたらコメントお願いします。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む