プログラミング忘備録と日記と時々育児の話

アジャイルとAIに関心を持っているSE。1児の母。エキスパートというよりはジェネラリスト。

Pythonで文字列の中からIPアドレス抽出

やりたかったこと:GETで取得した結果からIPだけ抜きたい。

これだけの事でしたが思いの外すんなりは上手くいかなかったです。

#IP用の正規表現はこんな感じ
PATTERN =r'[0-9]+(?:\.[0-9]+){3}'

URL = 'https://xxxxxxxx'

#GET
http = urllib3.PoolManager()
r = http.request('GET',url ,fields={'out': 'json'})

#文字列に変換
res = r.data.decode(文字コード)

#パターンマッチ。一致した文字列がリストで帰ってくる。
ipList = re.findall( pattern, res )

#ので、ループして取るとか
for ip in ipList:
    print(ip)

#添字指定して取るとか
print(ipList[0])

丸ごとコピペだと動かないようにしてあるので(import消してあるし)、もしご参考いただく場合は動作確認してくださいね。
こういうちょんプロ作るにはPythonてほんと早くできて便利。

EclipseでPythonのpipインストールをしたい

 

毎っっっっっっっ回忘れてググってるので自分のための覚書です。

 

Eclipseのウィンドウ>設定を選択

f:id:quoquo:20200423172540p:plain


 

PyDev>インタープリター>Python インタープリターを選択。

f:id:quoquo:20200422141722p:plain

 

パッケージタブの「pip でインストール/アンインストール」ボタンクリック。

表示される画面でpipインストールできる。

f:id:quoquo:20200422140939p:plain

今まさにやってるのでスクショが生々しい…

 

※事前にpipのインストールが必要。やり方は後ほど…

.\python.exe .\get-pip.py

get-pip.py

 

f:id:quoquo:20200422151807p:plain

これやってみたくて。

縦軸がコロナウイルスの新規患者数、横軸が日数。



コロナ対策、手洗いの件

コロナ対策には手洗いという流れで、薬用石鹸について調べたことをまとめておく。

※筆者は学生時代化学は苦手だった門外漢のシステム屋だが、その分(?)出典がハッキリ分かる情報から引用するよう心がけた。

 

◼️そもそも薬用石鹸とは

化粧品としての使用目的を併せて有する化粧品類似の剤型の外用剤である。

① 皮膚の清浄・殺菌・消毒。 体臭・汗臭及びにきびを防ぐ。

②皮膚の清浄、にきび・かみそりまけ及び肌あれを 防ぐ。 

簡単に言うと、普通の石鹸になんらかの薬剤を添加した物、となりそうだ。薬事法で定められている。

じゃあ、なんらかの薬剤ってなんなんだということだが、

①には…イソプロピルメチルフェノール、サリチル酸、濃ベンザルコニウム塩化物液50

②には…グリチルリチン酸ジカリウム、グリチルレチン酸ステアリル

 (参考:厚労省「薬用石けんの承認審査に係る留意事項について 」)

ということだそうなので、使いがちな薬用石鹸の有効成分と、その効能についてググってみた。 4/22 売り切れ商品のリンク貼り直し

なお、定義はここでは引用しないが、グラム陽性菌にはブドウ球菌など、グラム陰性菌大腸菌などが分類される。

また、前提条件として「インフルエンザと同じくエンベロープがあるからコロナにもインフルエンザに効くヤツが効くはず」としています。

 

◼️ミューズ

ウイルスについては見た範囲言及なし。ケミカルピーリングや、イボ治療に用いられる成分。

角質溶解作用:細胞間基質を溶解し鱗屑の剥離を促進して角質増殖皮膚を軟化させる作用がある。 防腐作用:微生物(白せん菌類など)に対して抗菌性があり、その防腐力、石炭酸に匹敵する有効成分:サリチル酸 

 ちなみにイボはヒトパピロマウイルスによる皮膚疾患、エンベロープなし。

 

◼️キレイキレイ

有効成分: イソプロピルメチルフェノール

使用濃度においてグラム陽性菌グラム陰性菌結核菌には有効であるが、芽胞(炭疽菌破傷風菌等)及び大部分のウイルスに対する効果は期待できない。

 

◼️ビオレU

 有効成分: イソプロピルメチルフェノール

