tohokuaikiのチラシの裏

技術的ネタとか。

ApacheのProxyをかます途中でBasic認証を入れてConfluenceにアクセスさせようとしたら失敗した件

よくある1サーバーでConfluenceを複数稼働させたい場合のリバースProxy設定ですね。

こんな感じ。
f:id:tohokuaiki:20180416182940p:plain

あるいは、iptablesで無駄にポートを開けたくない場合とか。

で、内輪向けのConfluenceなんで、Basic認証をかければゼロデイアタックとかも多少は防げるんじゃないかって思ってBasic認証つけたかったんです。

Basic認証は通るけど、ConfluenceでAuthエラー

余裕じゃん・・と思ってこんな感じでProxy設定にBasic認証の設定をかけたわけです。

<VirtualHost *:80>
    <Location />
        Order deny,allow
        Allow from all
        AuthType Basic
        AuthName "Authentication"
        AuthUserFile /etc/apache2/htpasswd
        Require valid-user
    </Location>
    ProxyTimeout 8000
    ProxyRequests Off
    ProxyPreserveHost On
    SetEnv force-proxy-request-1.0 1
    SetEnv proxy-nokeepalive 1
    ProxyPass / http://localhost:8090/ retry=1 acquire=3000 timeout=600 Keepalive=On
    ProxyPassReverse / http://localhost:8090/
</VirtualHost>

すると、こんなエラーが出る。
f:id:tohokuaiki:20180416183247p:plain

HTTPステータス 401 - Basic Authentication Failure - Reason : AUTHENTICATION_DENIED
type ステータスレポート
メッセージ Basic Authentication Failure - Reason : AUTHENTICATION_DENIED
説明 This request requires HTTP authentication.
Apache Tomcat/8.0.50

なんでTomcat側でエラーが出るんだ????

と思い、Tomcat使ってるのはConfluenceなのでこちら側を疑う。Confluenceで一旦ログイン後に、ApacheBasic認証をつけるとこのエラーは出ない。

ということは、Confluenceは

  1. COOKIEによる認証を試みる
  2. COOKIE認証に失敗した場合、Basic認証のAuthorization ヘッダから認証を試みる

となっているのではないか???

余計なことしてほしくないなぁ…と思い、そのAuthenticateをしているだろうプラグインを探す。
f:id:tohokuaiki:20180416182401p:plain

なんとなくこいつっぽいなーって思い、「無効」にしたが全然だめだった。

Confファイルを探すもなんか見つからない…。

ということで、Apache側で設定

だったら、Proxyする際にAuthenticationヘッダを送らなければいいんじゃんって思って、Apacheにmod_headersを導入

# a2enmod headers

した後に、apache.conf(debianなんでsites-enables内だけど)を書き換えて

    RequestHeader unset Authorization

を追加。

すると問題なくConfluence側がBasic認証をやめてくれた。

Confluence、REST and os_authTypeとか読むとquery stringsにos_authType=basicって入れないとBasic認証ヘッダをスルーしてくれそうなんだけどな。ま、いいや。。

PHPで制御文字を取り除く

ほかのプログラミング言語はたくさんあったのだけどPHPが無い。

Strip control codes and extended characters from a string - Rosetta Code

こんな感じかな。

<?php
function stripCtrlCode($string)
{
    $ctrl_code = array(
        "00", // NULl(ヌル)
        "01", // Start Of Heading(ヘッダ開始)
        "02", // Start of TeXt(テキスト開始)
        "03", // End of TeXt(テキスト終了)
        "04", // End Of Transmission(転送終了)
        "05", // ENQuiry(問合せ)
        "06", // ACKnowledge(肯定応答)
        "07", // BELl(ベル)
        "08", // Back Space(後退)
        /*    "09", // Horizontal Tabulation(水平タブ) */
        /*    "0A", // Line Feed(改行)*/
        "0B", // Vertical Tabulation(垂直タブ)
        "0C", // Form Feed(改ページ)
        /*    "0D", // Carriage Return(復帰)*/
        "0E", // Shift Out(シフトアウト)
        "0F", // Shift In(シフトイン)
        "10", // Data Link Escape(伝送制御拡張)
        "11", // Device Control 1(装置制御1)
        "12", // Device Control 2(装置制御2)
        "13", // Device Control 3(装置制御3)
        "14", // Device Control 4(装置制御4)
        "15", // Negative AcKnowledge(否定応答)
        "16", // SYNchronous idle(同期信号)
        "17", // End of Transmission Block(転送ブロック終了)
        "18", // CANcel(取消)
        "19", // End of Medium(媒体終端)
        "1A", // SUBstitute(置換)
        "1B", // ESCape(拡張)
        "1C", // File Separator(ファイル分離)
        "1D", // Group Separator(グループ分離)
        "1E", // Record Separator(レコード分離)
        "1F", // Unit Separator(ユニット分離)
        );

    $code_array = array();
    foreach ($ctrl_code as $code){
        $code_array[] = hex2bin($code);
    }

    return str_replace($code_array, "", $string);
}

