As rookie

ルーキーインフラエンジニアがインフラのこと以外も結構書いてしまうブログ

pythonでスライシングを使ってHTMLを生成(力技)

こんにちは

前々回でスライシングを身につけました

mokicks.hatenablog.com

今回も文字列関係です(先に進めない)

今回はトリプルクォーテーションと特殊文字について書きます。

トリプルクウォーテーション

"""で文字列を囲むことで複数行に跨いだ文字列をひとまとまりにして扱うことができます

>>> """ one line #複数行文字列開始
... two line
... three line
... """ #複数行文字列終わり
' one line\ntwo line\nthree line\n'

"""で囲い複数行で書いたときに改行は\n として文字列にはいります。\n特殊文字の改行を表します

特殊文字

文字列内で\を記号を使って改行などの特殊な文字列を表現することができます。 上記の複数行の代入を例にすると

>>> tmp = """one line #tmpに複数行の文字列を代入
... two line
... three line"""
>>> print tmp
one line
two line
three line

このような感じで\n が入っていたものをprintすると改行されていることがわかります。

今回は\n で改行。\t でタブということだけ書いておきます

www.pythonweb.jp

ここでまとめてくれていますので、参考にさせてもらいましょう。

本題

この二つのことと前回のスライシングでHTMLを生成したいと思います。

方法は

htmlタグを代入した文字列オブジェクトとspanタグを代入した文字列オブジェクトを用意しfindメソッドとスライシングでHTMLを生成する

>>> html = """<html>
... </html>"""
>>> print html
<html>
</html>

>>> span = "\t<spna></span>\n"
>>> print span
    <spna></span>

>>> html.find("\n")
6
>>> print html[:html.find("\n")] #htmlの改行文字までを表示
<html>

>>> print html[:html.find("\n")] + span #改行文字が出力されていない。 
<html>    <spna></span>

>>> print html[:html.find("\n")] + span + html[html.find("\n")+1:] #やっぱり改行文字が表示されていない。
<html>    <span></span>
</html>

>>> print html[:html.find("\n")+1] + span + html[html.find("\n")+1:] #1足す。いい感じになる
<html>
    <span></span>
</html>

>>> print html[:html.find("\n")+1] + span[:span.find(">")] + "torick" + span[span.find(">"):] + html[html.find("\n")+1:] #findで検索した文字の一つ前になるからミス
<html>
    <spantorick></span>
</html>
>>> print html[:html.find("\n")+1] + span[:span.find(">")+1] + "torick" + span[span.find(">")+1:] + html[html.find("\n")+1:] #成功
<html>
    <span>torick</span>
</html>

こんな感じで力技でHTMLを書くことができました!

最初にhtml.find()をして6が返ってきてますね

< h t m l > \n
0 1 2 3 4 5 6

なのでスライシングで html[:6]としてなぜ出ないのか謎でした。そこでちょっと試してみた。

>>> html.find("<")
0
>>> html.find("h")
1
>>> html.find("t")
2
>>> html.find("m")
3
>>> html.find("l")
4
>>> html.find(">")
5
>>> html.find("\n")
6
>>> print html[:html.find("\n")] #6文字目までを指定
<html> #改行は表示されない
>>> print html[:html.find("\n")+1] #1足す
<html> #改行は表示されている

>>> print html[:6] #数字で指定
<html> #やはり改行は表示されていない

スライシングの認識が間違っているのかもしれない。

スライシングで指定する[0:6]この場合の6は要素番号じゃなくて「6番目の文字」という認識なら[:6]で改行文字が指定ができないことを納得できる

< h t m l > \n
0 1 2 3 4 5 6 #要素番号
< h t m l > \n
1 2 3 4 5 6 7 #個数

別の方法で試してみる

>>> tmp = "abcdefg"
>>> tmp[5]
'f' #要素番号5番目のfが帰ってくる
>>> tmp[:5] 
'abcde' #5個目の文字まで返ってくる

>>> tmp[5:]
'fg' #5個目の要素から最後までが返ってくる

スライシングの始まり[こっちがわ:]は要素番号

スライシングの終わり[:こっち側]は先頭から何文字目(個数)がいれられる

という認識になりました

>>> tmp[3:3]
''
>>> tmp[3:4]
'd'

スライシングで数字で「どこまで」を指定する場合は「何個目まで」というので抽出しているのでしょう。

以上。HTMLを力技で生成でした

pythonで文字列の先頭文字を大文字にする

結論から capitalize()で文字列の先頭文字を大文字にしたオブジェクトを返せます。

>>> str.capitalize()
'Test'

こんにちは。

「はじめてのpython」でpythonの勉強をしている続きです。python基礎です。 Amazon:はじめてのpython

文字列の操作をしたときに返ってくるのは別のオブジェクトということは前回知りました。 mokicks.hatenablog.com

つまり、文字列は不変性を持つオブジェクトです。

そして文字列もオブジェクトなのでいくつかメソッドを持っています。

