ラァンフォーヱヴアー

出先・常駐先用コマンドリスト。2020年からリモートワークなので常駐なくなったけど。その他思ったことメモ。

Windowsおじさんが今更iOSアプリをつくるまで(Pythonista編)

どうも。ということで先日予告した通り、iOSアプリを作ってみる一連の流れをポストします。

読み物的になるのでコード紹介とか技術的な内容はここには書きません。別立てで書くかもしれません。

なお検証と称して 薄汚い小銭稼ぎ アフィリンクを貼ってみることにしました。

改めてスペックを

  • SIer企業勤務でインフラ系→パッケージ導入中心にTwitterで煽られる側のエンジニアやってます。(XGA+メモリ4GBWindowsでExcel方眼紙使う系)
  • 業務系ではないのでアプリコーディングはほぼ未経験。PL/SQLとかシェルスクリプトくらい。
  • 学生時代の授業や新人研修でC/C++/Java/PHPを触ったことがあるくらい。
  • 今はPython(と後述するReact Native)触ろうとしているところ。

こんな感じでiOSアプリを作ってみようかとしてます。現在進行系なので何回かに分けてポスト予定。

まずは過去編から。

機械学習/Pythonお勉強

時代は機械学習Pythonや!と称して以下を写経。完璧に理解した。

Pythonによるスクレイピング&機械学習 開発テクニック BeautifulSoup,scikit-learn,TensorFlowを使ってみよう

なんか改訂版出てた

練習として過去C言語で書いたコマンドラインツールをPython版にしてみる。

(大したものではないですが、練習の一環として後で公開するかもしれません)

なかなかに楽しい。

Python使いという名のアプリ

iOSPythonができるPythonistaなるアプリがあるらしい。最高か。最高なのか。

なんか作ろう。いわゆる巨人の肩に乗ってみるというやつを体感すべくWeb APIをつつく。

画像認識APIで本のタイトルをメルカリで調べるツール。

GoogleVision APIっていうものの中にOCRができる機能があり、それで本のタイトルを読み取り、メルカリから該当するものの値段を調べる。

cloud.google.com

(ちょっとこれはメルカリの規約上グレーっぽいので公開はしません。)

iOSアプリを作って公開」をすると人間はどうなるのか

続いて本格的に公開するアプリを作るべく、「今いる場所から近くのビジネスホテルを検索するアプリ」をつくる。

Pythonistaはlocationというライブラリを持ってるので便利(ここ伏線)。楽天トラベルのAPIをたたくことで最小限動くアプリはできた。

https://webservice.rakuten.co.jp/api/simplehotelsearch/webservice.rakuten.co.jp

せっかくなのでiOSアプリとしてApp Storeに載せるとこまでやってみたい。

調べてみるとPythonistaを開発した人がPythonistaのソースをそのままiOS化する仕組みを提供していた。全くどこまで最高なのか。

github.com

と、今回はここまで。

次回、PythonistaAppTemplateを動かすところから。続く。

連続更新予告

毎回久しぶり的コメントしてますが、しばらく色々やってました。 というか元号すら変わってました。あけ令和!

ちょっと書くネタが溜まってきたので整理を兼ねてここに予告だけしておきます。

同一クラスのアドレス体系ネットワークからVPNする方法

前フリ

なかなかブログ書く風習が定着しませんが、どうもです。

さてVPN。便利ですよね。私も出先(ネカフェとかコワーキングスペースとか)から自宅にSoftEtherでつないで作業したりします。

ただ時々自宅LANのIPアドレス体系と出先の体系が同じとき、(10.X.X.X、192.168.X.Xとか)VPNって使えなくなるんですよね。 正確には使えるんですが手元側のルーティングテーブルが出先のルータになってしまい、戻りのパケットがうまく返ってこれなくなったりします。

そこで何とかする方法を見つけましたので共有します。 ようは手元端末のルーティングテーブルをVPN先ネットワークだけ高い形に書き換えるってことです。

前提

Windows 10で動作確認してますが、理屈はMacでもLinuxでも同じなので同等のコマンドで動くとおもいます。

結論

以下コマンドを実行(適当に読み替えて)

route add 10.1.1.0 MASK 255.255.255.0 10.1.1.100 metric 25

詳細