◼️花王プロ 薬用ハンドソープ

効成分:トリクロサン

↑米国食品医薬品局ではトリクロサン添加の石鹸は販売停止措置がとられておりあんまよくないので候補から外しました
グラム陽性菌グラム陰性菌に有効である。グラム陰性菌に対するよりもグラム陽性菌に対する効力のほうが強い。真菌に対する効果は弱いと考えられ、ウイルスに関するデータは少ない。 

 
その他、抗微生物スペクトルを参照するとフェノールはエンベロープ有ウイルス△になってたり、「薬用せっけんは必ずしもウイルスに効かない」との記述が散見されました。

ウイルス狙い撃ちのハンドソープを簡単に買うのは難しいかな?という印象…

faq.lion.co.jp

……🦁さん……

とはいえ、手洗いの一番の目的は、菌を物理的に取り除くことのはずだ。手に入るもので良いので、普段買う量+気持ち多めに購入し、在庫切れにならないよう準備しようと思う。

子が喘息の傾向があるのでコロナかかったら大事になる予感しかしない。最大限気をつけていきたい。

 

5/31 追記

NITE(製品評価技術基盤機構)がアルコール消毒液に代替するものとして、コロナに効果のある界面活性剤を発表した。

・直鎖アルキルベンゼンスルホン酸ナトリウム(0.1%以上)
・アルキルグリコシド(0.1%以上)
・アルキルアミンオキシド(0.05%以上)
・塩化ベンザルコニウム(0.05%以上)
・塩化ベンゼトニウム(0.05%以上)
・塩化ジアルキルジメチルアンモニウム(0.01%以上)
・ポリオキシエチレンアルキルエーテル(0.2%以上)

塩化ベンザルコニウムや塩化ベンゼトニウムは、時々石鹸やウェットティッシュに含まれているのを見ますね。

 

そもそも、NITE の調査も、

今回の検証は手すり・ドアノブなど身近な物の消毒について、消毒用アルコール以外の選択肢を示すために実施されました 

とのことなので、手指は何で消毒するの?という疑問は残る。手洗いしろ、につきるんだろうか。


また、「次亜塩素酸水」については、有効かどうかの結果は出ていないとのことなので、引き続き実験結果の発表を待ちたい。

 

 

参考文献

・健栄製薬 消毒剤の基礎

https://www.kenei-pharm.com/medical/countermeasure/base/05.php

・第5回 厚生科学審議会 医薬品販売制度改正検討部会 https://www.mhlw.go.jp/shingi/2005/01/s0117-9d35.html

・Y’s Square
http://www.yoshida-pharm.com/2012/text05_04_03/

・白石 正,知っておきたい消毒薬の知識,日本内科学会雑誌 第99巻 第 8 号

新型コロナウイルスに有効な界面活性剤を公表します(第2弾)~物品への消毒方法の選択肢がさらに広がります~

https://www.nite.go.jp/information/osirase20200529.html

新型コロナウイルスに有効な界面活性剤が含まれている製品リスト

https://www.nite.go.jp/data/000109483.pdf

・一般社団法人 公衆衛生地域振興協会が株式会社食環境衛生研究所に委嘱し「次亜塩素酸水での、新型コロナウイルスに対する不活化検証」を実施!

https://prtimes.jp/main/html/rd/amp/p/000000002.000061987.html?__twitter_impression=true

コロナパニック対策の件

コロナウイルスでどこもパニックになっている。
2月3週目にはコンビニでも余裕で買えていたマスクが消え去り、消毒用アルコールもすぐ売り切れに。
幸い、マスクもエタノールも買い置きがあるので当面困らないが(去年インフルエンザかかった時の残り物)、これから先どうなるのだろうと思うと、思わずダイソーで売れ残っているウェットティッシュの成分とか確認してしまう。エタノール含んでいるものはとりあえず購入してしまった、、笑

 コロナウイルス対策について、CDC(アメリカ疾病予防管理センター)のツイートが流れてきたので、厚労省との比較のためにも読んでみた。(訳:私)