文字列がもつメソッドをつかっても返ってくるのは別のオブジェクトなのです。

たとえば upperメソッド 使った場合だと

>>> str = 'test'
>>> str.upper()
'TEST'
>>> str
'test'
>>> 

こんな感じで元の変数strは何も操作されていない状態のままです。

文字列の操作として文字列の先頭を大文字にしたいときはどうすれば良いのでしょうか?

upperメソッドを使っても返ってくるのは別のオブジェクトですから、返ってきたオブジェクトを変数に代入して元の文字列のオブジェクトと結合すれば良いのだ!という結論になりました。

>>> str = 'test'
>>> tmp = str.upper() #tmpに'TEST'を代入
>>> str = tmp[0] + str[1:]
>>> str
'Test'

う〜んわざわざtmp邪魔だなぁ〜

文字列のシーケンスの各要素にメソッドを実行できないものかねぇ〜

できました。

>>> str = 'test'
>>> str = str[0].upper() + str[1:]
>>> str
'Test'

インデックスを指定して特定の要素(ここでいうstr[0] = t)に対して操作をしているように見えるがpythonが扱っているオブジェクトは文字列のオブジェクトなんだぁ〜

これで無事文字列の先頭を大文字にすることができました。

不変性をもつオブジェクトに対して変更を加えているのではなく、オブジェクトを操作して同じオブジェクトに代入することでオブジェクトに変更を加えているようにできるのですね!

ちなみにcapitalize()で文字列の先頭文字を大文字にしたオブジェクトを返せます。

>>> str.capitalize()
'Test'

pythonで文字列をスライシング

こんにちは。

最近「はじめてのpython」でpythonの勉強をしています。

Amazon:はじめてのpython

文字列がシーケンス(配列(正確には配列ではない))ということを知り(なんとなく知ってはいた)スライシングをしました。特に特殊なことはしていません。最後に問題があります。

スライシングとはシーケンスの要素xからy(x < y)までを抽出することです。 書き方は

>>> str = 'mojiretu'
>>> str[0:4] #0から4番目を抽出
'moji'
>>> str[4:len(str)] #4から 最後の要素までを抽出
'retu'

今回新たに学んだことは シーケンスの左端がデフォルトでインデックス"0"に対応し、右端がシーケンスの長さを表す数値と同じになるということです。

>>> str[:4] #さきほどと同じ結果
'moji'
>>> str[4:] #さきほどと同じ結果
'retu'
>>> str[:] 両端がデフォルトの値がと対応しているので
'mojiretu'

わけのわからない検証かもしれませんがシーケンス後ろの方の要素を[こっち側に:]それより前の要素を[:こっち側]にして試すと

>>> str = 'mojiretu'

>>> str[-1:2]
''
>>> str[-1:-2]
''

空文字列が帰ってきました。

ちなみにスライシングをして上記のように出力されている文字列は、変数strとは別のオブジェクトが戻されているようです。だから抽出なんですね。

ここで問題です。 上記はスライシングをして文字列を抽出しましたが、「シーケンスの要素番号を指定して抽出する」ことをなんというでしょうか?

>>> str[2]
'j'

こういうことを何というでしょうか。

そうインデクシング(indexing)ですね。そのままですね

git rebaseメモ

こんにちは

引き続きlearn Git Branchingでgit のbranchの操作を学んでいます。

前回

mokicks.hatenablog.com

またつまずきました。その時のメモです。

Rebaseをモノにする の1でつまずきました。

複数に別れたブランチを一つのシーケンシャルにまとめるという問題です。 ちなみにシーケンシャルとは

e-words.jp

f:id:shigeru-mokicks:20161004024111p:plain

これを

f:id:shigeru-mokicks:20161004024155p:plain

をこうしたいのですが

やはり回数をオーバーしてしまいます。。

git checkout bugFix
git rebase master
git checkout side
git rebase bugFix
git checkout another
git rebase side
git checkout master
git rebase another

8回ですが、模範回答では7回でした!

いやいや無理でしょ!

自分の中では最小でやってきたつもりだ。

こんなところで時間使っていてもしかたない、答え見ちゃえ

git checkout bugFix
git rebase master
git checkout side
git rebase bugFix
git checkout another
git rebase side
git rebase another master

おいおい git rebase anoter master とかありかよ

んじゃ

git rebase master bugFix
git rebase bugFix side
git rebase side another
git rebase another maseter

でいけるんじゃね?

いけました。

わかったことまとめ。

◻︎rebase したいブランチにcheckoutしている状態のrebaseは

git rebase <リベースのされる(宛先)ブランチ>

◻︎checkout しないでのrebaseは

git rebase <リベースのされる(宛先)ブランチ> <リベースする(元)ブランチ>
git rebase <何のブランチに> <何のブランチを> ぶらさげるか

別のブランチのコミットはリベースされるブランチにぶらさがり、一つのシーケンシャルの以前のコミットにいてるブランチは、最新のコミットのところまで移動する。

