IT技術に関する情報掲載サイト

プログラミングに関することを掲載します。

脆弱性報告: xz Utilityの影響と対策

xz Utilityで脆弱性が見つかったそうです。

www.helpnetsecurity.com

 

影響範囲とかは

www.helpnetsecurity.com

だそうです。

xz自体は、Linuxで使われている汎用的なデータ形式ですが、zipやgzに比べるとあまりつかわれていない印象があります。

このxzの脆弱性がどんな悪さをするかというと、影響を受けたライブラリをリンクしているsshdを使用していた場合、liblzmaの実装が改ざんされ、任意のソフトウエアを利用できるようになり、結果として外部から不正アクセスをされる恐れがあるそうです。

Amazon Linuxとかは、影響ないそうですが、Red HatUbuntuなどは影響あるようなので、サーバ運用している方は、参考にしてください。

 

Python関数の基本理解をしてみました

pythonの関数について。

自分で勉強で気になる部分だけピックアップして、忘れないように記事として起こしておこう。だから、ここに記載されていないpythonの関数の機能があるので、ご注意ください

 

ラムダ式(lambda)

ラムダ式は、一箇所とかしか使わない使い捨てのような関数を定義するときに使います。式として使われるので、関数の引数として使うことおができます。

myfunc = lambda a,b: x+y

print(myfunc(3,6))    #=> 9

 

イテレータ(iterator)

これがあまり理解できない。イテレータとは、次の要素にアクセスすることを繰り返すインターフェイスのことだそうです。配列のようなデータ構造の要素を順に処理をしていく繰り返し処理を簡単に記述できる構文だそうです。見える化かな。

 

class MyR:
      def __init__(self, max):
      self._max = max

      def __iter__(self):
      self._count = 0
      return self

      def __next__(self):
      result = self._count
      if result >= self._max:
      raise StopIteration
      self._count += 1
      return result

for n in MyR(3):
      print(n) #=> 0, 1, 2

デコレータ(@)

これは便利。関数を実行する前後に特殊な処理を実行したい場合に用いる。デコレータをうまく使うと同じような関数を複数つくらなくてよくなるはず。

def mydecolater(func):

    def wrapper():

        print("go")

        func()

        print("end")

    return wrapper

 

@mydecolater

def hello():

    print("hello")

hello()    #-> go,hellp,end

ほかにも、ジェネレータなどの機能もあるので、調べてみてくださいね

 

Python入門とビット演算

時間があるので、pythonの勉強でもしようかと思い、

とほほのPython入門 - とほほのWWW入門

で、勉強してたら、ビット演算子というものがでてきました。長年プログラミングをしていますが、ビット演算子は、まったく使ったことがないので、この機会にちょっと勉強してみました。

まずは、基本であるビットとは

コンピュータは、実は、ON/OFFの繰り返しでできており、そのON/OFFのスイッチをビットと読んでおり、スイッチ一個を1ビットとよびます。ちなみに、8ビットが1バイトです。表記するときは、0000000のように表し、右側から0ビット目、1ビット目って数えます。

 

次に、ビット演算とは

スイッチのON/OFFの切り替えを制御するのがビット演算です。大体8の倍数個、つまりバイト単位でまとめて行います。

 

それでは、演算子についてです。

ちょうど、pythonを勉強しているので、例は、pythonでやります。

演算子一覧

~a       # ビット反転
a & b   # AND:論理積
a | b     # OR:論理和  
a ^ b    # XOR:排他的論理和
a << b  # b ビット左シフト
a >> b  # B ビット右シフト

&(AND)

2つを比較し、どちらも1なら1、それ以外なら0を返します。フラグをビット管理しているときに、そのフラグが立っているかを調べます。

a&b=c

a 11110000

b 10101010

c 10100000

|(OR)

2つを比較して、どちらかが1なら1、それ以外なら0を返します。フラグをビット管理しているときに、そのフラグを立てるときなどにつかいます。

a|b=c

a 11110000

b 10101010

c 11111010

~(NOT)

すべて逆転させます。1を0に、0を1に変えます。真逆の状態にしたいときに使います。

~a=c

a 11110000

c 00001111

^(XOR)

2つを比較して、どちら片方だけ1ならば1、どちらも0またはどちらも1の場合は、0を返します。どこが違うか調べるときなどで使います。

a^b=c

a 11110000

b 10101010

c 01011010

>>(右ビットシフト) >>(左ビットシフト)

>>は、ON/OFFの状態を右にずらします。
<<は、ON/OFFの状態を左にずらします。
ずらしたことによるできた空白には0がはいり、はみ出した分は消えます。このはみだして消えたことを、オーバーフローといいます。ループを使ってビット操作するときなどに使えます。


a >> 1 =c

a 11110000

c 01111000


a << 1 =c

a 11110000

c 1110000

 

以上です。

 

通常のプログラミングでは、ビット演算は使わなくてもいいですが、メモリの節約をするときなどにつかいます。例えば、一つの変数で複数のフラグを管理する場合です。もし、使える機会があったらつかってみてください

 

Dockerを活用したDjangoインストールの注意点

Dockerの公式サイトに掲載されているDjangoのインストールを試してみた。

docs.docker.jp

するとまず、docker-compose runを実行時に、以下のエラーがでた。

ModuleNotFoundError: No module named 'django.utils.six.moves'

どうもpythonDjangoのバージョンの対応するバージョンの違いからでてくるエラーだそうだけど、解決方法は、docker-compose runの前にdocker-compose buildを実行するとエラーは回避されました。

ただ、今度は、docker-compose run 時に以下のエラーがでてきました。

ERRO[0001] error waiting for container: context canceled 

Error response from daemon: failed to create task for container: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: exec: "django-admin.py": executable file not found in $PATH: unknown