・病気の人との密接な接触を避ける。
・目、鼻、口に触れない。
・病気のときは家から出ない。
・咳やくしゃみはティッシュで覆い、ティッシュはゴミ箱へ。
・頻繁に触れる物や場所は、通常の家庭用クリーニングスプレーや雑巾を使用して清掃および消毒する。
・CDCは、コロナからの予防としてマスクを着用することは非推奨。コロナの症状がある人はマスクを使用して、他人への病気の拡散を防ぐこと。
・石鹸と水で20秒以上、手をよく洗う。特に、トイレ後、食前、鼻をかんだり咳をしたりくしゃみをした後。
・石鹸と水がすぐに手に入らない場合は、少なくとも60%のアルコールを含むアルコールベースの手指消毒剤を使用する。
・手が目に見えて汚れている場合は、必ず石鹸と水で手を洗う。 

厚労省と大同小異な感じ。
頑張ってマスク探してるけれど、あんまり意味がなさそうだ。来週から供給復活するというニュースもあるが、それより手ピカジェルを急いで欲しいくらい。
それから、手洗いが1番の対策というのが盛んに言われた始めたので、手洗い用の消毒や殺菌効果の高いハンドソープ類、今度はこれらが品薄になるかもしれない。今日はまだ大丈夫だったが。

  

SARSの時の感染症情報センターの情報を参考にすると、コロナを滅するにはやはり次亜塩素酸Naと消毒用エタノールということになりそう。

コロナウイルスに対する消毒剤の適用(例)http://idsc.nih.go.jp/disease/sars/desinfect04a.html

手洗い石鹸は、薬用や除菌を謳っていても、ウイルスに直接効くものは少ない。
とはいえ、物理的に除菌するのが何よりの対策ということだから、とにかく手洗いだ。
(余談だが、虫歯菌も殺菌はできないので、ブラッシングで物理的に落とさなくてはいけない)
洗濯洗剤と風呂用は業務用買っているからたんまりあるけど、手洗い石鹸は都度購入だから、この気に業務用に切り替えも検討せねば。

手洗い回数が増えると途端に手荒れするのでユースキンSも買い足さねば。
これ、コロナで意外と経済回るのでは…いや回らないか…。

職場を見回すと、先週からすでに、中国からのサプライが止まっていて困る場面が出てきていた。PCのパーツとかそういうの。
BtoBだけでなく、カスタマー向けも週明けから供給が滞るかもしれない。
安易な不安感にあおられたくはないが、現実的に考えて、中国製の日用品は気持ち買い溜めしておいたほうが安心かもしれない。

 

うちの子は喘息気味でちょくちょく吸引に通っている。最近は丈夫になってきたとはいえ、コロナにかかると大事になる予感しかしない。

子持ちの親としても、会社員としても、家庭にも職場にもコロナ持ち込みたくなさ過ぎて必死です。

 

[JavaScript]Chart.jsでシンプル折れ線グラフ

こちらが本丸。折れ線グラフを表示したくていろいろライブラリを探していました。
一番オシャレで簡単そうかな?ということでChart.js。
デフォルトだと折れ線から下が塗りつぶされてしまうのと、ベジエされちゃうので、
線だけのシンプルなグラフにするのに結構苦戦しました。あとVer1とVer2で結構実装違っていてびっくり。
データは適当です。

お手軽簡単にレスポンシブ対応のグラフが描けてよいですね。
data書き換えたらリアルタイム表示とかできるかな。
k-u-n.github.io


こんなのです。

分かりづらいオプションのところ、ソース中にコメントも書きましたが抜粋。
backgroundColor  線より下部分の色・透明度。RGBの他、カラーコード、色名でも可
borderColor 線の色
pointBackgroundColor 点の色
pointBorderColor  点の縁の線の色
pointHoverBackgroundColor  マウスオーバー時値の点を塗りつぶす色
pointHoverBorderColor  マウスオーバー時値の点の枠線を塗りつぶす色
RBG指定の時は透明度も設定できます。