こんな感じですね!

わーい!

learnGitBranchingでgitのブランチ操作を学んでみてる

こんにちは

最近知り合いに「gitの事で質問あるんだけど」って言われてまともに答えれなかった。

エンジニアなら知ってて当然レベル?のことを雰囲気で行っているのはまずいってことで、薦められた 「 learnGItBranching 」でブランチの操作に慣れようとしています。

k.swd.cc

こんなに良いものがあるなんて知らなかった。まだ全部はやってないですけど。

これは 問題形式になっていて、ツリー構造のゴールがあってそれに合うように git branch やら git rebase をするというものです。

最初にそれぞれのコマンドがどういう操作をするものかを説明され、webのコンソールっぽい画面でコマンドを実行し、最終的に「あなたは◯回コマンドを実行しました模範回答では◯回です。」というメッセージが表示されます。

この中でどうしても模範回答通りの回数にならないものがあってなんだかなぁってなってました。

その問題が「次のレベルに進もう」の3問目です。

演習自体は コミットの相対的な指定 ってだけなんですが、

模範回答が3回のところ、4回になってしまうのです。

その4回の時のコマンド

# 4回の時のコマンド
git checkout master
git branch -f master C6
git branch -f bugFix bugFix~3
git checkout HEAD~3

最初のmasterへのcheckoutが無駄な気がするな〜ってのはわかってるんですが何故か自分の中でそのコマンドを抜くことができなかった。それは何故か

おそらくHEADの認識がおかしかったのだ

www.backlog.jp

HEADとは、現在使用しているブランチの先頭を表す名前です。デフォルトではmasterの先頭を表しています。HEADが移動することで、使用するブランチが変更されます。

だが

Git - ブランチとは

Gitは、あなたが今どのブランチで作業しているのかをどうやって知るのでしょうか? それを保持する特別なポインタが HEAD と呼ばれるものです。これは、SubversionCVS といった他の VCS における HEAD の概念とはかなり違うものであることに注意しましょう。Git では、HEAD はあなたが作業しているローカルブランチへのポインタとなります。

この認識をもってたかった!!

結果

git branch -f master C6
git branch -f bugFix bugFix~3
git checkout HEAD~3

これでいけた。

HEADの認識関係なくてbranchコマンドを知らないだけだったのかもしれませんが、自分の頭の中で

逆説的に

branchの先頭(操作する対象)とHEADは同じ場所じゃないとだめでしょ

ってなってたんだと思います。

これからもgitの操作になれて開発効率やコードの保守性をあげていきたいとおもいます!

module:sysctl

sysctl /etc/sysctl.confのエントリを管理する。

概要

このモジュールは「sysctl」のエントリを操作した後に、必要に応じて /sbin/sysctl -p
を行います


parameter required default choices コメント
ignoreerrors no yes ・no
・yes
未知のkeyについてのエラーを無視します
name yes sysctlの変数をドット区切りのパス(別名:key)で指定します
reload no yes ・yes
・no
yesの場合はsysctl_fileが更新されていたなら /sbin/sysctl -p を実行します
noの場合はsysctl_fileが更新されていても再読み込みしません。
state no present present
absent
sysctl_fileにエントリがあるべきかどうか
sysctl_file no /etc/sysctl.conf sysctl_fileが/etc/sysctl.conf でないなら絶対パスでファイルまでのパスを指定します
sysctl_set
(added in 1.5)
no ・yes
・no
sysclt コマンドでトークンの値を確認します。そして必要であればオプション -w をセットします。
value no sysctlキーの目標値
note
etc/sysctl.confのファイルはlinuxカーネルの設定を変更するコンフィグファイルです。
keyというのは設定する対象の変数です。

エラーと戦う

エラーというものを目にするのは学生時代から数えて5年目になりました。

最初の2,3年は赤文字が出ると軽くエラーメッセージを読んでエラー文をまるまるコピペしてgoogleで検索していました。
この方法でも目の前の問題が解決することはありますが、「なぜこれで解決するんだろう?」という新たな疑問が生まれることも多々ありました。

ただこれじゃ同じような問題が起きたときの解決スピードが向上しない。そもそも経験したことのある問題だと気づかない。

問題の原因を知りどうやって対処すれば良いのかを知り、次に活かせるようになる必要がある。
じゃあどうすれば良いか、

エラーと真正面からぶつかる力をつけるのだ。

超単純で

・エラーの内容を理解するためにエラー文をもらさずすべて読み取る。

・公式ドキュメントを読む。

今のところはこれで問題なく前に進めている。
エラーも公式ドキュメントも大概が英語なので、まずは英語を読むこと。
エラー文とか公式ドキュメントの分からない単語翻訳しながら読んでたら、他の環境でも活かせる力はついてくる。

問題を解決することで成長につながるし、自分の愚かさに悲しくなるし、楽しいことだらけ。

当たり前のことを当たり前と認識できる新人になろう。と思ったそんな一日