まずはアドレス体系違う場合(VPN元ネットワークが192.168系以外の前提は同じ)

以下のように192.168.X.Xと10.X.X.Xがお互い干渉しないので通信に問題はありません。

C:\Users\name>route print
===========================================================================
インターフェイス一覧
(略)
===========================================================================

IPv4 ルート テーブル
===========================================================================
アクティブ ルート:
ネットワーク宛先        ネットマスク          ゲートウェイ       インターフェイス  メトリック
          0.0.0.0          0.0.0.0      192.168.1.1     192.168.1.2   4265
          0.0.0.0          0.0.0.0            リンク上       10.1.1.100     26
     (グローバルIPアドレス)  255.255.255.255      192.168.1.1     192.168.1.2   4266
      10.1.1.100  255.255.255.255            リンク上       10.1.1.100    281
        127.0.0.0        255.0.0.0            リンク上         127.0.0.1   4556
        127.0.0.1  255.255.255.255            リンク上         127.0.0.1   4556
  127.255.255.255  255.255.255.255            リンク上         127.0.0.1   4556
      192.168.1.0    255.255.255.0            リンク上      192.168.1.2   4521
     192.168.1.2  255.255.255.255            リンク上      192.168.1.2   4521
    192.168.1.255  255.255.255.255            リンク上      192.168.1.2   4521
        224.0.0.0        240.0.0.0            リンク上         127.0.0.1   4556
        224.0.0.0        240.0.0.0            リンク上      192.168.1.2   4521
        224.0.0.0        240.0.0.0            リンク上       10.1.1.100     26
  255.255.255.255  255.255.255.255            リンク上         127.0.0.1   4556
  255.255.255.255  255.255.255.255            リンク上      192.168.1.2   4521
  255.255.255.255  255.255.255.255            リンク上       10.1.1.100    281
===========================================================================
固定ルート:
  なし

IPv6 ルート テーブル
===========================================================================
アクティブ ルート:
If メトリック ネットワーク宛先      ゲートウェイ
(略)
===========================================================================
固定ルート:
  なし

C:\Users\name>

問題のアドレス体系同じ場合

以下のようにお互い10.X.X.Xなのでルーティングテーブルが混同します。これはたとえお互いがサブネットを 切っていてもあんまり関係ありません。あくまでIPアドレスが何番ならどこへ飛ぶかだけなので。

C:\Users\name>route print
===========================================================================
インターフェイス一覧
(略)
===========================================================================

IPv4 ルート テーブル
===========================================================================
アクティブ ルート:
ネットワーク宛先        ネットマスク          ゲートウェイ       インターフェイス  メトリック
          0.0.0.0          0.0.0.0   10.128.128.128    10.200.100.1   4265
          0.0.0.0          0.0.0.0            リンク上       10.1.1.100     26
         10.0.0.0        255.0.0.0            リンク上     10.200.100.1   4521
        10.1.1.0    255.255.255.0       10.1.1.100    10.200.100.1   4266
      10.1.1.100  255.255.255.255            リンク上       10.1.1.100    281
    10.200.100.1  255.255.255.255            リンク上     10.200.100.1   4521
   10.255.255.255  255.255.255.255            リンク上     10.200.100.1   4521
        127.0.0.0        255.0.0.0            リンク上         127.0.0.1   4556
        127.0.0.1  255.255.255.255            リンク上         127.0.0.1   4556
  127.255.255.255  255.255.255.255            リンク上         127.0.0.1   4556
    (グローバルIPアドレス)  255.255.255.255   10.128.128.128    10.200.100.1   4266
        224.0.0.0        240.0.0.0            リンク上         127.0.0.1   4556
        224.0.0.0        240.0.0.0            リンク上     10.200.100.1   4521
        224.0.0.0        240.0.0.0            リンク上       10.1.1.100     26
  255.255.255.255  255.255.255.255            リンク上         127.0.0.1   4556
  255.255.255.255  255.255.255.255            リンク上     10.200.100.1   4521
  255.255.255.255  255.255.255.255            リンク上       10.1.1.100    281
===========================================================================
固定ルート:
  なし

IPv6 ルート テーブル
===========================================================================
アクティブ ルート:
(略)
===========================================================================
固定ルート:
  なし


C:\Users\name>route print
===========================================================================
インターフェイス一覧
(略)
===========================================================================