<body>
  <h1>グラフサンプル</h1>

  <!--グラフ描画領域-->
  <div style="width: 80%; float: center">
    <canvas id="line"></canvas>
  </div>


  <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.9.3/Chart.min.js"></script>
  <script>
  var lineChartData = {
    labels : ["1","2","3","4","5","6", "7", "8", "9", "10", "11", "12", "13", "14" ,"15"], /*X軸のラベル*/
    datasets : [      {
        label: "系列1",
        backgroundColor :"rgba(255,255,255,0.0)", /*線より下部分の色・透明度。RGBの他、カラーコード、色名でも可*/
        borderColor :"rgba(245,177,46,0.8)", /*線の色・透明度*/
        pointBackgroundColor :"rgba(245,177,46,0.8)", /*点の色・透明度*/
        pointBorderColor :"rgba(245,177,46,0.6)", /*点の線の色*/
        pointHoverBackgroundColor : "white", /*マウスオーバー時値の点を塗りつぶす色*/
        pointHoverBorderColor :"rgba(245,177,46,0.6)", /*マウスオーバー時値の点の枠線を塗りつぶす色*/
      lineTension: 0, /*折れ線グラフの時は0に設定必須。でないと曲線になってしまう。*/
        data : [0.76, 0.56, 0.56, 0.54, 0.55, 0.553, 0.799, 0.4805, 0.6341, 0.4420, 0.300112, 0.203233, "0.13", "0.14" ,"0.13"]
      },
      {
        label: "系列2",
        backgroundColor :"rgba(255,255,255,0.0)",
        borderColor :"rgba(25,0,179,0.8)",
        pointBackgroundColor :"rgba(25,0,179,0.8)",
        pointBorderColor :"rgba(25,0,179,0.6)",
        pointHoverBackgroundColor : "white",
        pointHoverBorderColor :"rgba(25,0,179,0.6)",
      lineTension: 0,
        data : [0.77, 0.66, 0.64, 0.64, 0.65, 0.53, 0.599, 0.54805, 0.56341, 0.54420, 0.52300112, 0.5103233, "0.43", "0.314" ,"0.315" ]
      },
      {
        label: "系列3",
        backgroundColor :"rgba(255,255,255,0.0)",
        borderColor :"rgba(173,21,0,0.8)",
        pointBackgroundColor :"rgba(173,21,0,0.8)",
        pointBorderColor : "rgba(173,21,0,0.8)",
        pointHoverBackgroundColor : "white",
        pointHoverBorderColor :"rgba(173,21,0,0.6)",
      lineTension: 0,
        data : [0.87, 0.86, 0.74, 0.74, 0.75, 0.63, 0.699, 0.64805, 0.66341, 0.4820, 0.42300112, 0.3103233, "0.33", "0.214" ,"0.215" ]
      }
    ]

  }

  window.onload = function(){
  var ctx = document.getElementById("line").getContext("2d");
var myLineChart = new Chart(ctx, {
    type: 'line',
    data: lineChartData,
       responsive: true,
            scaleOverride: true, //メモリ関連の上書き。trueじゃないとメモリの設定ができない。
            scaleFontSize: 15,
            scaleStepWidth: 0.5, //刻み幅
            scaleSteps: 2 //刻み幅を何回繰り返すか。scaleStepWidth×scaleSteps=縦軸のMAX値。
});
}
  </script>
</body>

[HTML+CSS]listを疑似要素::beforeで凡例風に

たまに触ると楽しいHTML+CSS
webブラウザでグラフとか表示したいなーと思い、今日は凡例を作りたくていろいろためしておりました。

listの::beforeで出来るみたい。 

<style>
	/*リスト本体の設定*/
	li {
		list-style-type: none;
		margin: 2px;
		padding: 0.5em 0.5em 0.5em 0.5em;
		background: white;
		border-color: black;
		border-style: none none dotted none;
		width: 300px;
	}

	/*リストの各要素に前要素として■を付ける*/
	li:before {
		content: "";
		display: inline-block;
		height: 15px;
		width: 15px;
		margin-right: 5px;
	}

	/*リストの各要素の前要素のデザインを設定*/
	li.series1:before {
		background: rgba(245,177,46,0.8);
		border-radius:10;
	}
	li.series2:before {
		background: rgba(25,0,179,0.8);
		border-radius:10;
	}
	li.series3:before {
		background: rgba(173,21,0,0.8);
		border-radius:10;
	}

	li.series4:before {
		background: #9696D5;
		border-radius:2;
	}
	li.series5:before {
		background: #DA2550;
		border-radius:2;
	}
	li.series6:before {
		background: #341F47;
		border-radius:2;
	}