対策は、

docker-compose run web django-admin.py startproject composeexample .

で、django-admin.pyの.pyを削除

docker-compose run web django-admin startproject composeexample .

で実行するとできました。これはなんでエラーになったのかは、わからないです

 

これをやっても、だめだったので、requirement.txtの記述を

Django
psycopg2

にしたら、うまくいきました。

多分、Djangopythonのバージョンが合わなかったのかなと思います。

Reddit: アメリカの投稿型ソーシャルサイト

最近、redditという言葉をみかけるようになってきました。

今朝のTechcrunchの記事にも、Redditの関する記事を掲載していました。
上場したそうです。

techcrunch.com

 

まだ、使ったことがないのですが、Redditとは、アメリカで流行している投稿型のソーシャルサイトです。日本でいう2chのようなもので、2chのような無法地帯ではないです。2chの板のようなものが、「サブレディット」となります。生活のヒントが載ったサブレディットや観葉植物に関するサブレディットなど、自分が知りたい情報があるサブレディットをフォローするといいようです。

Reddit

https://www.reddit.com/

 

・日本語のサブレディット

https://www.reddit.com/r/ja/

 

自分もこれからいろいろ調べていきたいです。

 

Dockerを活用したPython環境構築の手順

Pythonは、ほぼ使ったことがないので、時間もあるので、勉強してみようかと思います。まずは、実行環境を作らないといけないのですが、Mac環境そのままにPythonをインストールをしていいのですが、せっかくなので、DockerでPythonをインストールしてみました。

※前提条件として、Dockerはインストール済みとします。

 

  1. Dockerファイルの構成
    どこかのフォルダに以下の構成にします。

    python/
      ├ Dockerfile
      ├ docker-compose.yml
      └ opt/
        └ sample.py

     

  2. Dockerfile
    Dockerfileは、なにをインストールして、どんな設定をするかをファイルに指定できます。Dockerを構築したあとでもできますが、使い回せるようにDockerfileをつくるのがおすすめです。今回は、python3をインストールします。
    ※念の為一般ユーザ(user)も追加するようにしました。

    FROM python:3

    ARG USERNAME=user
    ARG GROUPNAME=user
    ARG UID=1000
    ARG GID=1000
    RUN groupadd -g $GID $GROUPNAME && \
    useradd -m -s /bin/bash -u $UID -g $GID $USERNAME
    USER $USERNAME
    WORKDIR /home/$USERNAME/

    USER root

    RUN apt-get update
    RUN apt-get -y install locales && \
        localedef -f UTF-8 -i ja_JP ja_JP.UTF-8
    ENV LANG ja_JP.UTF-8
    ENV LANGUAGE ja_JP:ja
    ENV LC_ALL ja_JP.UTF-8
    ENV TZ JST-9
    ENV TERM xterm

    RUN apt-get install -y vim less
    RUN pip install --upgrade pip
    RUN pip install --upgrade setuptools

    RUN python -m pip install jupyterlab

  3. docker-compose.yml

    docker-compose.ymlは、作成するコンテナ情報を書きます。
    working_dirは作成したコンテナにログインした際の初期ディレクトリになります。
    volumeはローカルのどのフォルダとコンテナの中の環境フォルダを同期するための設定です。コンテナを削除されたときにもデータだけは残したいものに使います。例えば、ソース・ファイルを置く場所に使うことが多いです。

    version: '3'
    services:
      python3:
        restart: always
        build: .
        container_name: 'python3'
        working_dir: '/root/'
        tty: true
        volumes:
          - ./opt:/root/opt

  4. sample.py
    これは、うまくpythonがインストールされたか確認するために作成するので、ファイルの中身は自由にどうぞ。サンプルを置いときます。

    print("test")

  5. dockerのイメージ作成、コンテナのビルド、コンテナ起動
    準備は整いました。それでは、イメージの作成、コンテナのビルドと起動を以下のコマンドで実行しましょう
    cd python
    docker compose up -d --build
    エラーがなければ、イメージができているか確認
    docker image ls
    次にコマンドを実行し、現在走っているコンテナのリストを取得します
    docker container ls
  6. コンテナへ接続して、サンプルで作ったpythonを実行
    問題なくできているのでしたら、最後にコンテナへ接続して、実行してみよう
    接続は、
    $ docker compose exec python3 bash
    で接続して、
    cd opt
    python sample.py
    で実行して、testと表示されればOK

 

おわりに

Dockerは便利なので、いろいろな言語での環境をつくっとくといいかもしれません。

 

 

 

Laravelの画像アップロード時に、imgタグのnameに2次元配列を使った際の対応方法

larvelの画像アップロード時に、fileやhasfile関数を使う場合があるかと思いますが、

引数を2次元配列を使った際の記述の仕方がわからなくて、色々調べてなかなか見つからなかったので、メモをとっとこう。

<img src="image" name="page_thumbImg[1][2]" value="">

というタグを使っている場合は、

page_thumbImg.1.2

という感じにするとよいようです。

[]を使うのではなく、ドットで区切ります。

 

サンプルは以下です。

$imagefilename="page_thumbImg.1.2";

if ($request->hasFile($imagefilename)) {

$pageMainthumbImg = $request->file($imagefilename);

$name_gen = hexdec(uniqid()) . '.' . $pageMainthumbImg->getClientOriginalExtension();

Image::make($pageMainthumbImg)->resize(1900, 250)->save('upload/page_images/'.$name_gen);

$saveUrlpageMainthumbImg = 'upload/page_images/'.$name_gen;

} else {

$saveUrlpageMainthumbImg = null;

}

$page_repeat_fields1->page_thumbImg=$saveUrlpageMainthumbImg;