って作った後に軽くググったら

制御文字を取り除く方法(改行コードは保持) - Qiita

<?php
return preg_replace('/[\x00-\x09\x0B\x0C\x0E-\x1F\x7F]/', '', $string); 

ってあって、なんだか ( ´_ゝ`)って表情になった。

polyglotで英語の構文解析をする

日本語だと、MeCabとか入れておけば大体大丈夫で日本語での検索も捗るんだけど、英語って言われると…となってしまったので

lab.astamuse.co.jp

を参考にCentOS7で解析してみる。

インストール

とりあえず環境

$ more /etc/redhat-release
CentOS Linux release 7.4.1708 (Core)

実行

python-numpyが必要らしい。・・・んだけど、yum listしてみると、python27-numpyしかない。

しかし、んー、27ってついてるけど・・・・

[itoh@localhost ~]$ which python2.7
/bin/python2.7
[itoh@localhost ~]$ which python
/bin/python
[itoh@localhost ~]$ ls -l /bin/python
lrwxrwxrwx 1 root root 7 Jan 26 11:05 /bin/python -> python2
[itoh@localhost ~]$ ls -l /bin/python2
lrwxrwxrwx 1 root root 9 Jan 26 11:05 /bin/python2 -> python2.7

まぁ、大丈夫そうだろう。

pipもpip2.7がいいのかな~?と思ってインストールしたけど diff /bin/pip /bin/pip2.7 したら違いがなかった。

# yum install python27-numpy
# yum install -y libicu-devel
# yum install -y pip2.7
# yum install python-devel
# pip2.7 install --upgrade pip
# pip2.7 install polyglot

Installing collected packages: PyICU, pycld2, morfessor, numpy, wheel, polyglot
  Running setup.py install for PyICU ... done
  Running setup.py install for pycld2 ... done
  Running setup.py install for morfessor ... done
  Running setup.py install for polyglot ... done
Successfully installed PyICU-2.0.3 morfessor-2.0.4 numpy-1.14.2 polyglot-16.7.4 pycld2-0.31 wheel-0.30.0

となったので問題ないんだろう。

モデルファイルのインストール

$ polyglot download embeddings2.en pos2.en

で、自分のホームディレクトリにpolyglot_dataディレクトリを作成してこれがモデルファイルらしい。

で、何をしたかったかというと、

PDFから抜き出したテキストファイルを字句解析したかったのだ。

ところが、pdftotextで抜き出したテキストをpolyglotで解析しようとすると、

pycld2.error: input contains invalid UTF-8 around byte 5302 (of 39198)

UTF-8じゃないのが入ってる」と言われてしまう。

じゃあ、Python上でPDFを抜き出してそれを渡そうと思い、textractをインストールすることにした。

#pip2.7 install textract

     #include <pulse/pulseaudio.h>
    compilation terminated.
    error: command 'gcc' failed with exit status 1

と怒られた。

pulseaudio-libs-devel が必要なのかな?

# yum install pulseaudio-libs-devel

してから再度実行するとインストールできたっぽい。

しかし、結局同じ結果に。うーん。

制御コードを除く

ということで、制御コードを除く処理を加えてみた。 PHPで制御文字を取り除く - tohokuaikiのチラシの裏

したら、問題なくパースしてくれた。オッケー。

nginxから使う

php-fpmとnginxから使ってみると、nginxからみたpolyglot_dataが無いって言われるのでエラーになる。

エラーが出るところを解析する。自分の環境では、/usr/lib/python2.7/site-packages/polyglot/load.py を無理やり編集。

  if not path.isdir(p):
    if downloader.status(package_id) != downloader.INSTALLED:
      raise ValueError("This resource is available in the index "
                       "but not downloaded, yet. Try to run\n\n"
                       "polyglot download {}".format(package_id))

とあるのを

  if not path.isdir(p):
    if downloader.status(package_id) != downloader.INSTALLED:
      raise ValueError("This resource is available in the index "
                       "but not downloaded, yet. Try to run\n\n"
                       "polyglot download {}".path.join(p, os.listdir(p)[0]))

として、エラーを見る。

すると、/var/opt/rh/rh-nginx112/lib/nginx/polyglot_data/embeddings2/en が無いって言われてるっぽいんで、

# ln -s /home/tohokuaiki/polyglot_data /var/opt/rh/rh-nginx112/lib/nginx/

としてやった。もうほんと、とりあえずって感じ。そうすると動いた。

プログラミング教育について「総合的な学習の時間」の学習指導要領解説を読む

これが思ったより少ない。これだけの記述のために世の中が右往左往しているのだろうか・・・。どんだけプログラミングに抵抗があるんだろう。

そもそも学習指導要領とは

平成29年3月に発表された新指導学習要領「生きる力」
学習指導要領等:文部科学省 にある、小学校学習指導要領 (PDF:1303KB) がそれである。

で、これだと難しすぎるので、解説がある。
小学校学習指導要領解説:文部科学省
この解説の中にある、「第5章総合的な学習の時間第3の2(2)」とかは、先述の「小学校学習指導要領」のものであって、解説のそれではない。

プログラミング教育は「総合的な学習の時間」の中に含まれるのでこの解説書を読む。
総合的な学習の時間 (PDF:1405KB)

この中でプログラミング教育に含まれているのはP60~の数ページに過ぎない。

小学校学習指導要領

P163にあるこれだけである。

(9) 情報に関する学習を行う際には,探究的な学習に取り組むことを通して,情報を収集・整理・発信したり,情報が日常生活や社会に与える影響を考えたりするなどの学習活動が行われるようにすること。第1章総則の第3の1の(3)のイに掲げるプログラミングを体験しながら論理的思考力を身に付けるための学習活動を行う場合には,プログラミングを体験することが,探究的な学習の過程に適切に位置付くようにすること。

その他、理科の箇所に「プログラミングを体験しながら」とあるのみ。

小学校学習指導要領解説 「総合的な学習の時間編」

この小学校学習指導要領のP163の1段落を説明したもの。

P59~P61の3ページのみである。

現代社会は高度に情報化した社会と言われている。多様で大量な情報が,瞬時に世界に広がる。また,身の回りには様々な情報があふれ,それらを適切に処理し活用する資質・能力の育成が求められている。このような時代に,総合的な学習の時間において,横断的・総合的な課題として情報に関する課題を扱い,その課題を探究的な学習の過程を通して取り組んでいくことには大きな意義がある。ここでは,探究的な学習に取り組むことを通してとあるように,電話,FAX,コンピュータ(タブレット型端末を含む),校内LAN,インターネット,デジタルカメラなどの情報手段を活用する必然性が伴う学習活動を行うことが重要であり,その過程において,情報手段の操作の習得も自然と行われるようにすることが望まれる。

情報を収集・整理・発信したりすることについては,本章の2(3)においても述べたように,探究的な学習の目的に応じて,図書やインターネットを活用したり,適切な相手を見付けて問合せをしたりして,学習課題に関する情報を幅広く収集し,それらを整理・分析して自分なりの考えや意見をもち,それを探究的な学習の目的に応じて身近な人にプレゼンテーションしたり,インターネットを使って広く発信したりするような,コンピュータや情報通信ネットワークなどを含めた多様な情報手段を,目的に応じて効果的に選択し活用する学習活動のことを指している。

情報が日常生活や社会に与える影響を考えたりすることについては,総合的な学習の時間の学習課題の例として,探究的な学習の過程において,情報技術の進化によって日常生活や消費行動がどのように変化したのか,社会がどのように豊かになったのかといったことを取り上げることが考えられる。同時に,日常生活にどのような新たな危険や困難がもたらされているのか,社会にどのような新しい問題が起きているのかを考えることも重要である。これらの情報技術の進化が我々の生活や社会にもたらす恩恵と問題を考えることを通して,今後の情報技術の進化に併せて,自分たちは将来,どのような生活を送り,どのような社会を築くことが望まれるのか,将来にわたる自分の生き方を見つめ考える契機とすることが大切である。あわせて,児童自身が情報を収集・整理・発信する活動を通して,未成年であっても情報社会の一員として生活しているという自覚を促し,発60信情報に責任をもつなどの意識をもたせる必要もある。

その中で,自分自身が危険に巻き込まれないことや情報社会に害を及ぼさないことなどの情報モラルについても,機を見て丁寧に指導する必要がある。例えば,電子掲示板を用いてみんなで調べたことを教え合うような学習活動では,相手を中傷するような書き込みが時折見られることがある。そのような場面を捉えて,なぜそれがいけないのか,どのようなことに発展する可能性があるのかなどを討論するようなことが考えられる。このように情報モラルを取り扱う場合には,児童自らの具体的で身近な素材を取り上げ,情報に関わる際の望ましい姿勢や態度,ならびに情報活用の方法などについて,自分のこととして見つめ直し考えさせることを通して,情報モラルを確実に身に付けさせることが望まれる。

プログラミングを体験しながら論理的思考力を身に付けるための学習活動については,第1章総則の第3の1の(3)のイに掲げられているとおり,総合的な学習の時間のみならず,算数科や理科をはじめとして各教科等の特質に応じて体験し,その意義を理解することが求められている。なお,プログラミングを体験しながら論理的思考力を身に付けるための学習活動を,どの教科等において実施するかということについては,各学校が教育課程全体を見渡し,プログラミングを体験する単元を位置付ける学年や教科等を決定していく必要がある。

そこでは,子供たちに,プログラミングにより意図した処理を行うよう指示することができるということを体験させながら,身近な生活でコンピュータが活用されていることや,問題の解決には必要な手順があることに気付き,発達の段階に即して論理的思考力を育成し,コンピュータの動きをよりよい人生や社会づくりに生かそうとする態度を涵養することが挙げられる。

プログラミングを体験しながら論理的思考力を身に付けるための学習活動とは,子供たちが将来どのような職業に就くとしても,時代を超えて普遍的に求められる力としての「プログラミング的思考」の育成を目指すものであり,プログラミングのための言語を用いて記述する方法(コーディング)を覚え習得することが目的ではない。「プログラミング的思考」とは,自分が意図する一連の活動を実現するために,どのような動きの組み合わせが必要か,どのように改善していけばより意図した活動に近づくのかということを論理的に考えていく力の一つである。このような思考力は,プログラミングに携わる職業を目指す児童にだけ必要な力ではなく,どのような進路を選択し,どのような職業に就くとしても,これからの時代において共通に求められる力であると考えられる。

特に総合的な学習の時間においては,プログラミングを体験しながら論理的思考力を身に付けるための学習活動を行う場合には,プログラミングを体験することだけにとどまらず,情報に関する課題について探究的に学習する過程において,自分たちの暮らしとプログラミングとの関係を考え,プログラミングを体験しな61がらそのよさや課題に気付き,現在や将来の自分の生活や生き方と繋げて考えることが必要である。例えば,プログラミングを体験しながら,生活を便利にしている様々なアプリケーションソフトはもとより,目に見えない部分で,様々な製品や社会のシステムなどがプログラムにより働いていることを体験的に理解するようにすることが考えられる。

例えば,カプセルトイの販売機とジュースの自動販売機を比べてみる。カプセルトイの販売機に比べ,ジュースの自動販売機は何が起きているのか分からない。お金を入れボタンを押すことで,選んだジュースとおつりが出る。自動販売機の中では何が起きているのだろう。子供たちは自動販売機の中で「プログラム」が動いていることを知り,身近な生活の中には,プログラムで動いていると想像されるものがたくさんあることに気付く。ここでジュースの自動販売機の中で起きていることをプログラミングする体験を取り入れることによって,プログラムは「機械の中にあるもの」,「機械に人間が考えた動きをさせるための命令であること」,「効率的に,順序立てた命令文の積み重ねであること」などを理解する。身近にプログラムで動いているものに関心をもった児童は,電気・水道・公共交通機関などのライフラインを維持管理するためにもプログラムが働いていることや,AI(人工知能)やビッグデータの活用,ロボットの活用によって,私たちの生活がより快適になり効率的になっていることにも気付いていくことが考えられる。

それらのプログラムの恩恵だけではなく,プログラムを悪用したコンピュータウイルスやネット詐欺などの存在にも触れることで,様々な新たな技術が開発され自分たちの身近な存在になる一方,「人間らしさとは何か」,「人間にしかできないこととは何か」,「人間としてどのように暮らしていけばいいのだろうか」など,自分の生き方を考え直すことも期待できる。

この展開例からも分かるように,総合的な学習の時間においてプログラミングを体験することは,それが探究的な学習の過程に適切に位置付けられていることが欠かせない。

またプログラミングを体験しながら論理的思考力を身に付けるための学習活動を行う場合にあっても,全ての学習活動においてコンピュータを用いてプログラミングを行わなければならないということではない。児童の発達段階や学習過程を考慮し,命令文を書いた紙カードを組み合わせ並べ替えることによって,実行させたいプログラムを構成したり,指令文を書いて他者に渡して,指令どおりの動きをしてもらえるかどうかを検証したりするなど,具体物の操作や体験を通して理解が深まることも考えられる。

  • 身近な生活でコンピュータが活用されていることや,問題の解決には必要な手順があることに気付いてもらうこと。
  • 時代を超えて普遍的に求められる力としての「プログラミング的思考」の育成を目指すものであり,プログラミングのための言語を用いて記述する方法(コーディング)を覚え習得することが目的ではない。
  • プログラミングを体験しながらそのよさや課題に気付き,現在や将来の自分の生活や生き方と繋げて考えることが必要
  • 目に見えない部分で,様々な製品や社会のシステムなどがプログラムにより働いていることを体験的に理解するようにすること

CentOS7のfirewalldでsshdをポートを変更して特定IPアドレスから許可する

色々と検索したけど、なんか微妙な感じだったのでまとめる。
結果的に[CentOS] firewalldで特定のサービスを特定のIPアドレスに対して許可する - Qiitaが一番適切だった。

firewalldは基本的に許可してないものは全部Drop

CentOS7では最初からpublicがActiveなゾーンとして設定されている。

#  firewall-cmd --list-all-zones
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources:
  services: dhcpv6-client ssh
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

手順

まずサービスの自体の追加

ポートを任意のモノ(2222とか)にしたサービスを設定する。
サービスの設定というけれども、これは単純にポートの設定。

ファイルを直接操作する。これはコマンドが無いのかな?

#cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/ssh-2222.xml

反映のためのreload

# firewall-cmd --reload

次に許可するリストのためのZoneを作成する。

# firewall-cmd --permanent --new-zone=custom

このゾーンはリロード時にActiveなゾーンになる。

削除する場合は

# firewall-cmd --permanent --delete-zone=custom

あるいは、/etc/firewalld/zones/custom.xml があるのでそのファイルを削除。

新規で作ったzoneに新規で作ったサービスを追加

#  firewall-cmd --permanent --add-service=ssh-2222 --zone=custom

これで、このzoneはこのサービス(ポート)に対して接続を許可することになった。

そのZoneが使えるIPアドレスを指定

# firewall-cmd --permanent --add-source=192.168.1.125 --zone=custom

このあたり、先ほど作られたzoneファイルを直接編集しても大丈夫。

最後にDefaultのsshをpublicから削除してリロード

# firewall-cmd --permanent --remove-service=ssh --zone=public

これで通常のsshは外部から通らなくなる。(まだ設定は反映されてないので操作はできる)

# firewall-cmd --reload