</style>
<body>
	<h1>リストサンプル</h1>
	<div>
		<ul>
			<li class="series1">系列1</li>
			<li class="series2">系列2</li>
			<li class="series3">系列3</li>
		</ul>
		<ul>
			<li class="series4">系列4</li>
			<li class="series5">系列5</li>
			<li class="series6">系列6</li>
		</ul>
	</div>
</body>

 

 そうしてできたのがこちら。色のチョイスのセンスがない…
f:id:quoquo:20200131222902p:plain

[AI]国産AIライブラリChainerの開発終了

株式会社Preferred Networks(以下、PFN社)が開発しているChainerのメジャーアップデートを終了すると発表してから1月ほど経ちますが、

影響が出始めているのを感じています。

https://preferred.jp/ja/news/pr20191205/

 

Chainerは純国産のディープラーニング(以下DL)ライブラリとして存在感があった印象ですが、
一言で言うと海外製DLライブラリに負けちゃったんですね…
GitみるとChainerはほとんど日本人にしか使われていない様子なので、広がりがなかったといいますか。
PFN社は今後PyTorchにシフトするらしいです。(PyTorchの概要は下記が詳しい、シェアのグラフもわかりやすい) 
Chainerが後発のPyTorchに追い付かれているのが切ない…。
https://www.codexa.net/pytorch-python/

 

日本はAI後進国と言われつつも、
AIが「ものづくり」と合体することでキャッチアップできると期待されてきました。
経産省がIoT・AIという一見なんの関係もなさそうな分野を常に一緒に記載しているところに
それが現れていると感じます。

ただ、国内の工場やらなんやらにTensorFlow(Google謹製)、あるいはPyTorch(Facebook謹製)のライブラリのAIを搭載したセンサーがバシバシ埋め込まれたら、
それらの海外製ライブラリが「商用利用は有償化します!」ってなったときにお終いですよね…。

歴史的にRHLとか最近だとJavaとかいろんな製品で起こってきたケースです。

日本の「AI×ものづくり」で獲得しようとしているアドバンテージが一気に危ぶまれるようになったと感じます。

そうなったときに、現在から自社でライブラリ開発してIoT機器とコラボさせてるところが強そうですね。

お手軽にDLを始められるライブラリは様々ありますが、
そもそもDLとは?機械学習とは?という基礎部分を理解しておくのが今後誰にも必要になるだろうなと改めて感じた次第であります。

 

「夢の跡」としては、

PFN社の機械学習向けハイパーパラメータ自動最適化フレームワークOptuna(オプチュナ)が公開されたので、

今度使ってみたいなーと思っています。

手動だとめんどくさいところですしね。

[Java]標準 vs OpenJDK(Amazon Corretto)

OracleJDKを有料化することになってわたわたしたのも「とりあえずCorrettoが使えそうだ」ということで落ち着いた感があります。

が、今日急に「実行速度に差とかないの…?」と不安になって来たので試してみました。

<s>これくらいもうだれかやってるんじゃ</s>

 

 まずこれと

 long start = System.currentTimeMillis(); long start = System.currentTimeMillis();
int test = 0; for (int i = 0; i < 50000; i++) { System.out.println(test++); }
long end = System.currentTimeMillis(); System.out.print("Corretto time:" + (end - start) / 1000 + "秒");

 これを、用意します。

 long start = System.currentTimeMillis(); long start = System.currentTimeMillis();
int test = 0; for (int i = 0; i < 50000; i++) { System.out.println(test++); }
long end = System.currentTimeMillis(); System.out.print("Stand\'d time:" + (end - start) / 1000 + "秒");

 違うのは最後の出力だけ。別々のPJ(「StanddSandBox」と「correttoSandBox」)のメインメソッドにペタリ。

 

それぞれのPJを、

f:id:quoquo:20191102201347p:plain

標準VIの実行構成

f:id:quoquo:20191102201551p:plain

Corretto使用の実行構成

こんな感じで実行構成を設定して、RUN!

~~結果~~

f:id:quoquo:20191102201639p:plain

f:id:quoquo:20191102201639p:plain

f:id:quoquo:20191102201721p:plain

なんかCorrettoの方が若干遅いような………

ループの回数を増やして再検証が必要そうです。

 

-----

100,000回でやってみた

f:id:quoquo:20191102203145p:plain

f:id:quoquo:20191102203211p:plain

………。