IPv4 ルート テーブル
===========================================================================
アクティブ ルート:
ネットワーク宛先        ネットマスク          ゲートウェイ       インターフェイス  メトリック
          0.0.0.0          0.0.0.0   10.128.128.128    10.200.100.1   4265
          0.0.0.0          0.0.0.0            リンク上       10.1.1.100     26
         10.0.0.0        255.0.0.0            リンク上     10.200.100.1   4521
        10.1.1.0    255.255.255.0       10.14.1.10    10.200.100.1   4290
      10.1.1.100  255.255.255.255            リンク上       10.1.1.100    281
    10.200.100.1  255.255.255.255            リンク上     10.200.100.1   4521
   10.255.255.255  255.255.255.255            リンク上     10.200.100.1   4521
        127.0.0.0        255.0.0.0            リンク上         127.0.0.1   4556
        127.0.0.1  255.255.255.255            リンク上         127.0.0.1   4556
  127.255.255.255  255.255.255.255            リンク上         127.0.0.1   4556
    (グローバルIPアドレス)  255.255.255.255   10.128.128.128    10.200.100.1   4266
        224.0.0.0        240.0.0.0            リンク上         127.0.0.1   4556
        224.0.0.0        240.0.0.0            リンク上     10.200.100.1   4521
        224.0.0.0        240.0.0.0            リンク上       10.1.1.100     26
  255.255.255.255  255.255.255.255            リンク上         127.0.0.1   4556
  255.255.255.255  255.255.255.255            リンク上     10.200.100.1   4521
  255.255.255.255  255.255.255.255            リンク上       10.1.1.100    281
===========================================================================
固定ルート:
  なし

IPv6 ルート テーブル
===========================================================================
アクティブ ルート:
If メトリック ネットワーク宛先      ゲートウェイ
(略)
===========================================================================
固定ルート:
  なし

C:\Users\name>

(ちょっと共有)扉の内側の鍵が空回りする時の対処法

お久しぶりアンド技術全く関係ないですが一瞬焦ったのと、インターネット上に記述なかったので皆様に共有。

皆様の家の内側の鍵、こんな感じになってる方いらっしゃいますでしょうか?

当たり前ですが、鍵を回すと錠がかかりますよね?

ところが、内側の鍵のつまみのところにボタンがあって、押しながら引っ張ると

ちょっと隙間ができます。

こうなると内側の鍵が空回りするようになり、錠がかからない/既にかかってたら外れないようになります。

直し方はこの逆で、ボタン押しながら押し込むとちゃんと使えるようになります。

出がけにいつのまにか空回り状態になっており外出できなくなるところだった…

何とか自力で気付けたけどインターネット上に意外と見つからなかったので共有します。 (検索キーワードが難しいような気がするので、SEOちっくにキーワードを並べておこう)

ドア 扉 鍵 内鍵 内側 空回り 開かない 開けられない かからない 掛からない

何目的の仕組みなんだろう…

WBS(Work Breakdown Structure)必要論、あるいは僕たちはWBSのメンテナンスをしたくないのか

2019年もよろしくお願いします。

この投稿で言いたいこと、オチ

いわゆるSIerのSEがやるプロジェクトにおいて「やること」をどう取り扱えばみんな幸せになれるのか。 僕も知らないので、誰かうまくやっている人は教えてください。 がオチ。

序論

たまにWBSなんて不要だ、タスクリストでいいじゃん的な言説を見かけるが多分それは正しくないと思ってます。 正確には完全ではないと思ってます。この辺を語りたいなと。

まず勘違いしがちなこと

WBS

WBS 成果物 1月 2月 3月 4月 ...
要件定義 要件定義書
基本設計 基本設計書
詳細設計 詳細設計書

ではありません。これはスケジュール表です。 WBSは「Work Breakdown Structure」の略だというのは皆さんご存知かと思いますが、 つまり、タスクよりは大きな単位であるワーク(やらなければならないこと)をブレイクダウンしたものです。 つまり構成がゴールであり、この表でいうと左半分です。

この時点で

WBSは不要だ、タスクリストでいいじゃん」っていうのは少し違うことがわかるかと。 「十分にブレイクダウンされたWBS」と「タスクリスト」は誤解を恐れずいえばある意味同じものです。

