型switchを勘違いしてて3時間溶かした
入力フォームから送信された値を空interfaceである変数numに格納してnumが整数に変換できるのあればこれは整数です
と、そうでなければなにこれ
を出力するプログラムをgoで書こうとしたのだがどうもうまくいかなかった。
package main import "fmt" func main() { var num interface{} = "5" switch num.(type) { case int: fmt.Println("これは整数です") default: fmt.Println("なにこれ") } }
この場合なにこれ
が出力される。考えてみれば当たり前なのだがnumに渡してる5
はstring型なのでint型ではない。だからなにこれ
が出力される。
しかし私は「整数に変換できるのなら整数に変換してくれる」と勝手に思い込んでいたため、このコードが意図した挙動をしないことに気づくまでおよそ3時間ほどかかった(かかりすぎ)
今更ソートの引数を複数入れる方法を知った。
タイトルの通りである。今までは
li = [(1,3),(2,3),(5,8),(1,4),(5,2)]
というような配列を第一成分を昇順でソートし、第一成分が等しい場合は第二成分で昇順にソートするというときは
li.sort(key = lambda x: x[1]) li.sort()
というように書いていた。これはpythonの組み込み関数であるソートの使っているアルゴリズム(TimSort)が安定ソートであることを利用して、第二成分でまずソートし、その後第一成分でソートをするという流れである。ただ、これだと第一成分は昇順ソート、第二成分は降順ソートというような処理が書きにくい。どうしたものかと困ってググってみると簡単な書き方を見つけた。
上と同様の処理は
li.sort(key=lambda x: (x[0], x[1]))
で書けるのである。すごい、すごいぞ無名関数君……
ちなみに第一成分は昇順ソート、第二成分を降順ソートにする場合は符号をつけて
li.sort(key=lambda x: (-x[0], x[1]))
のようにすればよい。
PyPyだとTLEしてPythonだとACしたんだが、なんだこれは
この問題を今日解いたのだがよくわからないことが起こった。
「あ~つまりi+jがA-BかA+Bに一致するときにマスを黒く塗るのね~」
って思ってそのようなコードを書いてpypyで提出したらTLEしてしまった。
Submission #32836575 - AtCoder Beginner Contest 230
「ファッ!?」
と思ってコーナーケースを探して見るも見つからず。べつに再帰を使ってるわけでもないから無限ループになることもないし制約的に絶対通るはずなので何かおかしいと思い始める。
ダメ元でPythonで提出してみると全く同じコードなのにすんなり通ってしまった。
Submission #32836740 - AtCoder Beginner Contest 230
そういえばPyPyは関数呼び出しが遅いって聞いたことあるから関数を使わない形に書き直せば通るのかと思い書き直して提出してみるもうまくいかなかった。
Submission #32836818 - AtCoder Beginner Contest 230
結局原因はわからずじまい。一体これはなんだったんだ。
さらにこの問題でも同様のことが起こった。
まじでなんなんだ。
追記
解決しました。原因は文字列の+=
でした。
一度リストにappendしてからjoinすれば通りました。
覚えた言葉をまとめる②
目次
「IPv4」「IPv6」とは
端的に書くとIPアドレスのバージョンの違いっぽい
まずIP(インターネットプロトコル)とは、インターネットに接続されたコンピュータ同士がデータをやりとりするためにデータ通信の方法を定めた規約のことです。
IPv4はIPの第4版で、1990年代後半からのインターネットの普及と共に広く使われるようになり、現在も引き続き使用されています。
インターネットに接続されたコンピュータにはそれぞれのコンピュータを識別するためのIPアドレスと呼ばれる固有の番号が割り当てられます。IPv4ではこのIPアドレスを32ビットのデータとして表現します。IPv4のアドレス総数は2の32乗個、つまり42億9496万7296個です。このことにより最大約43億台のコンピュータがインターネットに直接接続できます。
しかしインターネットの急速な普及により、現在ではIPv4だけではアドレスの数が足りなくなるという状況が生じてきました。そこで次世代のプロトコルとして注目されているのがIPv6です。 IPv6ではIPアドレスを128ビットのデータとして表現します。そのためアドレス総数は3.4×10の38乗個、つまり約340澗(かん)個となります。これは事実上無限と言える数です。
IPv6・IPv4とは? IPoE・PPPoEとは? その違いを解説 | DTI
「ネットワークアドレス」「ホストアドレス」とは
IPアドレスの
「どのコンピュータですよ~」の部分:ホストアドレス
「どのネットワークですよ~」の部分:ネットワークアドレス
「プライベートIPアドレス」とは
プライベートIPアドレスとは、LANなどの企業内ネットワークに存在する端末が、自由に使用できるIPアドレスのこと。自ネットワーク内でのみ一意であるため、ほかのネットワークでは同じプライベートアドレスが利用されている可能性がある。
「MACアドレス」とは
ネットワーク機器やネットワークアダプターに付いている固有の識別番号。有線LANのほかに、無線LANやスマートフォンにもMACアドレスが割り当てられている。
MACアドレスは、一般的に12けたの16進数で「00-00-00-XX-XX-XX」と表される。前半6けたがメーカー固有のアドレスで、後半6けたが製品個々のアドレスになる。つまり、前半6けたを見ることにより、どこのメーカーのネットワークアダプターを利用しているかを判別できる。すべての製品に違う番号が与えられるため、世界中で同じMACアドレスを持った製品は存在しない。
IPアドレスと混同されがちだが、IPアドレスは通信相手であるサーバーのアドレスであり、手紙でいうあて先の住所に当たる。これに対してMACアドレスは、あくまでも隣の装置と通信するために利用される。MACアドレスは各製品に固有の番号なので変更できないが、IPアドレスはシステム管理者などが状況に合わせて設定可能である。ただし、普通にパソコンを利用する限り、MACアドレスを意識する機会はほとんどない。
「DNS」とは
略さずに言うとDNS(Domain Name System:ドメイン・ネーム・システム)
つまり、インターネット上のコンピュータ同士が通信する際には、 「192.41.192.129」といった数字をピリオドでつないだ「IPアドレス」と呼ばれる番号で通信相手を特定しているのですが、 数字の羅列は人間が識別するのは非常に困難であるため、 人間が覚えやすいように「nic.ad.jp」といった文字列からなるドメイン名を利用し、 変換しているのです。 このドメイン名とIPアドレスを対応づけるしくみがDomain Name System (DNS)であり、 「インターネットの住所録」にあたります。
ついでに「FQDN」とは
略さずに言うとFQDN(Fully Qualified Domain Name:フリー・クオリファイド・ドメイン・ネーム)
一部のサブドメインやホスト名などの「省略して、書かなくても大丈夫だよ」な部分を省略しないで、きちんと全部書いたドメイン名のこと
「ポート番号」とは
ポート番号とは、TCP/IP通信において、 コンピュータが通信に使用するプログラムを識別するための番号です。 ポート番号は16ビットの整数であり、 0番~65535番まであります。
TCP/IP通信においては、 IPアドレスがあればネットワーク上のコンピュータを一意に識別することができますが、 該当コンピュータのどのプログラムに通信パケットを届けるかは、 IPアドレスだけでは決定できません。 どのプログラムに通信パケットを渡すのかを決定するために、 ポート番号を使用します。
インターネット用語1分解説~ポート番号とは~ - JPNIC
「ファイアウォール」とは
ファイアウォール(Firewall)とは、企業などの社内ネットワークにインターネットを通して外部から侵入してくる不正アクセスや、社内ネットワークから外部への許可されていない通信から守るための“防火壁”です。WANの発展により、企業内のネットワークをWebに接続することが当たり前になった結果、Web経由で社内ネットワークに侵入できるようになり、内部データの盗聴、改ざん、攻撃などが行われる可能性が大きくなりました。そのため、高度なセキュリティシステムの構築が必要となり、ファイアウォールが誕生しました。
ファイアウォールは、送られてくる通信のパケット(データのかたまり)情報から接続を許可するか判断し、不正アクセスであると判断した際には、管理者に通報できるよう設計されています。またより高いセキュリティを保てるよう々な付加機能を持っているものが多く、様々なネットワークに柔軟に対応できるようになっています。
ファイアウォールとは(Firewall)|ネットワークセキュリティの再入門|Juniper Networks Productsは日立ソリューションズ
Go言語について
目次
package,module等について
以下のサイトがわかりやすい。
【Go】パッケージ/モジュールやgo modコマンドについてまとめ - フラミナル
配列、sliceの値渡し・参照渡しについて
Goのarrayとsliceを理解するときがきた - Qiita
↑これがめちゃめちゃわかりやすかった。
arrayは数が並んでいるだけのただの値でsliceはarrayへの参照を持つデータ構造らしい。
これからずっとこのことを念頭に置いた上でコーディングしようと思う。(そうすればいつのまにか無意識のうちに区別がついてそう)
また、次の記事も面白かった。ややこしいが上の記事を読んだ後だとすんなり理解できる。
Go の Slice の落とし穴 - Qiita
結局とっつきにくかったsliceのcapacityという概念もsliceを正しく理解することでなんとなく実体がつかめた気がする。
文字列操作がうまくいかない
package main import "fmt" func main() { S := "abc" var slice []string slice = append(slice,S) //これはうまくいく fmt.Println(slice) slice = append(slice, S[0]) //これはうまくいかない fmt.Println(slice) }
なぜかわかってない。わかったら追記する。
ここから実行できる↓
Go Playground - The Go Programming Language
追記
解決した。原因はS[0]の型がuint8になっていたことだった。
それを改めてstring型に戻すと正しく動作する。
package main import ( "fmt" ) func main() { S := "abc" var slice []string slice = append(slice, S) //これはうまくいく fmt.Println(slice) //slice = [abc] fmt.Printf("S[0]のtypeは"+"%T\n", S[0]) // S[0]のtypeはuint8 slice = append(slice, string(S[0])) //string型に戻す fmt.Println(slice) //slice = [abc,a] }
Sliceなんもわからん
この問題を解こうとしたときのことである。 B - Booby Prize
package main import ( "fmt" "sort" ) func main() { // n = 6 // 各スコアが 1 123 12345 12 1234 123456 のとき var n int fmt.Scan(&n) slice := make([]int, n) for i := 0; i < n; i++ { var a int fmt.Scan(&a) slice = append(slice, a) } // この時点でslice = [0 0 0 0 0 0 1 123 12345 12 1234 123456] // 本当は slice = [1 123 12345 12 1234 123456]であってほしかった sort.Ints(slice) fmt.Println(slice[2]) // 当然ここもうまくいかずslice[2] = 0が出力される }
普通に入力受け取ってソートして出力じゃい!ってやったらうまくいかなかったからいろいろ弄ったらこんなことが起こった。何勝手にサイズ変わっとんねん!といいたくなるが可変長配列だから仕方ないことなのだろうか。
疑問
- 配列の一部分を切り取ったものを値渡しとして受け取ることはできないのか?
覚えた言葉をまとめる①
目次
- 「PATHを通す」とは
- 「環境変数」とは
- 「シェル」とは
- 「ターミナル」とは
- 「コンソール」とは
- 「コマンドプロンプト」と「Windows Power Shell」の違いとは
- 「デーモン」とは
- 「インタプリタ言語」「コンパイラ言語」とは
- 「ポインタ変数」とは
「PATHを通す」とは
特定のプログラムを「プログラム名だけで実行できるようにする」こと。
キーワード:PATH、PATHEXT
「PATH を通す」の意味をできるだけわかりやすく説明する試み - Qiita
「環境変数」とは
一言で言うと、Terminal環境内における変数です。 Pathは環境変数のうちの1つです。
「シェル」とは
Shellとは、人間の理解できる言葉を機会へ伝えるプログラムです。 Linux環境でコマンドプロンプト画面を開いているとき、常にShellは起動している状態です。 「Shell」とは、コマンドプロンプト画面から「カーネル」に対して命令をしたとき、カーネルが理解できる機械語に翻訳して伝達する役割を担っているインターフェイスのことです。 つまり、コマンドプロント画面から「Shell」を通して、人間の言葉を機械語に翻訳してから、各「H/W(ハードウエア)」へ命令しているのです。
【Shellの基礎知識】シェルとシェルスクリプトの違いとは?シェルの基本概要 | Beエンジニア
UNIX系OSで使用されているシェルには複数の種類があり、それらはB系シェルとC系シェルに分けられる。
zshは両方にまたがっているらしい。
ついでに「シェルスクリプト」とは
「シェルスクリプト」とは、カーネルに対して処理をさせたい命令をまとめた「プログラム」ファイルのことです。「Shell」はシェルスクリプトの上から順番に処理していきますので、サーバー管理のような単純な作業をまとめておくと自動化することができます。
「ターミナル」とは
ターミナルとは、文字列だけで構成され、専用のコマンドを使ってOSの機能を実行したり、ディレクトリ内のファイルを管理したり、実行することができるソフトのことです。 簡単にいうとGUIの上でCUIの操作をしたいときに使用するアプリケーションのことである。 まるでターミナルから命令が実行されているように思えるが、実際命令を解釈しOSへ伝達する役割はシェルがおこなっている。なので言い方を変えるとGUI上でシェルを呼出しているという解釈でも問題ないだろう。 ターミナルをたちあげるとCUI環境のコマンドやエディタなどが使用可能になる。 Windowsでは同様のものを「コマンドプロンプト」と呼んでいる。
ターミナル・コマンドプロンプトとは何か【Windowsでプログラミングを始める人へ】|メリエの何でもブログ
「コンソール」とは
コンソールとはコンピュータの入出力装置だ。例えば、キーボードやディスプレイなどのセットがコンソールと呼ばれる。 要は、その装置をつかってコンピュータを操作するものである。日本語だと「制御卓」という。 とはいえ、あまり上記の意味でコンソールという言葉は使われなくなっている。 Linuxに限らずだが、現時点で「コンソール」というと一般的に黒い画面でコマンド入力を受け付ける画面を指すことが多い。 ターミナルとコンソールを区別しない人もおそらくいるだろう。現代において使い方は曖昧で、どちらでも意味は通じる。
「コマンドプロンプト」と「Windows Power Shell」の違いとは
パワーシェル(Power Shell)とは、 マイクロソフトが開発した、CUIのシェルのことだ。 コマンドプロンプトをパワーアップしたものの考えてもらえば良い。 コマンドプロンプトと同様にコマンドを実行できたり、スクリプト(拡張子は.ps1)を実行することができる、つまり、コマンドベースでwindowsPCを管理できると言うのが特徴だ。 「パワーシェルのほうがコマンドプロンプトより強力」くらいに覚えておくのが良いかもしれない。 コマンドプロンプトでできることは、パワーシェルでもできる。
Power Shellとは【コマンドプロントとの違い・起動方法など】 | hara-chan.com
PowerShellとコマンドプロンプトの違いを簡単に解説します | MacRuby
「デーモン」とは
DAEMON(デーモン)とは、コンピューターのメモリに常駐し、サーバーのプログラムやシステムの要求に応じて自動的にサービスを提供するバックグランドシステムです。特にUNIX系などのマルチタイプOSのバックグラウンドプロセスとして動作し、httpd や cron など様々なサービスを提供します。 DAEMONの主な働きは、Webサーバ・メール送受信・プリントなどの処理です。
具体的なサービス名を挙げると
タスクスケジューリング系:anacron、crond、atd
データベースサーバ:postgresql、mysql
DAEMON(デーモン)とは? 意味・説明 (IT辞典) | WEPICKS!
「インタプリタ言語」「コンパイラ言語」とは
一言でまとめると インタプリタ言語は、コードを実行する際に1行ずつ機械語に翻訳していく言語です。 コンパイル言語は、まず全てのコードを機械語に翻訳してから一気に実行する言語です。
インタプリタ言語の例……Ruby,Python,Javascript,PHP
コンパイラ言語の例……C言語,Java,C++,C#,Objective-C
インタプリタ言語のメリット
* プログラムをすぐに実行できる
* プログラムのデバッグが行いやすい
インタプリタ言語のデメリット
* 実行速度がコンパイラ型言語と比較すると遅い
「ポインタ変数」とは
メモリ上のアドレスを値として入れられる変数のこと
毎日投稿を辞めます(!???)
始めた当初は一日の終わりになにかブログに書いて寝ようと思ってたんですけどちょっと俺には難しすぎたようです((((
気づきとか発見とか、新しく知ったことがあったら書くブログにしようかなと思います。
改めてよろしくお願いします!!!(は?)