ちりつもで遅くなったらやだな………。

[Java]FTP接続

前に試作したFTPのクラス。
そのままコピペして動く!というようにはしてませんが
(import文とかセッターゲッターは省略してますし、呼び出し元は載せてません)
FTPでのやり方です。FTPSの場合はクラスをFTPSClientに変更してくださ~い

public class FTPsample {
	/** ユーザ名 */
	private String user;
	/** パスワード */
	private String pass;
	/** サーバー名 */
	private String server;
	/** サーバー側ディレクトリ*/
	private String serverDir;
	/** サーバー側ファイル名 */
	private String serverFileName;
	/** ローカルディレクトリ*/
	private String localDir;
	/** ローカルファイル名*/
	private String localFileName;

	/**
	 * FTPサーバーに接続
	 * 
	 * @return FTPClientオブジェクト
	 * @throws IOException
	 */
	public FTPClient connect() throws IOException {
		FTPClient ftpClient = new FTPClient();
		ftpClient.connect(server);
		ftpClient.enterLocalPassiveMode();
		
		// お好みのミリセカンドでタイムアウトを設定
		// int ms = 300000;
		ftpClient.setSoTimeout(ms);

		// ログイン
		//TODO:ログイン失敗したときの処理も入れてね
		ftpClient.login(user, pass);
		System.out.println(server + "に接続しました");

		//接続をパッシブモードに
		ftpClient.enterLocalPassiveMode();
		//もしアクティブモードで接続したい場合はこう frpClient.enterLocalActiveMode(); 

		//ディレクトリの移動
		//TODO:フォルダなかったときの処理も入れてね
		ftpClient.changeWorkingDirectory(serverDir);
		System.out.println(serverDir + "に移動しました");

		// バイナリモードで転送処理を行う設定
		if (!ftpClient.setFileType(FTP.BINARY_FILE_TYPE)) {
			throw new RuntimeException("[Error]setFileType failure");
		}
		System.out.println("ファイルタイプをバイナリに設定しました");

		return ftpClient;
	}

	/**
	 * ファイルをダウンロード
	 *
	 * @param FTPクライアントのインスタンス
	 * @return 取得したFileを表すFileオブジェクト
	 */
	public File download(FTPClient ftpClient) throws IOException {

		// 保存先とファイル名を設定
		File saveFile = new File(localDir + File.separator + localFileName);

		// お好みのミリセカンドでタイムアウトを設定
		// int ms = 600000;
		// ftpClient.setDataTimeout(ms);

		// ファイル取得
		// TODO:取得失敗したときのry
		ftpClient.retrieveFile(serverFileName, os);
		return saveFile;

	}

	/**
	 * ファイルをアップロード
	 * 
	 * @return ローカルファイルのFileオブジェクト
	 */
	public File upload(FTPClient ftpClient, File file) throws IOException {

		InputStream inputStream = new FileInputStream(file)) {
				//ファイル送信
				// TODO:送信失敗したときのry
				ftpsClient.storeFile(file.getName(), inputStream);
		}
	}

	/**
	 * FTP接続を閉じる
	 */
	public File close(FTPClient ftpClient) throws IOException {
		if (ftpsClient != null && ftpsClient.isConnected()) {
			ftpsClient.logout();
			ftpsClient.disconnect();
		}
	}
}

}

[AI]JDLA合格者の会行ってきた

実は2019年春の「JDLA Deep Learning for GENERAL 2019 #1」,通称G検定に合格しております。 

会社命令でわりとサクッととりました。

 

そんなわけで今日はJDLA合格者の会@防砂会館でした。

自腹で行きましたよ!(会社費用で行くとレポート書けとか言われそうだから…)

 

感想は

 

会 場 暑 っ つ!!!!

 

広い宴会場とはいえ750名という大人数だからか全く冷房を感じない暑さ…

 

E検定まで取ってバリバリディープラーニング!な人、ノンプログラマだけどディープラーニングやりたいからG検取りました!な人、会計事務所、教育関係、報道関係、などなどいろんなバックボーンの方がいらっしゃいました。

わりと大企業所属の方が多かったかも…?笑

参加目的が「どんな人がこれ受けたんだ? 受験者の顔が見てみたい」という純度の高い好奇心だったんですがその点はめっちゃ満たされました。