違うところはタスクリストは「作った時点で具体的なタスクの一覧であること」であり、 「何のためにそのタスクをやるのか」はふつうは表現しません。 WBSは粒度によってWBS1、WBS2、...等と分解していきますが、WBS1は目的に近い表現になります。

タスクリストにしてはいけない理由

なぜタスクリストは楽(と感じる)のか

比較的小規模でメンバーが多くない(直接マネジメントしてる人の人数が10数人程度?) プロジェクトは個人のタスクリストを突き合わせるやり方がやりやすい。

ただし「個人のタスクリストの突合せ」はN対N通信なので、ある程度の規模になると破たんする。

何が問題なのか

一言でいうと「うまくいってれば問題ないが、うまくいってないときにさばけなくなる」

-プロジェクトメンバー個々人が遅れだしたらどうするのか -遅れが取り戻せる見込みが立つのか -その人がやっているタスクは別の人がやってるタスクに影響しないのか(クリティカルパス) -他メンバーでリカバリできるのか

タスクリストでこのあたりは表現できない。 仮にこの辺を表現したタスクリストはもうWBS/スケジュール表と呼ばれるものになる。

みんながWBSを嫌う理由

なぜメンバーはWBS書きたくないのか

いわば書くことはタスクリストと同じなので問題ないはず。 一番面倒なのは更新しないといけない(スケジュール含め)こと。 そんなことするぐらいなら実作業時間を取りたい。

でどうすればいいのか

わからない。ここ募集中。

この投稿で書けなかったもの

-よく似たものの違い + WBS:一覧、網羅的、全体管理 + タスク:単発的、個々の実用 + 課題管理 + スケジュール + トラブル対応

-スコープ(誰に言うべき課題/問題/トラブルか。隠したい問題と言いたい問題。) + 会社単位 + チーム内 +プロジェクト内 + お客様向け

デッドロックや競合が起きていないか

あとでまとめる

デッドロック

みんな大好きORA-60。

select sid, type, lmode, request, ctime
from v$lock where type in ('TX','TM')
;

ラッチ競合

メモリの中でほんの一瞬下位の内部ロックをかけること。起こると待機状態になる。 ただ起きてたとしてもそれが原因か結果かはわからないこともある。(ラッチが起きたから問題ではなく、問題があるからラッチが起きた)

select ses.sid, ses.serial#, sesw.event, sesw.seconds_in_wait, sesw.state
from v$session ses, v$session_wait sesw
where sesw.event like 'latch%'
and ses.sid = sesw.sid(+)
;

今ちゃんと動いているSQL文の一覧出力

ありがち。「処理が長時間返ってこないけど、ちゃんと動いているの?」に対する回答。 2018/12/24 大幅追記。

今動作中(セッションがACTIVEである)SQL文の一覧

本当はビューを結合するのは保証しないのであんまりよくない。

select ses.sql_id
      ,ses.event
      ,ses.wait_time
      ,sql.cpu_time
      ,sql.first_load_time
      ,sql.last_active_time
      ,sql.sql_fulltext
from v$session ses,v$sql sql
where ses.sql_id = sql.sql_id
and ses.sql_child_number = sql.child_number
and ses.username is not null
and ses.status = 'ACTIVE'
order by sql.cpu_time desc
;

この瞬間に動作しているSQL文の状態(イベント)

select distinct sesw.event, sesw.state, count(*) cnt
from v$session ses, v$session_wait sesw
group by sesw.event, sesw.state
order by sesw.event desc
;

ObjectBrowserの「セッション情報」と同じ情報

ObjectBrowserがない時、コンソールで実行することを前提にしているのでsetもつけてみる。

set linesize 160
set pagesize 1000
col sid                    for 99999
col status                 for a10
col username               for a10
col schemaname             for a10
col osuser                 for a15
col program                for a30
col machine                for a25
col serial#                for 99999

col sql_text               for a15
col sql_text               truncated

select ses.sid
      ,ses.status
      ,ses.username
      ,ses.schemaname
      ,ses.osuser
      ,ses.program
      ,ses.machine
      ,ses.serial#
      ,sql.sql_text
from v$session ses, v$sql sql
where ses.sql_id = sql.sql_id (+)
order by ses.sid
;