f:id:quoquo:20190702223855j:image

ライトニングトークのコーナーを眺めてて、決してディープラーニング屋さんではない企業の方が、有志で、周りを巻き込んでAIを使ってっているなーというのが印象的でした。

豚の体重測るとか、大学生の退学予兆とか。ごめんなさい退学予兆ってワードはちょっとウケてしまった。笑

ディープラーニングが良い意味で大衆化していってる時代の隅っこでいろいろ見れてラッキーだなーと思っています。

私はスタンスとして、技術はそこそこ好き・マネージメントはまあまあ興味ある・ビジネス考えるのとっても楽しい!なので、付いていけない部分もありつつ、振り落とされない程度にひっついて行きたいものです。

 

あとあと、経産省の伊藤氏が挨拶で「AI人材を育てるということは、日本の教育を変えるということ」と述べられていて、一児の母兼技術者の端くれとしては、気が引き締まる思いでありました。

まとまった時間があったら子供向けのAIの絵本書きたいんだよなぁ。

f:id:quoquo:20190702223944j:image

 

いろいろあったけど正直暑くてよく覚えていない…

あ、ご飯美味しかったです。

Javaは習えどJavaのオブジェクト指向コンセプトは習わず

今年も弊社新人さんたちがJavaに四苦八苦する季節になりました。

新人研修ってJavaでやる場合多いよね。

それとも今時のベンチャーとかだとPythonだったりするんでしょうか。
(余談ですが、先日渋谷のベンチャーに仕事で行く機会があったのですが、絵に描いたようなベンチャー企業でウェーイな感じでビビりました…というかそもそも渋谷が怖かった…)

 

弊社新人さんに聞いてみると、UMLは習ってないとのことだったので、多分私と似たような、ロジックを書くことに慣れる新人研修をやってるんじゃないかなという感じ。

配属後、必ずしもJavaやその他のオブジェクト指向言語をやるとは限らないので(私もせっかくJava習ったのにVB.NETばっかりで仕事してた)、時間に制約のある新人研修においてはオブジェクト指向コンセプトまでツッコンでやらなくていいとは思うのですが、とはいえモデリングも含めて勉強しとくと後々便利だよ〜〜と思っています。

かくいう私も新人研修でJavaをやった口です。
オブジェクト指向言語という触れ込みで習いはするものの、やはり最初に習得すべきfor文とかif文とかが先に来て、「Javaオブジェクト指向コンセプト」というところについては殆どやらなかった記憶があります。

それでもやもやして本を買ったりしつつこの年になってようやく分かってきたかなあという感じがします。

「そもそもなぜオブジェクト指向で開発するのか」という視点が新人の頃って全然ないし、触れることもなかったんですよね。私も歴史に詳しいわけではないのでザックリとした言葉で書くと、オブジェクト指向を選択する理由って「これまで機械視点だったのが人間視点でプログラムを考えられる」というところで、今まで理系メインだったシステム開発のお仕事に、文系も関われるようになって間口が広がった、いろんなバックボーンを持ったり役割である人が、いろんなフェーズにおいて、同じ用語で1つのシステム作りを行えるようになったということ、という理解でいます。

再利用性が高いとか保守性が高いとかは、実はオマケみたいなものなのかなと思いつつ、新人さん達を眺めるのでした。

postgresの再インストール時は一旦アカウント削除する

もらったPCのアカウントにすでにpostgres入っていたのでそのまま使ったれ~~と思っていたけど、パスワードが分かんなかった…
ローカルからの接続をtrustにするとかごちゃごちゃやってもなんかダメだったからサクっと再インストールすることに。

 

postgresのアカウントをPCから削除
 →残っているアカウントがあると、それを使おうとしてパスワード不一致のエラーとなる。ので、アカウントを削除する。
  コマンドプロンプトをAdministratorで立ち上げて以下のコマンドを実行
  net user postgres /delete


Cortanaでcmdって入れShif+Ctrl+Enterすると、アドミン権限で立ち上げてくれるの知らなった。便利!

Javaでフォルダ内のファイルごとフォルダ削除したい場合はdeleteDirectoryが便利

File.deleteは中身があるとFalseが返ってきてしれっと終わるから…

なのですが、org.apache.commonsにいると思ったらいなかった。
Tomcat7ではdeleteDirectoryはutil.http.fileuploadにいた。。。

ので、こいつをimportしておく↓
org.apache.tomcat.util.http.fileupload.FileUtils

ディレクトリ削除系のメソッドはこんな感じに

// 例えばこんなフォルダがあるとして
String path = System.getProperty("user.dir") + File.separator + "tmp";
File dir = new File(path);
dir.mkdir;

// こんなファイルを作るとして
File newfile = new File(path + "¥¥newfile.txt");
newfile.createNewFile();

// FileUtilsならファイルごとフォルダ削除可能
FileUtils.deleteDirectory(dir);

// フォルダ内のファイルを全部削除(フォルダは残す)のも一発
// deleteDirectoryは↓をしてからFileクラスのdeleteをしている
FileUtils.cleanDirectory(dir);

// 指定されたパスのものを削除する。パスがフォルダだったら中身ごと(サブディレクトリも)削除する。
// Boolean型で成否を返すFile.delete()と違い、削除できなかった場合は例外が発生する
FileUtils.forceDelete(dir);

一定期間でフォルダごと消す系の処理(なんかのログフォルダとか、前回実行時のバックアップ消すみたいなの)に便利!

プログラマの美徳だけでは未来にススメない

「ベテラン技術者Aさんに中堅技術者Bさんを付けて作業してもらいましたがPMの意図するような情報伝搬は起きませんでした。なぜでしょう? みんなで原因を考えよう!」に対して。
私頭御花畑なので、「2人ともシャイで人見知りだった…?」なんて思ったのですが、大半の意見は「Aさんが自分の技術を出し惜しみした(自分の仕事が取られると思った)」だったので「えぇ…」ってなりました。
でもあるあるだそうで。幸い私は先輩たちからあれこれ教えてもらった経験ばかりなのでピンと来ない…いや、出し惜しみされてたのに気づかなかっただけかもしれませんが…。

 

そんな話をしていて、なんとなく思い出したのが、Perl作った人が言ったらしいプログラマの美徳。なんかふと思い立って原文を読んでみました。

原文こちら https://www.perl.com/pub/1998/08/show/onion.html
以下は抄訳。

プログラマの美徳は怠惰・せっかち・傲慢(=情熱の美徳)
コミュニティの美徳は勤勉・忍耐・謙虚
正反対に見えるこれらのことは実は正反対というわけでもないのです。なぜなら全部同時に実行することができるからです。

これらの美徳は、放棄しなければ、私たちを未来へと運んでくれるでしょう。

プログラマの美徳の方ばかりが一人歩きしている感ありますが、どっちも必要だよってのがPerl作った人の言ってることですね。

BOM付UTF-8のCSVをCakeで

お盆前にリリースが重なったりでバタバタしました。

お盆は実家&義実家にトータル1週間帰省。
プールしたり、海に行ったり、近所の池に亀(大好き)を見にいったりと楽しく過ごした赤子、休み明けの現在見事に保育園登園拒否になりましたorz

 

*


PHPとのお付き合い4か月目。ちょっとお友達になれてきた今日この頃です。
先日、cakephpでBOM付UTF-8CSV吐くという処理を書きました。
初歩的なことなんですが「fgetcsvのサンプルならたくさん見つかるのに…」ってなったのでメモ。

cakephpのFile ユーティリティクラスでBOM付UTF-8

//ファイルのインスタンス生成
$file = new File(<ファイルパス>);

//ファイルを作成
$file->create();

//BOM文字をパッキングして出力
$bom=pack('C*',0xEF,0xBB,0xBF);
$file->append($bom);
$file->append(<出力する文字列>);

//必要に応じてUTF-8に文字列を変換したり
$file->append(mb_convert_encoding(<出力する文字列>, "UTF-8", <変換前の文字コード>));

 

 

Excelで開いたときに「001」とかが「1」になっちゃうのの対策とExcel上の表示★

  • 囲み文字を"から'に変更→'001'
  • タブ文字を追加→001 (テキストエディタ上では001<tab文字>)
  • タブ区切り、UTF-16LE BOM付きで出力して拡張子はcsvに偽装(ただしあくまで偽装。厳密にはTSV)

 

新人さん「BOMってなんですか」

私「バイトオーダー…なんだっけド忘れした…」 ※マーク